From d93164a5bfc297aeebeeaf51503a20ced304fb52 Mon Sep 17 00:00:00 2001 From: Bluemond Date: Wed, 17 Sep 2025 17:42:23 +0800 Subject: [PATCH] fix(java): ATN.getExpectedTokens expects RuleTransition but gets EpsilonTransition (issue #4843) --- runtime/Java/src/org/antlr/v4/runtime/atn/ATN.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/runtime/Java/src/org/antlr/v4/runtime/atn/ATN.java b/runtime/Java/src/org/antlr/v4/runtime/atn/ATN.java index 96f71f8d3f..22b007a742 100644 --- a/runtime/Java/src/org/antlr/v4/runtime/atn/ATN.java +++ b/runtime/Java/src/org/antlr/v4/runtime/atn/ATN.java @@ -180,7 +180,12 @@ public IntervalSet getExpectedTokens(int stateNumber, RuleContext context) { expected.remove(Token.EPSILON); while (ctx != null && ctx.invokingState >= 0 && following.contains(Token.EPSILON)) { ATNState invokingState = states.get(ctx.invokingState); - RuleTransition rt = (RuleTransition)invokingState.transition(0); + Transition t = invokingState.transition(0); + while (t instanceof EpsilonTransition) { + EpsilonTransition et = (EpsilonTransition) t; + t = et.target.transition(0); + } + RuleTransition rt = (RuleTransition) t; following = nextTokens(rt.followState); expected.addAll(following); expected.remove(Token.EPSILON);