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.
}
È stato utile?

Soluzione

Rendi il tuo lexer restituito un token per l'EOF.

Ti suggerisco di restituire il token per due casi:

  1. getc() restituito -1 (il solito segno EOF). In questo caso, rendere vuoto il testo del token

  2. '\x1a' restituito <=>. In questo caso, inserisci questo carattere nel testo del token.

Ciò consente alla tua grammatica di distinguere tra questi due casi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top