Kompilieren von ISO SQL-2003 ANTLR Grammatik

8

Ich versuche, die ISO-SQL 2003-Grammatik von hier aus zu kompilieren Ссылка . Alle drei Versionen davon finden Sie hier Ссылка .

Dies sind die Schritte, denen ich gefolgt bin,

  1. java -jar antlr-3.3-complete.jar -Xmx8G -Xwatchconversion sql2003Lexer.g
  2. java -jar antlr-3.3-complete.jar -Xmx8G -Xwatch-Konvertierung sql2003Parser.g
  3. javac ANTLRDemo.java

ANTLRDemo.java-Datei:

%Vor%

Die ersten beiden Schritte funktionieren gut, und während ich meine Hauptklasse kompiliere, bekomme ich viele Fehler in Bezug auf die Java-Syntax:

  

./ sql2003Parser.java:96985: Fehler: keine Aussage                 $ UnsignedInteger.text == '1'   ./sql2003Parser.java:96985: Fehler: ';' erwartet                 $ UnsignedInteger.text == '1'   ./sql2003Parser.java:102659: Fehler: Nicht geschlossenes Zeichenliteral               if (! ((Unsigned_Integer3887! = null? Unsigned_Integer3887.getText (): null) == '01'))) {

Bitte lassen Sie mich wissen, wenn ich beim Einrichten des Parsers etwas falsch mache.
Es wäre hilfreich, wenn mir jemand zeigen könnte, wie man diese Grammatik mit ANTLR genau einrichtet.

Edit: Nach ein wenig mehr Fummelei, denke ich, dass diese Fehler durch die Aktionen in Lexer und Parser-Regeln verursacht werden. Gibt es einen sicheren Weg, dies zu überwinden?

    
noob333 10.12.2015, 13:03
quelle

2 Antworten

1

Sie sind nicht etwas falsch zu machen, hat ANTLR nie eine funktionierende Java-Parser aus diesen Grammatikdateien erzeugen konnte.

Nach einem Beitrag von Douglas Godfrey an antlr-Interesse Oktober 2011 :

  

Ich habe einen C-Parser und einen Lexer erzeugt. sie erzeugen und kompilieren beide   erfolgreich   auf meinem Rechner mit 8 GB Heap für Antlr.

     

...

     

Ich glaube nicht, dass es jemals möglich sein wird, einen Arbeits Parser zu erhalten in   Java. Eine Sprache C-Parser auf der anderen Seite ist durchaus möglich.

    
anttix 08.12.2016 05:30
quelle
1

Ja, im Grunde hast du recht. Die Grammatik ist gebrochen. Aber es gibt auch einen Fehler in Ihrem ANTLRDemo.java , da es keine eval() -Methode in Parser -Klasse gibt. Sie sollten die Methode mit dem Namen einer beliebigen Regel der Parsergrammatik aufrufen, z. %Code%. In der Grammatik selbst gab es einige Fehler, die als Tippfehler galten, einige undefinierte Java query_specification() Methodenaufrufe, error() Aufrufe im Parser, die nur in Lexer geeignet sind. Sie sehen alle Korrekturen in diesem Commit . Ich habe meine Forschung in diesem GitHub-Repository veröffentlicht.

Ich fing an, offensichtliche Fehler der Grammatik zu beheben, was zu Kompilierungsfehlern in generiertem Java-Code führte. Ich hatte die gleichen Fehler, die du gepostet hast. Schließlich habe ich alle Java-Syntaxfehler behoben, aber es gab eine andere, die nicht direkt repariert werden konnte, weil sie von der Einschränkung von JVM, dem skip() , herrührt. Beim Lesen der ANTLR-Mailingliste gab es einen Hinweis, einige statische Mitglieder der riesigen Klassen in separate Schnittstellen zu extrahieren und sie "zu implementieren", um eine Art Mehrfachvererbung zu erhalten. Mit Versuch und Irrtum endete ich mit 6 Schnittstellen, die vom Parser in compilation error: code too large "ergänzt" wurden.

Aber immer noch gibt es 2 Probleme:

  • Falsche Startregel. Douglas Godfrey hat eine Grammatik geschrieben, die mit sql2003Parser.java rule beginnt. Leider, wenn Sie Parser mit dieser Startregel aufrufen, wird es nicht einmal die einfachste sql2003Parser richtig parsen. Also rufe ich Parser nach select a from b rule auf, um nur query_specification clause zu analysieren.
  • Einige andere Fehler in der Grammatik. Ich habe nicht zu tief in der Grammatik gegraben, aber SELECT kann einige zufällige komplexe SQLs nicht parsen.
Lana 20.12.2016 19:32
quelle

Tags und Links