LL_EXACT_AMBIG_DETECTION - Interpetation



使用PredictionMode::LL_EXACT_AMBG_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中的决策。但我还没有发现如何使用信息回到语法中的规则。谢谢你的帮助。谨致问候,Wolfgang Hämmer

以下辅助方法可以将决策编号转换为规则名称。您可以基于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];
}

相关内容

  • 没有找到相关文章

最新更新