当前位置: 首页 > 面试题库 >

如何获取antlr解析错误消息?

孙永嘉
2023-03-14
问题内容

我用antlr 4.4编写了这样的语法:

grammar CSV;

file
  :  row+ EOF
  ;

row
  :  value (Comma value)* (LineBreak | EOF)
  ;

value
  :  SimpleValueA
  |  QuotedValue
  ;

Comma
  :  ','
  ;

LineBreak
  :  '\r'? '\n'
  |  '\r'
  ;

SimpleValue
  :  ~(',' | '\r' | '\n' | '"')+
  ;

QuotedValue
  :  '"' ('""' | ~'"')* '"'
  ;

然后我使用antlr 4.4生成解析器和词法分析器,此过程成功

生成类后,我编写了一些使用语法的Java代码

import org.antlr.v4.runtime.ANTLRInputStream;
import org.antlr.v4.runtime.CommonTokenStream;

public class Main {

    public static void main(String[] args)
    {
        String source =  "\"a\",\"b\",\"c";
        CSVLexer lex = new CSVLexer(new ANTLRInputStream(source));
        CommonTokenStream tokens = new CommonTokenStream(lex);
        tokens.fill();
        CSVParser parser = new CSVParser(tokens);
        CSVParser.FileContext file = parser.file();
    }
}

以上所有代码都是CSV字符串的解析器,例如:““ a”,“ b”,c“

窗口输出:

line 1:8 token recognition error at: '"c'
line 1:10 missing {SimpleValue, QuotedValue} at '<EOF>'

我想知道如何从代码背后的方法(getErrors()或…)中获取此错误,而不是由于输出窗口的结果

谁能帮我 ?


问题答案:

使用ANTLR进行CSV解析是一种恕我直言的选择,但是既然您在做…

  • 实现接口ANTLRErrorListener。您可以BaseErrorListener为此扩展。收集错误并将它们附加到列表中。
  • 调用parser.removeErrorListeners()以删除默认侦听器
  • 打电话parser.addErrorListener(yourListenerInstance)添加自己的听众
  • 解析您的输入

现在,对于词法分析器,您可以做同样的事情removeErrorListeners/ addErrorListener,或者在末尾添加以下规则:

UNKNOWN_CHAR : . ;

有了这个规则,词法分析器将永远不会失败(它将UNKNOWN_CHAR在无法执行其他任何操作时生成令牌),并且所有错误将由解析器生成(因为它将不知道如何处理这些UNKNOWN_CHAR令牌)。我推荐这种方法。



 类似资料:
  • 我希望看到一条消息说“xyz行的语法错误”,“预期的。但相反,对于每一个由我丢失的逗号引起的后续错误,在xyz处都有一个获得一百个不可行的替代方案的列表。 有没有一种方法可以得到一个错误,这是由缺少逗号造成的?如果它会抱怨意外的var2令牌,也是完全可以的。

  • 问题内容: 我正在构建用于学习的编程laguange的简单语法。 我遇到了奇怪的错误,对我来说毫无意义。 我正在使用此语法的预构建词法分析器和解析器: 我正在解析此Java代码: 最后是我要解析的字符串: 问题答案: 错误消息表示包含值“ void”的预期令牌类型与通过使用输入中的字符串“ void”产生的实际令牌类型不匹配。查看您的词法分析器规则,表明IDENTIFIER规则正在使用输入字符串’

  • 我正在编写一种类似SQL的语言。假设正确的语法是 但我把它打到 默认行为是Antlr将停止解析,我丢失了语法高亮显示和大纲视图。错误消息是“US”处缺少EOF。我将IParser重新绑定到RuntimeModule中的自定义解析器 重写 并重写方法handle this part以使用所有令牌直到分号 在这个匹配符号之后是,但是语法高亮仍然消失,antlr停止解析。我如何才能实现我的目标? ===

  • 5.3 将代码解析成错误消息 {#toc_3} 在之前我们已经谈论了数据绑定和验证,最后一件值得讨论的事情是输出对应于验证错误的消息。在我们上面展示的例子里,我们拒绝了name和age字段。如果我们要使用MessageSource来输出错误消息,我们将会使用我们在拒绝该字段(这个情况下是’姓名’和’年龄’)时给出的错误代码。当你调用(不管是直接调用还是间接通过使用ValidationUtils类调

  • 我可以使用以下方法获取第一个

  • 从上下文菜单中选择: 谢谢