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!

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top