我正在尝试从这里编译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:错误:unclosed字符文字if(!(((Unsigned_Integer3887!= null?Unsigned_Integer3887.getText():null)=='01'))) {
如果我在设置解析器时出错了,请告诉我.
如果有人能告诉我如何使用ANTLR设置这个语法会很有帮助.
编辑:经过一些小小的调整后,我认为这些错误是由词法分析器和解析器规则中的操作引起的.有没有一种安全的方法来克服这个问题?