que Bison não parecem reconhecer C strings literais de forma adequada
-
22-08-2019 - |
Pergunta
O meu problema é que eu estou tentando executar um problema que eu codificado usando um flex-bisão scanner de parser. O meu programa é suposto fazer é introduzir take usuário (no meu caso, as consultas para um sistema de banco de dados Eu estou projetando), Lex e analisar, e depois executar as ações correspondentes. O que realmente acontece é que meu código analisador não está interpretando corretamente as strings literais que eu alimentá-lo.
Aqui está o meu código:
130 insertexpr : "INSERT" expr '(' expr ')'
131
132 {
133 $$ = new QLInsert( $2, $4 );
134 }
135 ;
E a minha entrada, na sequência do "Inquérito:" prompt:
Inquérito: abc inserção (5);
entrada: 1,0-5: erro de sintaxe, corda inesperado, esperando o fim do arquivo ou fim de linha ou INSERT ou ';'
Agora, se eu remover o "Inserir" literal corda do meu código parser.yy na linha 130, o programa funciona muito bem. Na verdade, depois de armazenar os dados de entrada (ou seja, "abc" eo inteiro 5), ele é retornado de volta à direita para me corretamente.
No início, eu pensei que este era um problema com codificação de caracteres. necessidades de código Bison a ser compilado e executado usando as mesmas codificações, que não deve ser um problema vendo como eu estou compilar e executar a partir do mesmo terminal.
Os meus detalhes do sistema:
Ubuntu 8.10 (Linux 2.6.24-16-generic)
Flex 2.5.34
bisonte 2,3
gcc 4.2.4
Se precisar de mais informações ou código de, me avise!
Solução
Este é um erro clássico, se você usar flex para lex sua entrada em tokens, você não deve consultar as strings literais no analisador como strings literais, mas sim usar fichas para eles.
Para mais detalhes, consulte esta pergunta semelhante
Outras dicas
Thankee, thankee, thankee!
Só para esclarecer, aqui está como eu implementei a minha solução, com base nos comentários de jpalecek. Primeiro, eu declarei um INSERT token no código bisonte (parser.yy):
71 %token INSERT
Em seguida, eu definido que token no código Flex (scanner.ll):
79 "INSERT INTO" { return token::INSERT; }
Finalmente, eu usei o INSERT token no meu regra gramatical:
132 insertexpr : INSERT expr '(' expr ')'
133
134 {
135 $$ = new QLInsert( $2, $4 );
136 }
137 ;
E voila! meu mais prolongada dor de cabeça finalmente acabou!
Obrigado, jpalecek:.)