2

使用 PredictionMode::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 中的一个决策。但是我还没有弄清楚如何使用这些信息回到语法中的规则。感谢您的帮助。亲切的问候,沃尔夫冈·哈默

4

1 回答 1

1

以下帮助方法可以将决策编号转换为规则名称。您可以基于这些方法创建自己的错误侦听器实现,DiagnosticErrorListener并使用这些方法在每条消息中包含规则的名称。

如果一条规则有多个决定,那么您可以在-atn为您的语法生成代码时将该标志传递给 ANTLR。获得规则名称后,查看由ruleName.dot(规则在哪里)生成的图表,您会在图表中看到一个标记为(您当前看到的数字在哪里)ruleName的节点。这将指向您发生问题的确切位置。d=decisionNumberdecisionNumber

请记住,当您更改语法时,规则和决策编号会发生变化,因此当您打开时,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];
}
于 2013-02-07T14:09:39.053 回答