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找到.
这些是我遵循的步骤,
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设置这个语法会很有帮助.
编辑:经过一些小小的调整后,我认为这些错误是由词法分析器和解析器规则中的操作引起的.有没有一种安全的方法来克服这个问题?
你没有做错什么,ANTLR 从来无法从这些语法文件生成一个可用的 Java 解析器。
根据 Douglas Godfrey于 2011 年 10 月在 antlr-interest上发表的一篇文章:
我生成了一个 C 解析器和词法分析器。它们都在我的机器上成功生成并编译,并为 Antlr 分配了 8GB 堆。
...
我不相信用 Java 可以获得一个可以工作的解析器。另一方面,AC 语言解析器是很有可能的。