Seite 1 von 1

Scanner - geht es noch einfacher?

Verfasst: Donnerstag 19. Februar 2009, 14:31
von sma
Dies ist ein kleiner Scanner, der Zahlen, Zeichenketten, Namen, Operatoren und ein paar syntaktische Zeichen erkennen kann. Lässt sich das irgendwie eleganter und noch kürzer implementieren?

Code: Alles auswählen

def Scanner(s):
    for m in re.finditer(r"(\d+)|'((?:\\.|[^'])+)'|(\w+:?)|([-+*/=<>~]+)|([()|:.])|\s+", s):
        if m.lastindex:
            t = m.group(m.lastindex)
            if m.lastindex == 1:
                yield 1, int(t)
            elif m.lastindex == 2:
                yield 2, t.decode("string_escape")
            elif m.lastindex == 3:
                yield 3 if t[-1] != ':' else 5, t
            elif m.lastindex == 4:
                yield 4, t
            elif m.lastindex == 5:
                yield "()|:.".find(t) + 6, t
Ich nutze aus, dass `lastindex` die Nummer der erkannten Gruppe enthält und benutze eine krude Integer-Kodierung für meine Tokentypen. Die Fallunterscheidung mit dem ":" am Ende müsste nicht sein, doch der Optimierer in mir wollte das Backtracking im regulären Ausdruck vermeiden.

Stefan