Scanner - geht es noch einfacher?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Donnerstag 19. Februar 2009, 14:31

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
Antworten