使用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中的决策。但是我还没有弄清楚如何将这些信息用回语法中的规则。谢谢你的帮助。温馨的问候,沃尔夫冈·哈默
发布于 2013-02-07 22:09:39
以下辅助方法可以将决策编号转换为规则名称。您可以基于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];
}https://stackoverflow.com/questions/14747952
复制相似问题