Question

Mon problème est que je suis en train de lancer un problème que je codé à l'aide d'un scanner-analyseur-flex de bison. Ce que mon programme est censé faire est de prendre l'entrée d'utilisateur (dans mon cas, les requêtes pour un système de base de données que je suis la conception), LEX et analyser, puis exécuter les actions correspondantes. Ce qui se passe en réalité est que mon code d'analyse syntaxique n'est pas interpréter correctement les chaînes littérales que je le nourrir.

Voici mon code:

130 insertexpr :  "INSERT" expr '(' expr ')'
131 
132                  {
133                         $$ = new QLInsert( $2, $4 );
134                          }
135                         ;

Et mon entrée, suite à la "Requête:" invite:

  

Requête: INSERT abc (5);
  entrée: 1,0 à 5: erreur de syntaxe, chaîne inattendue, attente de fin de fichier ou de fin de ligne ou INSERT ou « ; »

Maintenant, si je retire la « INSERT » chaîne littérale de mon code parser.yy la ligne 130, le programme fonctionne très bien. En fait, après le stockage des données d'entrée (à savoir, « abc » et l'entier 5), il est retourné retour me correctement.

Au début, je pensais que c'était un problème avec les codages de caractères. Code Bison doit être compilé et exécuté en utilisant les mêmes codages, qui ne devrait pas être un problème car je suis compilation et l'exécution du même terminal.

Mes coordonnées du système:

Ubuntu 8.10 (Linux 2.6.24-16-générique)
flex 2.5.34
bison 2.3
gcc 4.2.4

Si vous avez besoin de plus d'information ou un code de, laissez-moi!

Était-ce utile?

La solution

Ceci est une erreur classique, si vous utilisez flex pour votre entrée en lex jetons, vous ne devez pas se référer aux chaînes dans l'analyseur comme des chaînes littérales, mais plutôt utiliser des jetons pour eux.

Pour plus de détails, voir cette question similaire

Autres conseils

Thankee, thankee, thankee!

Juste pour clarifier, voici comment j'ai mis ma solution, basée sur les commentaires de jpalecek. Tout d'abord, je déclarai un jeton INSERT dans le code de bison (de parser.yy):

71 %token INSERT

Ensuite, je défini ce jeton dans le code flex (scanner.ll):

79 "INSERT INTO" { return token::INSERT; }

Enfin, je l'utilise INSERT jeton dans ma règle de grammaire:

132 insertexpr :  INSERT expr '(' expr ')'
133 
134                  {
135                         $$ = new QLInsert( $2, $4 );
136                          }
137                         ;

Et le tour est joué! mon mal de tête trop longue est enfin terminée!

Merci, jpalecek.)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top