in jflex/src/main/java/jflex/core/NFA.java [177:237]
public void addRegExp(int regExpNum) {
if (Build.DEBUG)
Out.debug(
"Adding nfa for regexp " + regExpNum + " :" + Out.NL + regExps.getRegExp(regExpNum));
IntPair nfa = insertNFA(regExps.getRegExp(regExpNum));
List<Integer> lexStates = regExps.getStates(regExpNum);
if (lexStates.isEmpty()) lexStates = scanner.states.getInclusiveStates();
for (Integer stateNum : lexStates) {
if (!regExps.isBOL(regExpNum)) addEpsilonTransition(2 * stateNum, nfa.start());
addEpsilonTransition(2 * stateNum + 1, nfa.start());
}
if (regExps.getLookAhead(regExpNum) != null) {
Action a = regExps.getAction(regExpNum);
if (a != null && a.lookAhead() == Action.Kind.FINITE_CHOICE) {
insertLookAheadChoices(nfa.end(), a, regExps.getLookAhead(regExpNum));
// remove the original action from the collection: it will never
// be matched directly, only its copies will.
scanner.actions.remove(a);
} else {
RegExp r1 = regExps.getRegExp(regExpNum);
RegExp r2 = regExps.getLookAhead(regExpNum);
IntPair look = insertNFA(r2);
addEpsilonTransition(nfa.end(), look.start());
action[look.end()] = a;
isFinal[look.end()] = true;
if (a != null && a.lookAhead() == Action.Kind.GENERAL_LOOK) {
// base forward pass
IntPair forward = insertNFA(r1);
// lookahead backward pass
IntPair backward = insertNFA(r2.rev());
isFinal[forward.end()] = true;
action[forward.end()] = new Action(Action.Kind.FORWARD_ACTION);
isFinal[backward.end()] = true;
action[backward.end()] = new Action(Action.Kind.BACKWARD_ACTION);
int entry = 2 * (regExps.getLookEntry(regExpNum) + numLexStates);
addEpsilonTransition(entry, forward.start());
addEpsilonTransition(entry + 1, backward.start());
a.setEntryState(entry);
}
}
} else {
action[nfa.end()] = regExps.getAction(regExpNum);
isFinal[nfa.end()] = true;
}
}