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 に答える