List of usage examples for org.antlr.v4.runtime.atn ATNState transition
public Transition transition(int i)
From source file:com.sample.JavaErrorStrategy.java
License:BSD License
/** * This method implements the single-token insertion inline error recovery * strategy. It is called by {@link #recoverInline} if the single-token * deletion strategy fails to recover from the mismatched input. If this * method returns {@code true}, {@code recognizer} will be in error recovery * mode.//from w w w . j a va 2s.c o m * * <p> * This method determines whether or not single-token insertion is viable by * checking if the {@code LA(1)} input symbol could be successfully matched * if it were instead the {@code LA(2)} symbol. If this method returns * {@code true}, the caller is responsible for creating and inserting a * token with the correct type to produce this behavior. * </p> * * @param recognizer * the parser instance * @return {@code true} if single-token insertion is a viable recovery * strategy for the current mismatched input, otherwise * {@code false} */ protected boolean singleTokenInsertion(@NotNull Parser recognizer) { int currentSymbolType = recognizer.getInputStream().LA(1); // if current token is consistent with what could come after current // ATN state, then we know we're missing a token; error recovery // is free to conjure up and insert the missing token ATNState currentState = recognizer.getInterpreter().atn.states.get(recognizer.getState()); ATNState next = currentState.transition(0).target; ATN atn = recognizer.getInterpreter().atn; IntervalSet expectingAtLL2 = atn.nextTokens(next, recognizer.getContext()); // System.out.println("LT(2) set="+expectingAtLL2.toString(recognizer.getTokenNames())); if (expectingAtLL2.contains(currentSymbolType)) { reportMissingToken(recognizer); return true; } return false; }
From source file:com.sample.JavaErrorStrategy.java
License:BSD License
@NotNull protected IntervalSet getErrorRecoverySet(@NotNull Parser recognizer) { ATN atn = recognizer.getInterpreter().atn; RuleContext ctx = recognizer.getContext(); IntervalSet recoverSet = new IntervalSet(); while (ctx != null && ctx.invokingState >= 0) { // compute what follows who invoked us ATNState invokingState = atn.states.get(ctx.invokingState); RuleTransition rt = (RuleTransition) invokingState.transition(0); IntervalSet follow = atn.nextTokens(rt.followState); recoverSet.addAll(follow);/* w w w . ja v a2 s .c om*/ ctx = ctx.parent; } recoverSet.remove(Token.EPSILON); // System.out.println("recover set "+recoverSet.toString(recognizer.getTokenNames())); return recoverSet; }