当前位置: 首页 > 知识库问答 >
问题:

ANTLR解析在使用TestRig时工作,但在使用Java解析时失败

冯玮
2023-03-14

我有一个评估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也会这样做,那么这怎么可能成功,而这怎么可能失败呢?

下面是测试。我用来测试的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

我也有同样的错误。

共有1个答案

闻人德庸
2023-03-14

所以问题是,我的语法要求在每一行的末尾换行,然后进行测试。csv最后一行没有换行符!

在最后一行点击回车键并保存后,它现在可以工作了。

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

if(!fileContent.endsWith("\n")) {
    fileContent += "\n";
}
 类似资料:
  • 从这里使用Lexer和解析器: https://raw.githubusercontent.com/antlr/grammars-v4/master/java/JavaLexer.g4 https://raw.githubusercontent.com/antlr/grammars-v4/master/java/JavaParser.g4 使用antlr-4.6生成Python3目标 antlr-

  • 我已经尝试了整整一周使用antlr构建一个语法,允许我解析电子邮件消息。 我的目标不是将整个电子邮件彻底解析为令牌,而是将其分解为相关部分。 这是我必须处理的文档格式。描述不属于消息一部分的内联注释: 我面临的问题如下: 我没有想出一个好方法来跳过消息开头的文本,并在找到标记后才开始应用解析规则。截面类型1 捕获节开始和句子标记之间节内的所有文本 在SECTION\u结束标记之后,忽略后面的所有文

  • 我在这里使用的是一步语法,当我运行grun时,它非常有效: 但是,当使用具有以下代码的生成的java解析器运行时: 我得到这个错误:

  • 我使用ANTLR Version4创建编译器。第一阶段是Lexer部分。我创建了“compilerlexer.g4”文件,并在其中输入了lexer规则。 compilerlexer.g4: null 有几十个这样的警告和错误。病因是什么? 一般问题:使用组合语法和单独使用lexer和parser有什么不同?如何连接单独的语法和lexer文件?

  • 您好,我需要一些关于使用antlr和java构建简单解析树的帮助。我曾尝试使用powershell编译和运行语法文件(即pascal.g4文件),我希望从中生成一些java文件,但有时我尝试使用命令“\antlr.bat-package pdl-o pdl。\pascal.g4”在powershell上收到一条消息,说明“系统找不到指定的文件”。 我想我输入的命令可能是错误的,但无论如何,我已经得

  • 问题内容: 我正在尝试解析格式的字符串 放入日期对象。我的代码如下: 但是我遇到了“解析错误”。我无法更改日期的输入格式,也无法将时区设置为静态值,因为此代码将在Andorid设备上运行。如何将这个字符串解析为date? 问题答案: 使用java.time框架(JSR 310),您可以执行以下操作: …打印: 2014-02-01T15:00:19 + 11:00 [澳大利亚/悉尼] 虽然我不确定