Fine del descrittore di file in un'implementazione grammaticale
-
20-08-2019 - |
Domanda
Sto lavorando all'implementazione di un compilatore e desideri verificare se è stata raggiunta la fine del file?
So che questo può essere fatto usando la funzione yywrap () nel file lex, ma il requisito è che vogliamo che l'EOF sia esplicitamente definito come nel valore esadecimale 0x1a, come possiamo fare riferimento a ciò.
Esempio:
main () { printf (" Verifica marcatore EOF \ n "); '0x1a' & Lt; - l'attuale marker EOF.
Voglio che quanto sopra non sia un errore di sintassi, ma sia segnalato come errore Parentesi non bilanciate, oppure erroneamente definite.
È possibile fare quanto sopra? Il mio requisito è solo di avere il token EOF nel parser, che purtroppo non sono stato in grado di farlo fino ad oggi: - ((, il resto del lavoro sarà facilmente eseguito come allora, devo solo dare una regola come:
print : print_stmt '(' stmt_valid ')' colon '\n'
{
OK do the rest
}
| print_stmt '(' stmt_valid ')' colon end_indicator
{
print error message and close application.
}
Soluzione
Rendi il tuo lexer restituito un token per l'EOF.
Ti suggerisco di restituire il token per due casi:
-
getc()
restituito-1
(il solito segno EOF). In questo caso, rendere vuoto il testo del token -
'\x1a'
restituito <=>. In questo caso, inserisci questo carattere nel testo del token.
Ciò consente alla tua grammatica di distinguere tra questi due casi.