Positionsabhängiges Tokenizing mit flex?



  • wie programmiert man flex, wenn für Strings der gleichen Form je nach Position verschiedene Tokens erzeugt werden sollen?

    Beispiel

    TYPANGABE    VARIABLENNAME    COLONEQUAL  INIT    SEMICOLON
     string     klappstuhlfarbe      :=     "lila"      ;
    

    wie erreiche ich, daß flex für den ersten String das Token TYPANGABE liefert, für den zweiten String aber VARIABLENNAME, wenn die zulässigen Mengen für die beiden Strings eine große Schnittmenge haben? (mit positionsabhängigen Flags möchte ich nicht hantieren)



  • das grundsätzliche Problem hierbei ist ja:

    Eine Typsignatur/ein Typname kann in den gleichen regulären Mengen enthalten sein wie ein Variablenname. "void ()(int**, (double))" natürlich nicht, aber zum Bsp "foo".

    Wenn der Parser nun ein Token anfordert, und die Rückgabe ist "foo", kann der Tokenizer so ohne Weiteres kaum wissen, ob foo ein Variablenname oder ein Typbezeicher ist (dies entscheidet sich ja erst zwei Verarbeitungs-Stufen weiter hinten, in der semantischen Analyse). Wie kann der Tokenizer dann wissen, ob er für "foo" das token VARNAME oder TYPENAME zurückgeben soll?

    Als Beispiele für die zweistufige Lexing-Parsing-Methode sehe ich oft Parsing von arithmetischen Ausdrücken. Da funktioniert das natürlich, weil der Tokenizer sofort sieht, daß ein String, der mit einer Ziffer beginnt, kein Bezeichner sein kann, und daß andererseits foo kein Operator und keine Zahl sein kann.

    Aber wie klappt das für "echte" Programmiersprachen mit Typsystem und Variablennamen, wo der Tokenizer eig Kontext braucht, um das Token für eine Zeichenkette sicher zu bestimmen?



  • Sehe gerade, auf das Problem sind schon andere gestoßen, Stichwort "lexer hack". Thread kann geschlossen werden.


Anmelden zum Antworten