编译ISO SQL-2003 ANTLR语法 - java

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

这些是我遵循的步骤

  • java -jar antlr-3.3-complete.jar -Xmx8G -Xwatchconversion sql2003Lexer.g
  • java -jar 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:错误:不是语句
    $ UnsignedInteger.text =='1'
    ./sql2003Parser.java:96985:错误:';'预期
    $ UnsignedInteger.text =='1'
    ./sql2003Parser.java:102659:错误:未封闭的字符文字
    如果(!(((Unsigned_Integer3887!= null?Unsigned_Integer3887.getText():null)=='01'))){

    如果我在设置解析器时做错了什么,请告诉我。如果有人可以告诉我如何使用ANTLR准确设置此语法,这将很有帮助。

    编辑:经过一番摆弄之后,我认为这些错误是由词法分析器和解析器规则中存在的操作引起的。有没有安全的方法可以克服这个问题?

    参考方案

    您没有做错任何事,ANTLR从未能够从这些语法文件生成有效的Java解析器。

    根据道格拉斯·戈弗雷(Douglas Godfrey)在antlr-interest in Oct 2011上的帖子:

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

    ...

    我认为永远不可能有一个可以使用的解析器
    Java。另一方面,C语言解析器很有可能。

    SQL Joins与Java代码? - java

    我有这样的查询Select Folder.name from FROM FolderTable,ValidFolder, ValidFolderGroup, ValidUser, ValidLocation, ValidDepartment where ValidUser.LocationCode *= ValidLocation.LocationCode …

    什么时候在JDBC上使用批处理操作更快? - java

    我有一段代码可以在数据库上执行大约500,000次插入。现在,它是在每次迭代中调用PreparedStatement的executeUpdate的循环中完成的。将所有500,000个插入项添加到批处理中并仅一次调用executeBatch会更快吗? 参考方案 是的,它将更快。确保先关闭autoCommit,否则不会获得任何性能优势。

    JDBC分页 - java

    我想使用JDBC实现分页。我想知道的实际事情是“如何分别从数据库中获取第1页和第2页的前50条记录,然后再获得50条记录”我的查询是Select * from data [数据表包含20,000行]对于第1页,我得到50条记录,对于第2页,我想获得下50条记录。如何在JDBC中有效地实现它?我搜索后发现rs.absolute(row)是跳过首页记录的方法,但…

    Jooq如何基于复合键查询实体 - java

    如何在Jooq中基于组合键查询实体?例如。:UserAttempts org.jooq.impl.DAOImpl.findById(Record2<UInteger, String> id) id是复合键。如何使用Record2<UInteger, String>? 参考方案 您可以使用Record2构造DSLContext.newR…

    从实体获取或创建插入语句 - java

    是否存在具有值的现有实体类生成插入语句的可能性?编辑:我的意思是为实体类的实例生成一个插入语句,以单独执行该语句。提前致谢 java大神给出的解决方案 使用Fastnate,您可以为没有连接数据库的实体创建SQL语句:public String createSQL() { // Create your entity TestEntity entity = n…