Come detto nel titolo, quale tipo di dati dovrebbe restituire / dare al parser il lexer? Leggendo l'articolo analisi lessicale di Wikipedia, si afferma che:
In computer science, lexical analysis is the process of converting a sequence of characters (such as in a computer program or web page) into a sequence of tokens (strings with an identified "meaning").
Tuttavia, in completa contraddizione con l'affermazione precedente, Quando un'altra domanda ho chiesto su un altro sito ( Code Review se sei curioso) ha risposto, la persona che risponde ha dichiarato che:
The lexer usually reads the string and converts this into a stream ... of lexemes. The lexemes only need to be a stream of numbers.
e ha dato questa immagine:
nl_output => 256
output => 257
<string> => 258
Più avanti nell'articolo Ha menzionato Flex
, un lexer già esistente, e ha detto che scrivere 'regole' con esso sarebbe stato più semplice che scrivere un lexer a mano. Ha proceduto a darmi questo esempio:
Space [ \r\n\t]
QuotedString "[^"]*"
%%
nl_output {return 256;}
output {return 257;}
{QuotedString} {return 258;}
{Space} {/* Ignore */}
. {error("Unmatched character");}
%%
Per approfondire la mia conoscenza e ottenere maggiori informazioni, ho letto l'articolo di Wikipedia su Flex . l'articolo di Flex ha mostrato che è possibile definire una serie di regole di sintassi, con token, nel modo seguente:
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; }
Mi sembra che il lexer Flex stia restituendo stringhe di parole chiave \ token. Ma potrebbe essere la restituzione di costanti che sono uguali a determinati numeri.
Se il lexer stava per restituire i numeri, come leggeresti i valori letterali delle stringhe? restituire un numero va bene per le singole parole chiave, ma come faresti con una stringa? Il lexer non dovrebbe convertire la stringa in numeri binari e quindi il parser convertirà i numeri in una stringa. Sembra molto più logico (e più semplice) per il lexer restituire le stringhe, e quindi lasciare che il parser converta qualsiasi numero di stringa letterale in numeri reali.
Oppure il lexer potrebbe restituire entrambi? Ho provato a scrivere un semplice lexer in c ++, che ti consente di avere solo un tipo di ritorno per le tue funzioni. Così mi porta a fare la mia domanda.
Per condensare la mia domanda in un paragrafo: quando scrivi un lexer e supponendo che possa restituire solo un tipo di dati (stringhe o numeri), quale sarebbe la scelta più logica?