【发布时间】:2015-12-10 13:03:56
【问题描述】:
我正在尝试从这里编译 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:错误:未闭合字符文字 if ( !(((Unsigned_Integer3887!=null?Unsigned_Integer3887.getText():null) == '01')) ) {
如果我在设置解析器时做错了什么,请告诉我。
如果有人可以告诉我如何使用 ANTLR 设置此语法,将会很有帮助。
编辑:经过一番折腾,我认为这些错误是由词法分析器和解析器规则中存在的操作引起的。有没有安全的方法来克服这个问题?
【问题讨论】: