Changeset - 70d01e8dc839
[Not reviewed]
default
0 1 0
Laman - 8 years ago 2017-01-29 22:11:59

a little refactoring and optimization of parser's regular expressions
1 file changed with 20 insertions and 18 deletions:
0 comments (0 inline, 0 general)
src/sgfParser/propValues.py
Show inline comments
 
@@ -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]
0 comments (0 inline, 0 general)