Bison erscheint nicht C Stringliterale angemessen zu erkennen
-
22-08-2019 - |
Frage
Mein Problem ist, dass ich ein Problem zu laufen Ich versuche, dass ich einen Flex-Bison-Scanner-Parser codiert werden. Was ist mein Programm soll tun ist, Benutzereingaben nehmen (in meinem Fall, Abfragen für ein Datenbanksystem Ich bin die Gestaltung), lex und analysieren und dann die entsprechenden Aktionen auszuführen. Was tatsächlich passiert ist, dass mein Parsercode die Stringliterale nicht richtig interpretiert, dass ich es füttern.
Hier ist mein Code:
130 insertexpr : "INSERT" expr '(' expr ')'
131
132 {
133 $$ = new QLInsert( $2, $4 );
134 }
135 ;
Und meine Eingabe nach dem "Query:" prompt:
Abfrage: INSERT abc (5);
Eingabe: 1,0-5: Syntaxfehler, unerwarteter string, Dateiende oder am Ende der Linie oder INSERT oder erwartete ‚;‘
Nun, wenn ich den „INSERT“ Stringliteral von meinem parser.yy Code auf der Leitung 130 zu entfernen, läuft das Programm gut. In der Tat, nachdem die Eingangsdaten zu speichern (nämlich „abc“ und die ganze Zahl 5), ist es mir gleich wieder richtig zurück.
Zuerst dachte ich, das ein Problem mit Zeichenkodierungen war. Bison-Code muss erstellt werden und führen die gleichen Codierungen verwenden, die kein Problem sehen werden sollte, wie ich kompilieren und aus dem gleichen Endgerät ausgeführt wird.
Mein System Details:
Ubuntu 8.10 (Linux 2.6.24-16-generic)
flex 2.5.34
Bison 2.3
gcc 4.2.4
Wenn Sie weitere Informationen oder Code aus benötigen, lassen Sie es mich wissen!
Lösung
Dies ist ein klassischer Fehler, wenn Sie flex verwenden Sie Ihre Eingabe in Token lex, Sie nicht auf die Zeichenketten in den Parser als Zeichenketten, sondern verwenden Token für sie beziehen.
Weitere Informationen finden Sie unter diese ähnliche Frage
Andere Tipps
Thankee, Thankee, Thankee!
Nur um zu klären, hier ist, wie ich meine Lösung implementiert, auf der Grundlage der Berichte von jpalecek. Zuerst habe ich erklärt, eine INSERT-Token im Bison-Code (parser.yy):
71 %token INSERT
Als nächstes definierte ich das Token in dem Flex-Code (scanner.ll):
79 "INSERT INTO" { return token::INSERT; }
Schließlich habe ich verwendet, um das Token-INSERT in meiner Grammatikregel:
132 insertexpr : INSERT expr '(' expr ')'
133
134 {
135 $$ = new QLInsert( $2, $4 );
136 }
137 ;
Und voila! mein über-extended Kopfschmerzen ist endlich vorbei!
Danke, jpalecek.)