Pergunta

Eu estou trabalhando em uma implementação compilador e deseja verificar se o fim do arquivo foi alcançado?

Eu sei que isso pode ser feito usando a função yywrap () no arquivo lex, mas a exigência é que queremos que se o EOF é definida explicitamente como no valor hexadecimal 0x1A, então como é que vamos referenciar isso.

Exemplo:

main () { printf ( "check EOF marcador \ n"); '0x1a' <-. O marcador EOF real

Eu quero o acima não ser um erro de sintaxe, mas para ser relatado como um erro parênteses desequilibrados, ou está mal definido.

Pode o acima deve ser feito? Minha exigência é apenas para ter o EOF token no analisador, que, infelizmente, eu não tenho sido capaz de fazê-lo até a data: - ((, o resto do trabalho será feito facilmente como então, eu só tenho que dar uma regra tais como:

print    :    print_stmt '(' stmt_valid ')' colon '\n' 
{
    OK do the rest
}
         |    print_stmt '(' stmt_valid ')' colon end_indicator
{
    print error message and close application.
}
Foi útil?

Solução

Faça o seu lexer retornar um token para o EOF.

Eu sugiro que você retornar o token para dois casos:

  1. getc() voltou -1 (o sinal EOF usual). Neste caso, tornar o texto token de esvaziar

  2. getc() voltou '\x1a'. Neste caso, coloque esse personagem no texto token.

Isso permite que a sua gramática de diferenciar entre estes dois casos.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top