2015-12-10 9 views
8

ここから http://www.antlr3.org/grammar/1304304798093/SQL2003_Grammar.zipのISO-SQL 2003文法をコンパイルしようとしています。 3つのバージョンはすべてhttp://www.antlr3.org/grammar/list.htmlにあります。ISO SQL-2003 ANTLR文法のコンパイル

これらは

  1. のjava -jar ANTLR-3.3-complete.jar -Xmx8G -Xwatchconversion sql2003Lexer.g
  2. のjava -jar ANTLR-3.3-complete.jar、Iが続くステップである-Xmx8G -Xwatchconversion sql2003Parser.g
  3. のjavac ANTLRDemo.java

ANTLRDemo.javaファイル:

import org.antlr.runtime.*; 
import java.io.IOException; 
import java.nio.file.Files; 
import java.nio.file.Path; 
import java.nio.file.Paths; 

public class ANTLRDemo { 
    static String readFile(String path) throws IOException 
    { 
     byte[] encoded = Files.readAllBytes(Paths.get(path)); 
     return new String(encoded, "UTF-8"); 
    } 

    public static void main(String[] args) throws Exception { 
     ANTLRStringStream in = new ANTLRStringStream(readFile(args[0])); 
     sql2003Lexer lexer = new sql2003Lexer(in); 
     CommonTokenStream tokens = new CommonTokenStream(lexer); 
     sql2003Parser parser = new sql2003Parser(tokens); 
     parser.eval(); 
    } 
} 
その後、私のメインクラスをコンパイルしながら、私はこれらのようなJavaの文法に関連するエラーの多くを得る

最初の2つのステップは、正常に動作:

./sql2003Parser.java:96985: error: not a statement $UnsignedInteger.text == '1' ./sql2003Parser.java:96985: error: ';' expected $UnsignedInteger.text == '1' ./sql2003Parser.java:102659: error: unclosed character literal if (!(((Unsigned_Integer3887!=null?Unsigned_Integer3887.getText():null) == '01'))) {

私は設定で間違った何かをやっている場合は私に知らせてくださいパーサ。
ANTLRを使用してこの文法をどのようにセットアップするかを誰かに教えてもらえれば助かります。

編集:これらのエラーは、レクサーとパーサーのルールに存在するアクションによって引き起こされると思います。これを克服する安全な方法はありますか?

答えて

1

あなたは間違ったことはしていませんが、ANTLRはこれらの文法ファイルから動作中のJavaパーサを生成することはできませんでした。 antlr-interest in Oct 2011へのダグラス・ゴドフリーによってポストによると

I generated a C parser and lexer. they both generate and compile successfully on my machine with 8GB heap allocated to Antlr.

...

I don't believe that it will ever be possible to get a working parser in Java. A C language parser on the other hand is quite possible.

+0

私はそれが完全に真実であるかどうかはわかりません。同じ人物 'Douglas Godfrey'が同じスレッドに以前掲載していたので、8GBのヒープスペースでコンパイルすることができました[http://www.antlr3.org/pipermail/antlr-interest/2011-October/042850.html]。また、SQL2003は、antlr2 [http://www.antlr2.org/]の公式ページにもリストされています.3人も同じ人のおかげです。この質問を見ていただきありがとうございます:) – noob333

+0

文法全体をANTLRとの互換性がないと判断する方法は正しいとは思いません:) – noob333

+0

@ noob333 SQLを構築していたGodfrey氏の言葉を信じられない場合生きるための文法パーサー、それ以外の誰があなたを説得できるのかわかりません。その一方で、それは不可能なことを知らなかった人々によって偉大なことの多くが構築されているので、その幸運は文法を修正します。 – anttix

1

はい、基本的にあなたは正しいです。文法は壊れています。また、Parserクラスにeval()メソッドがないため、ANTLRDemo.javaにエラーがあります。たとえば、構文解析の文法のルールの名前でメソッドを呼び出す必要があります。 query_specification()。文法そのものには、誤字のように見えるいくつかのエラーがありましたが、Javaのerror()メソッドコールが定義されていません。skip()は、レクサーでのみ適切なパーサで呼び出されます。すべての修正はthis commitにあります。私はthis GitHub repositoryに研究を発表しました。

私は文法の明白な誤りを修正し始めました。これは、生成されたJavaコードのコンパイルエラーにつながりました。あなたが投稿したのと同じエラーがありました。最終的に私はすべてのJava構文エラーを修正しましたが、それは直接修正することが不可能な別の問題に直面しました。これはJVMの制限から生まれたものであるため、compilation error: code too largeです。 ANTLRメーリングリストを読むと、巨大なクラスのいくつかの静的メンバーを別々のインターフェースに抽出し、それらを複数の継承の一種を持つように「実装」するヒントがありました。試行錯誤の末、私はパーサーによってsql2003Parser.javaに6つのインタフェース "imlemented"で終わった。

  • 間違っ開始規則:

    しかし、まだ2つの問題があります。ダグラス・ゴッドフリーは、sql2003Parserルールで始まる文法を書いています。残念なことに、この開始規則でパーサを呼び出すと、最も単純な場合でも構文解析は正しく行われませんselect a from b。だから、私はquery_specificationのパーサを呼び出して、SELECTの節のみを解析します。

  • 文法上のいくつかの誤り。私は文法を深く掘り下げませんでしたが、query_specificationはいくつかのランダムな複雑なSQLを解析できません。