ANTLR解析在使用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

我有一个用于评估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
在最后一行没有换行符

在最后一行按enter键并保存后,它现在可以工作了

解决方案:重写换行规则,使最后一个换行符可选 使用java在从文件读取的字符串末尾添加换行符(我选择此选项)


所以问题是,我的语法要求在每一行的末尾有一个换行符,
test.csv
在最后一行没有换行符

在最后一行按enter键并保存后,它现在可以工作了

解决方案:重写换行规则,使最后一个换行符可选 使用java在从文件读取的字符串末尾添加换行符(我选择此选项)


您能告诉我们您的语法、如何调用TestRig以及
fileContent
的内容是什么吗?我假设你是从一个文件中读取的,对吗?你大概在同一个文件上运行了测试装置,对吗?你能给我们看一下你用来读取文件的代码吗?请注意,您实际上不必将文件读入字符串来解析它。您可以直接从文件创建
CharStream
。@sepp2k添加了您请求的信息,我现在使用antlr提供的文件读取(问题仍然存在)。所以您不是在test.csv上运行TestRig,而是手动输入?运行
java时会发生什么。。。CSV启动-gui测试.CSV
?那么test.csv的内容是什么呢?根据我的记忆,您必须使用
ANTLRInputStream
来输入lexer。你试过了吗?@Raven
ANTLRInputStream
不推荐使用
CharStreams.from…
是当前ANTLR版本中创建
CharStream
s的首选方法。您能告诉我们您的语法、如何调用测试装备以及
fileContent
的内容吗?我假设你是从一个文件中读取的,对吗?你大概在同一个文件上运行了测试装置,对吗?你能给我们看一下你用来读取文件的代码吗?请注意,您实际上不必将文件读入字符串来解析它。您可以直接从文件创建
CharStream
。@sepp2k添加了您请求的信息,我现在使用antlr提供的文件读取(问题仍然存在)。所以您不是在test.csv上运行TestRig,而是手动输入?运行
java时会发生什么。。。CSV启动-gui测试.CSV
?那么test.csv的内容是什么呢?根据我的记忆,您必须使用
ANTLRInputStream
来输入lexer。你试过了吗?@Raven
ANTLRInputStream
不推荐使用
CharStreams.from…
是在当前ANTLR版本中创建
CharStream
s的首选方法。
if(!fileContent.endsWith("\n")) {
    fileContent += "\n";
}