Code: Alles auswählen
class Scanner(object):
def __init__(self, *rules):
self.rules = rules
self.re = re.compile("|".join("(" + r[0] + ")" for r in rules))
def scan(self, s):
for m in self.re.finditer(s):
try:
rule = self.rules[m.lastindex - 1]
except IndexError:
yield 'ERROR', s[m.start():]
break
value = m.group()
token = rule[1] if len(rule) > 1 else value
if len(rule) > 2:
value = rule[2](value)
if token != 'IGNORE':
yield token, value
yield 'END', ''
Code: Alles auswählen
for t in Scanner(
(r'[()]',),
(r'\d+(?![^()\s])', 'int', int),
(r'[^()\s]+', 'sym',),
(r'\s+', 'IGNORE')
).scan("(a 1+ (c? 3))"):
print t