我想從這裏編譯ISO-SQL 2003語法 http://www.antlr3.org/grammar/1304304798093/SQL2003_Grammar.zip。它的所有三個版本可以在這裏找到http://www.antlr3.org/grammar/list.html。編譯ISO SQL-2003 ANTLR語法
這些是我遵循的步驟,
- Java的罐子ANTLR-3.3-complete.jar -Xmx8G -Xwatchconversion sql2003Lexer.g
- Java的罐子ANTLR-3.3-complete.jar -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的語法像這樣的錯誤:
./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來設置這個語法,那將會很有幫助。
編輯:經過多一點弄亂之後,我認爲這些錯誤是由詞法分析器和解析器規則中存在的操作引起的。有沒有一種安全的方法來克服這個問題?
我不太確定這是完全正確的。同一個人'道格拉斯戈弗雷'先前發佈在同一個線程上,他設法用8GB的堆空間進行編譯[http://www.antlr3.org/pipermail/antlr-interest/2011-October/042850.html]。另外SQL2003在antlr2 [http://www.antlr2.org/]的官方頁面上列出,我也想到了3(感謝同一個人)。感謝您查看此問題:) – noob333
排除與ANTLR不兼容的整個語法不是正確的方式,我認爲:) – noob333
@ noob333如果您不相信Godfrey先生曾經構建SQL的話語法解析器的生活,然後我不知道還有誰能說服你。另一方面,許多偉大的事物都是由不知道這是不可能的人來修復語法的。 – anttix