簡體   English   中英

處理Antlr語法錯誤或如何在意外令牌上提供更好的消息

[英]Handling Antlr Syntax Errors or how to give a better message on unexpected token

我們有一個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錯誤處理,但我想我會在這里發布以尋找一些見解。

您應該覆蓋詞法分析器和解析器中的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時,您可以向用戶提供任何自定義的錯誤消息。

你可以通過覆蓋DefaultErrorStrategy一些消息來嘗試使用ANTLRErrorStrategy

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM