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!

Foi útil?

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:.)

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