Comme indiqué dans le titre, quel type de données un lexer doit-il retourner / donner à l'analyseur? En lisant l' article sur l' analyse lexicale de Wikipédia, il a déclaré que:
En informatique, l'analyse lexicale est le processus de conversion d'une séquence de caractères (comme dans un programme informatique ou une page Web) en une séquence de jetons ( chaînes avec une «signification» identifiée).
Cependant, en totale contradiction avec la déclaration ci-dessus, lorsqu'une autre question que j'ai posée sur un autre site ( Code Review si vous êtes curieux) a été répondue, la personne qui a répondu a déclaré que:
Le lexer lit généralement la chaîne et le convertit en un flux ... de lexèmes. Les lexèmes doivent seulement être un flux de nombres .
et il a donné ce visuel:
nl_output => 256
output => 257
<string> => 258
Plus Flex
loin dans l'article, Il a mentionné , un lexer déjà existant, et a dit que l'écriture de «règles» avec lui serait plus simple que d'écrire un lexer à la main. Il a ensuite donné cet exemple:
Space [ \r\n\t]
QuotedString "[^"]*"
%%
nl_output {return 256;}
output {return 257;}
{QuotedString} {return 258;}
{Space} {/* Ignore */}
. {error("Unmatched character");}
%%
Pour approfondir mes connaissances et obtenir plus d'informations, j'ai lu l'article Wikipedia sur Flex . l'article Flex a montré que vous pouviez définir un ensemble de règles de syntaxe, avec des jetons, de la manière suivante:
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; }
Il me semble que le lexer Flex renvoie des chaînes de mots-clés \ tokens. Mais il pourrait s'agir de constantes de retour égales à certains nombres.
Si le lexer devait retourner des nombres, comment lirait-il les littéraux de chaîne? renvoyer un nombre est très bien pour des mots clés uniques, mais comment traiteriez-vous une chaîne? Le lexeur n'aurait-il pas à convertir la chaîne en nombres binaires, puis l'analyseur reconvertirait les nombres en chaîne. Il semble beaucoup plus logique (et plus facile) pour le lexer de renvoyer des chaînes, puis de laisser l'analyseur convertir les littéraux de chaîne de nombres en nombres réels.
Ou le lexer pourrait-il retourner les deux? J'ai essayé d'écrire un lexer simple en c ++, qui vous permet d'avoir un seul type de retour pour vos fonctions. Me conduisant ainsi à poser ma question.
Pour condenser ma question en un paragraphe: lors de l'écriture d'un lexer, et en supposant qu'il ne pourrait renvoyer qu'un seul type de données (chaînes ou nombres), quel serait le choix le plus logique?