java - 使用 TestRig 时 ANTLR 解析有效,但使用 Java 解析时失败

标签 java antlr antlr4

我有一个用于评估 csv 文件的语法,并且根据 TestRig 它可以正常工作。生成以下解析树:

enter image description here

但是,如果我在应用程序中使用以下 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/

相关文章:

c# - 如何报告来自 ANTLR 4 Visitor 的错误?

java - Spring Jpa LessThanEqual 用于 postgres 时间戳字段

java - 我如何在 Java 中放入三维 Liskov map ?

antlr 词法分析器规则与另一个规则的前缀匹配

java - 我可以使用 ANTLR 进行双向解析/生成吗?

java - ANTLRv4 字符串匹配

java - 无法使用命令行选项 -DsocksProxyHost 运行 Java 程序

java - ImageIcons 数组,通过拖放更改数组内容

java - 如何在 ANTLR 中分离出 block 的开始和结束标记

java - 如何在 Antlr 中使用访问者创建自定义 AST