protected DFAState addDFAEdge(DFAState from,
								  int t,
								  ATNConfigSet q)
	{
		/* leading to this call, ATNConfigSet.hasSemanticContext is used as a
		 * marker indicating dynamic predicate evaluation makes this edge
		 * dependent on the specific input sequence, so the static edge in the
		 * DFA should be omitted. The target DFAState is still created since
		 * execATN has the ability to resynchronize with the DFA state cache
		 * following the predicate evaluation step.
		 *
		 * TJP notes: next time through the DFA, we see a pred again and eval.
		 * If that gets us to a previously created (but dangling) DFA
		 * state, we can continue in pure DFA mode from there.
		 */
		boolean suppressEdge = q.hasSemanticContext;
		q.hasSemanticContext = false;


		DFAState to = addDFAState(q);

		if (suppressEdge) {
			return to;
		}

		addDFAEdge(from, t, to);
		return to;
	}
Evaluate a predicate specified in the lexer.

<p>If {@code speculative} is {@code true}, this method was called before
{@link #consume} for the matched character. This method should call
{@link #consume} before evaluating the predicate to ensure position
sensitive values, including {@link Lexer#getText}, {@link Lexer#getLine},
and {@link Lexer#getCharPositionInLine}, properly reflect the current
lexer state. This method should restore {@code input} and the simulator
to the original state before returning (i.e. undo the actions made by the
call to {@link #consume}.</p>

@param input The input stream.
@param ruleIndex The rule containing the predicate.
@param predIndex The index of the predicate within the rule.
@param speculative {@code true} if the current index in {@code input} is
one character before the predicate's location.

@return {@code true} if the specified predicate evaluates to
{@code true}.
runtime/Java/src/org/antlr/v4/runtime/atn/LexerATNSimulator.java