[英]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.