Welchen Datentyp soll ein Lexer, wie im Titel erwähnt, zurückgeben / dem Parser geben? Beim Lesen des Artikels zur lexikalischen Analyse , den Wikipedia verfasst hat, wurde Folgendes festgestellt:
In der Informatik ist die lexikalische Analyse das Umwandeln einer Folge von Zeichen (wie in einem Computerprogramm oder einer Webseite) in eine Folge von Token ( Zeichenfolgen mit einer identifizierten "Bedeutung").
Im völligen Widerspruch zu der obigen Aussage, als eine andere Frage, die ich auf einer anderen Site gestellt habe ( Code Review, wenn Sie neugierig sind), beantwortet wurde, erklärte die antwortende Person:
Der Lexer liest normalerweise die Zeichenkette und wandelt sie in einen Strom von Lexemen um. Die Lexeme müssen nur ein Strom von Zahlen sein .
und er gab dieses Bild:
nl_output => 256
output => 257
<string> => 258
Später in dem Artikel erwähnte er Flex
einen bereits existierenden Lexer und sagte, das Schreiben von "Regeln" damit sei einfacher als das Schreiben eines Lexers von Hand. Er fuhr fort, mir dieses Beispiel zu geben:
Space [ \r\n\t]
QuotedString "[^"]*"
%%
nl_output {return 256;}
output {return 257;}
{QuotedString} {return 258;}
{Space} {/* Ignore */}
. {error("Unmatched character");}
%%
Um meinen Einblick zu erweitern und mehr Informationen zu erhalten, habe ich den Wikipedia-Artikel über Flex gelesen . Der Flex-Artikel zeigte, dass Sie mit Token auf folgende Weise einen Satz von Syntaxregeln definieren können:
digit [0-9]
letter [a-zA-Z]
%%
"+" { return PLUS; }
"-" { return MINUS; }
"*" { return TIMES; }
"/" { return SLASH; }
"(" { return LPAREN; }
")" { return RPAREN; }
";" { return SEMICOLON; }
"," { return COMMA; }
"." { return PERIOD; }
":=" { return BECOMES; }
"=" { return EQL; }
"<>" { return NEQ; }
"<" { return LSS; }
">" { return GTR; }
"<=" { return LEQ; }
">=" { return GEQ; }
"begin" { return BEGINSYM; }
"call" { return CALLSYM; }
"const" { return CONSTSYM; }
"do" { return DOSYM; }
"end" { return ENDSYM; }
"if" { return IFSYM; }
"odd" { return ODDSYM; }
"procedure" { return PROCSYM; }
"then" { return THENSYM; }
"var" { return VARSYM; }
"while" { return WHILESYM; }
Es scheint mir, dass der Flex-Lexer Zeichenfolgen von Keywords \ Token zurückgibt. Es können jedoch Konstanten zurückgegeben werden, die bestimmten Zahlen entsprechen.
Wenn der Lexer Zahlen zurückgeben würde, wie würde er String-Literale lesen? Die Rückgabe einer Zahl ist für einzelne Stichwörter in Ordnung. Aber wie würden Sie mit einer Zeichenfolge umgehen? Müsste der Lexer die Zeichenfolge nicht in Binärzahlen konvertieren, und der Parser würde die Zahlen dann wieder in eine Zeichenfolge konvertieren. Es erscheint dem Lexer viel logischer (und einfacher), Zeichenfolgen zurückzugeben und den Parser dann beliebige Zahlenzeichenfolgenliterale in tatsächliche Zahlen umwandeln zu lassen.
Oder könnte der Lexer beides zurückgeben? Ich habe versucht, einen einfachen Lexer in c ++ zu schreiben, mit dem Sie nur einen Rückgabetyp für Ihre Funktionen haben. Das veranlasste mich, meine Frage zu stellen.
Um meine Frage in einem Absatz zusammenzufassen: Wenn Sie ein Lexer schreiben und davon ausgehen, dass es nur einen Datentyp (Zeichenfolgen oder Zahlen) zurückgeben könnte, was wäre die logischere Wahl?