diff --git a/src/sgfParser/propValues.py b/src/sgfParser/propValues.py --- a/src/sgfParser/propValues.py +++ b/src/sgfParser/propValues.py @@ -3,6 +3,12 @@ import re from . import ParserError, skipWhitespace +class Regexp: + number=re.compile(r"(\+|-|)\d+") + real=re.compile(r"(\+|-|)\d+(\.\d+)?") + point=re.compile(r"[a-zA-Z]{2}|") + + class Composed: def __init__(self,a=None,b=None): self.a=a @@ -89,34 +95,31 @@ def compose(vTypeA,vTypeB): def number(s,start): - r=re.compile(r"(\+|-|)\d+") - m=r.match(s,start) - if m is None: raise ParserError("expected a number matching '(\+|-|)\d+'",s,start) + m=Regexp.number.match(s,start) + if m is None: raise ParserError("expected a number matching '{0}'".format(Regexp.number.pattern),s,start) res=int(m.group(0)) return (m.end(),res) def real(s,start): - r=re.compile(r"(\+|-|)\d+(\.\d+)?") - m=r.match(s,start) - if m is None: raise ParserError("expected a real number matching '(\+|-|)\d+(\.\d+)?'",s,start) + m=Regexp.real.match(s,start) + if m is None: raise ParserError("expected a real number matching '{0}'".format(Regexp.real.pattern),s,start) res=float(m.group(0)) return (m.end(),res) def double(s,start): - r=re.compile(r"1|2") - m=r.match(s,start) - if m is None: raise ParserError("expected a double value, either '1' or '2'",s,start) - res=int(m.group(0)) - return (m.end(),res) + c=s[start] + if c not in ("1", "2"): + raise ParserError("expected a double value, either '1' or '2'",s,start) + return (start+1,c) def color(s,start): - r=re.compile(r"B|W") - m=r.match(s,start) - if m is None: raise ParserError("expected a color value, either 'B' or 'W'",s,start) - return (m.end(),m.group(0)) + c=s[start] + if c not in ("B", "W"): + raise ParserError("expected a color value, either 'B' or 'W'",s,start) + return (start+1,c) def text(simple=True,composed=False): @@ -159,9 +162,8 @@ def anything(s,start): # go specific def point(s,start): - r=re.compile(r"[a-zA-Z]{2}|") # !! limit to board size - m=r.match(s,start) - if m is None: raise ParserError("expected a point value matching '[a-zA-Z]{2}|'",s,start) + m=Regexp.point.match(s,start) # !! limit to board size + if m is None: raise ParserError("expected a point value matching '{0}'".format(Regexp.point.pattern),s,start) if m.group(0)=="": # pass, !! tt return (m.end(),tuple()) col=m.group(0)[0]