处理Antlr语法错误或如何在意外令牌上提供更好的消息

问题描述 投票:5回答:2

我们有一个Antlr语法的以下子部分:

signed_int
        : SIGN? INT
    ;

INT : '0'..'9'+
        ;

当有人输入一个数值时,一切都很好,但如果他们错误地输入类似1O(一个和大写o)的东西,我们会得到一个神秘的错误信息:

error 1 : Missing token  at offset 14
near [Index: 0 (Start: 0-Stop: 0) ='<missing COLON>'     type<24> Line: 26 LinePos:14]
 : syntax error...

处理此类错误的好方法是什么?我想过定义catch-all SYMBOL令牌类型,但这会导致解析器构建错误太多。我将继续研究Antlr错误处理,但我想我会在这里发布以寻找一些见解。

parsing error-handling antlr
2个回答
4
投票

您应该覆盖词法分析器和解析器中的reportError方法。您可以通过将此代码添加到词法分析器文件来完成此操作:

  @Override
public void reportError(RecognitionException e) {
    throw new RuntimeException(e);
}

并在解析器中创建一个方法匹配,检查输入字符串是否与指定的语法匹配:

 public static boolean matches(String input) {
     try {
         regExLexer lexer = new regExLexer(new ANTLRStringStream(input));
         regExParser parser = new regExParser(new CommonTokenStream(lexer));
         parser.goal();
         return true;
     } catch (RuntimeException e) {
         return false;
     }
     catch (Exception e) {
         return false;
     }
     catch (OutOfMemoryError e) {
         return false;
     }

 }

 @Override
 public void reportError(RecognitionException e) {
     throw new RuntimeException(e);
 }

然后在你的文件中使用Parser.matches(输入);检查给定输入是否与gramar匹配。如果匹配,则该方法返回true,否则返回false,因此当它返回false时,您可以向用户提供任何自定义的错误消息。


0
投票

您可以尝试使用ANTLRErrorStrategy,通过覆盖DefaultErrorStrategy中的一些消息。

© www.soinside.com 2019 - 2024. All rights reserved.