我有一个用于评估 csv 文件的语法,并且根据 TestRig 它可以正常工作。生成以下解析树:
但是,如果我在应用程序中使用以下 java 代码,则解析失败并出现错误:
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
在最后一行没有换行符!
在最后一行按回车键并保存后,它现在可以工作了。
解决方案:重写行规则以使最后一个换行符可选 或使用java在从文件读取的字符串末尾添加换行符(我选择这个)
if(!fileContent.endsWith("\n")) {
fileContent += "\n";
}
关于java - 使用 TestRig 时 ANTLR 解析有效,但使用 Java 解析时失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60247681/