Fim do descritor de arquivo em uma implementação gramática
-
20-08-2019 - |
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.
}
Solução
Faça o seu lexer retornar um token para o EOF.
Eu sugiro que você retornar o token para dois casos:
-
getc()
voltou-1
(o sinal EOF usual). Neste caso, tornar o texto token de esvaziar -
getc()
voltou'\x1a'
. Neste caso, coloque esse personagem no texto token.
Isso permite que a sua gramática de diferenciar entre estes dois casos.