2013-02-07 20 views
2

當使用PredictionMode :: LL_EXACT_AMBIG_DETECTION我收到以下錯誤信息:LL_EXACT_AMBIG_DETECTION - 一種解讀

line 186:7 reportAttemptingFullContext d=30, input='ON REPORT HEAD 

我怎麼解釋d屬性。它是否在我的語法中引用規則,以及如何找出哪些規則?

據的代碼:

@Override 
public void reportAttemptingFullContext(@NotNull Parser recognizer, 
    @NotNull DFA dfa, 
    int startIndex, int stopIndex, 
    @NotNull ATNConfigSet configs) 
{ 
     recognizer.notifyErrorListeners("reportAttemptingFullContext d=" + 
      dfa.decision + ", input='" + 
      recognizer.getTokenStream().getText(Interval.of(startIndex, stopIndex)) + "'"); 
} 

屬性d是DFA中的決定。但我還沒有發現如何在語法中使用這些信息回到規則。 感謝您的幫助。 致以問候, WolfgangHämmer

回答

1

以下幫助程序方法可以將決策編號轉換爲規則名稱。您可以根據DiagnosticErrorListener創建您自己的錯誤偵聽器實現,並使用這些方法在每條消息中包含規則的名稱。

如果規則有多個決定,那麼當您爲語法生成代碼時,您可以將-atn標誌傳遞給ANTLR。一旦你有了規則的名稱,看看由ruleName.dot(其中ruleName是規則)生成的圖表,並且您將在圖中標有d=decisionNumber(其中decisionNumber是您當前看到的數字)中看到一個節點。這會指向您正在發生問題的確切位置。

請記住,當您更改語法時,規則和決定編號會發生變化,因此當您打開ruleName.dot時,您需要驗證每個重新生成語法代碼的實際決策編號。

public static int getDecisionRule(Recognizer<?, ?> recognizer, int decision) { 
    if (recognizer == null || decision < 0) { 
     return -1; 
    } 

    if (decision >= recognizer.getATN().decisionToState.size()) { 
     return -1; 
    } 

    return recognizer.getATN().decisionToState.get(decision).ruleIndex; 
} 

public static String getRuleDisplayName(Recognizer<?, ?> recognizer, int ruleIndex) { 
    if (recognizer == null || ruleIndex < 0) { 
     return Integer.toString(ruleIndex); 
    } 

    String[] ruleNames = recognizer.getRuleNames(); 
    if (ruleIndex < 0 || ruleIndex >= ruleNames.length) { 
     return Integer.toString(ruleIndex); 
    } 

    return ruleNames[ruleIndex]; 
} 
+0

Hi Sam, 這就是這麼酷! 非常感謝您的幫助! Greetings,wolf –