我正在尝试从此处编译ISO-SQL 2003语法
http://www.antlr3.org/grammar/1304304798093/SQL2003_Grammar.zip。它的所有三个版本都可以在http://www.antlr3.org/grammar/list.html中找到。
这些是我遵循的步骤
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语言解析器很有可能。
我有这样的查询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…