Come detto nel titolo, quale tipo di dati dovrebbe restituire / dare al parser un lexer? Nel leggere l' articolo di analisi lessicale di Wikipedia, si afferma che:
Nell'informatica, l'analisi lessicale è il processo di conversione di una sequenza di caratteri (come un programma per computer o una pagina Web) in una sequenza di token ( stringhe con un "significato" identificato).
Tuttavia, in completa contraddizione con la precedente dichiarazione, quando è stata data risposta a un'altra domanda che ho posto su un altro sito ( Revisione del codice se sei curioso), la persona che ha risposto ha dichiarato che:
Il lexer di solito legge la stringa e la converte in un flusso ... di lexemi. I lessemi devono solo essere un flusso di numeri .
e ha dato questo aspetto:
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 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 Flex mostrava che era possibile definire un insieme 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 restituire costanti uguali a determinati numeri.
Se il lexer avesse restituito dei numeri, come avrebbe letto i letterali delle stringhe? la restituzione di un numero va bene per singole parole chiave, ma come gestiresti 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 stringhe e quindi consentire al parser di convertire qualsiasi valore letterale in numeri reali.
O il lexer potrebbe restituire entrambi? Ho provato a scrivere un semplice lexer in c ++, che ti consente di avere un solo tipo di ritorno per le tue funzioni. Mi porta così a porre la mia domanda.
Per condensare la mia domanda in un paragrafo: quando si scrive un lexer e si assume che possa restituire un solo tipo di dati (stringhe o numeri), quale sarebbe la scelta più logica?