76 lines
1.8 KiB
Python
76 lines
1.8 KiB
Python
import lex
|
|
|
|
class Rule(object):
|
|
def __init__(self, *rules):
|
|
self.rules = rules
|
|
def match(self, tokens):
|
|
raise Exception("unimplemented")
|
|
|
|
class Match(Rule):
|
|
method = lex.Token.match
|
|
def __init__(self, *args):
|
|
self.args = args
|
|
def match(self, tokens):
|
|
if not tokens:
|
|
return False
|
|
elif method(tokens[0], *self.args):
|
|
tokens.pop(0)
|
|
return True
|
|
else:
|
|
return False
|
|
class Matchs(Match):
|
|
method = lex.Token.matchs
|
|
class Matchp(Match):
|
|
method = lex.Token.matchp
|
|
|
|
class Fqmatch(Match):
|
|
method = lex.Token.fqmatch
|
|
class Fqmatchs(Match):
|
|
method = lex.Token.fqmatchs
|
|
class Fqmatchp(Match):
|
|
method = lex.Token.fqmatchp
|
|
|
|
class And(Rule):
|
|
def match(self, tokens):
|
|
for r in self.rules:
|
|
if not r.match(tokens):
|
|
return False
|
|
return True
|
|
class Or(Rule):
|
|
def match(self, tokens):
|
|
for r in self.rules:
|
|
if r.match(tokens):
|
|
return True
|
|
return False
|
|
|
|
class Repeat(Rule):
|
|
def __init__(self, rule, minimum, maximum):
|
|
self.rule = rule
|
|
self.minimum = minimum
|
|
self.maximum = maximum
|
|
def match(self, tokens):
|
|
for i in range(0, self.minimum):
|
|
if not self.rule.match(tokens):
|
|
return False
|
|
while self.rules.match(tokens):
|
|
pass
|
|
return True
|
|
self.rule.match(tokens)
|
|
return True
|
|
|
|
class Star(Rule):
|
|
def __init__(self, rule):
|
|
self.rule = rule
|
|
def match(self, tokens):
|
|
if not self.rule.match(tokens):
|
|
return False
|
|
while self.rules.match(tokens):
|
|
pass
|
|
return True
|
|
class End(Rule):
|
|
def __init__(self):
|
|
pass
|
|
def match(self, tokens):
|
|
return not tokens
|
|
|