使用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];
}