ANTLR解析在使用TestRig时工作,但在使用Java解析时失败
我有一个用于评估csv文件的语法,它根据TestRig正常工作。将生成以下解析树: 但是,如果我在应用程序中使用以下java代码,解析将失败并出现错误:ANTLR解析在使用TestRig时工作,但在使用Java解析时失败,java,antlr,antlr4,Java,Antlr,Antlr4,我有一个用于评估csv文件的语法,它根据TestRig正常工作。将生成以下解析树: 但是,如果我在应用程序中使用以下java代码,解析将失败并出现错误: line 2:33 no viable alternative at input '=A2+B2+C1' 更新:我现在直接使用来自文件的Char流,但错误仍然存在 private static void parseFile(String fileName) throws IOException { CSVLexer lex
line 2:33 no viable alternative at input '=A2+B2+C1'
更新:我现在直接使用来自文件的Char流,但错误仍然存在
private static void parseFile(String fileName) throws IOException {
CSVLexer lexer = new CSVLexer(CharStreams.fromFileName("test.csv", StandardCharsets.UTF_8));
CSVParser parser = new CSVParser(new CommonTokenStream(lexer));
ParseTree tree = parser.start(); //start is the start rule
}
据我所知,TestRig也做了同样的事情,那么这怎么可能成功,而这怎么可能失败呢
下面是我用来测试的test.csv
:
12;=35.5+6*2;=A1+B1
"szoveg";"masik szoveg";=A2+B2+C1
至于我如何调用TestRig,我使用命令行:
java -cp path\to\antln\jar org.antlr.v4.gui.TestRig CSV start -gui
更新:当使用
java -cp path\to\antln\jar org.antlr.v4.gui.TestRig CSV start -gui test.csv
我也遇到了同样的错误。所以问题是我的语法要求在每一行的末尾都有一个换行符,
test.csv
在最后一行没有换行符
在最后一行按enter键并保存后,它现在可以工作了
解决方案:重写换行规则,使最后一个换行符可选
或使用java在从文件读取的字符串末尾添加换行符(我选择此选项)
所以问题是,我的语法要求在每一行的末尾有一个换行符,
test.csv
在最后一行没有换行符
在最后一行按enter键并保存后,它现在可以工作了
解决方案:重写换行规则,使最后一个换行符可选
或使用java在从文件读取的字符串末尾添加换行符(我选择此选项)
您能告诉我们您的语法、如何调用TestRig以及
fileContent
的内容是什么吗?我假设你是从一个文件中读取的,对吗?你大概在同一个文件上运行了测试装置,对吗?你能给我们看一下你用来读取文件的代码吗?请注意,您实际上不必将文件读入字符串来解析它。您可以直接从文件创建CharStream
。@sepp2k添加了您请求的信息,我现在使用antlr提供的文件读取(问题仍然存在)。所以您不是在test.csv上运行TestRig,而是手动输入?运行java时会发生什么。。。CSV启动-gui测试.CSV
?那么test.csv的内容是什么呢?根据我的记忆,您必须使用ANTLRInputStream
来输入lexer。你试过了吗?@RavenANTLRInputStream
不推荐使用CharStreams.from…
是当前ANTLR版本中创建CharStream
s的首选方法。您能告诉我们您的语法、如何调用测试装备以及fileContent
的内容吗?我假设你是从一个文件中读取的,对吗?你大概在同一个文件上运行了测试装置,对吗?你能给我们看一下你用来读取文件的代码吗?请注意,您实际上不必将文件读入字符串来解析它。您可以直接从文件创建CharStream
。@sepp2k添加了您请求的信息,我现在使用antlr提供的文件读取(问题仍然存在)。所以您不是在test.csv上运行TestRig,而是手动输入?运行java时会发生什么。。。CSV启动-gui测试.CSV
?那么test.csv的内容是什么呢?根据我的记忆,您必须使用ANTLRInputStream
来输入lexer。你试过了吗?@RavenANTLRInputStream
不推荐使用CharStreams.from…
是在当前ANTLR版本中创建CharStream
s的首选方法。
if(!fileContent.endsWith("\n")) {
fileContent += "\n";
}