Bison ne semble pas reconnaître littéraux de chaîne C appropriée
-
22-08-2019 - |
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!
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.)