ここから http://www.antlr3.org/grammar/1304304798093/SQL2003_Grammar.zipのISO-SQL 2003文法をコンパイルしようとしています。 3つのバージョンはすべてhttp://www.antlr3.org/grammar/list.htmlにあります。ISO SQL-2003 ANTLR文法のコンパイル
これらは
- のjava -jar ANTLR-3.3-complete.jar -Xmx8G -Xwatchconversion sql2003Lexer.g
- のjava -jar ANTLR-3.3-complete.jar、Iが続くステップである-Xmx8G -Xwatchconversion sql2003Parser.g
- の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を使用してこの文法をどのようにセットアップするかを誰かに教えてもらえれば助かります。
編集:これらのエラーは、レクサーとパーサーのルールに存在するアクションによって引き起こされると思います。これを克服する安全な方法はありますか?
私はそれが完全に真実であるかどうかはわかりません。同じ人物 'Douglas Godfrey'が同じスレッドに以前掲載していたので、8GBのヒープスペースでコンパイルすることができました[http://www.antlr3.org/pipermail/antlr-interest/2011-October/042850.html]。また、SQL2003は、antlr2 [http://www.antlr2.org/]の公式ページにもリストされています.3人も同じ人のおかげです。この質問を見ていただきありがとうございます:) – noob333
文法全体をANTLRとの互換性がないと判断する方法は正しいとは思いません:) – noob333
@ noob333 SQLを構築していたGodfrey氏の言葉を信じられない場合生きるための文法パーサー、それ以外の誰があなたを説得できるのかわかりません。その一方で、それは不可能なことを知らなかった人々によって偉大なことの多くが構築されているので、その幸運は文法を修正します。 – anttix