编译ISO SQL-2003 ANTLR语法

noo*_*333 8 java sql parsing antlr

我正在尝试从这里编译ISO-SQL 2003语法 http://www.antlr3.org/grammar/1304304798093/SQL2003_Grammar.zip.它的所有三个版本都可以在http://www.antlr3.org/grammar/list.html找到.

这些是我遵循的步骤,

  1. java -jar antlr-3.3-complete.jar -Xmx8G -Xwatchconversion sql2003Lexer.g
  2. java -jar antlr-3.3-complete.jar -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();
   }
}
Run Code Online (Sandbox Code Playgroud)

前两个步骤工作正常,然后在编译我的主类时,我得到了很多与Java语法相关的错误,如下所示:

./sql2003Parser.java:96985:错误:不是语句$ UnsignedInteger.text =='1'./sql2003Parser.java:96985:错误:';' 预期$ UnsignedInteger.text =='1'./sql2003Parser.java:102659:错误:unclosed字符文字if(!(((Unsigned_Integer3887!= null?Unsigned_Integer3887.getText():null)=='01'))) {

如果我在设置解析器时出错了,请告诉我.
如果有人能告诉我如何使用ANTLR设置这个语法会很有帮助.

编辑:经过一些小小的调整后,我认为这些错误是由词法分析器和解析器规则中的操作引起的.有没有一种安全的方法来克服这个问题?

ant*_*tix 1

你没有做错什么,ANTLR 从来无法从这些语法文件生成一个可用的 Java 解析器。

根据 Douglas Godfrey于 2011 年 10 月在 antlr-interest上发表的一篇文章:

我生成了一个 C 解析器和词法分析器。它们都在我的机器上成功生成并编译,并为 Antlr 分配了 8GB 堆。

...

我不相信用 Java 可以获得一个可以工作的解析器。另一方面,AC 语言解析器是很有可能的。