crap. fixing regression. was adding way too many followlinks.

[git-p4: depot-paths = "//depot/code/antlr4/main/": change = 9527]
This commit is contained in:
parrt 2011-12-04 19:01:55 -08:00
parent 2ddb8100e9
commit 265a189a86
1 changed files with 9 additions and 19 deletions

View File

@ -58,21 +58,6 @@ import java.util.List;
* No side-effects. It builds an ATN object and returns it. * No side-effects. It builds an ATN object and returns it.
*/ */
public class ParserATNFactory implements ATNFactory { public class ParserATNFactory implements ATNFactory {
/** Add follow links from rule stop states to every following state for rule invocations.
* Must do after construction since we optimize away some epsilon transitions.
*/
class FollowLinkAdder extends ATNVisitor {
@Override
public void visitState(ATNState p) {
if ( p.getClass() == ATNState.class && p.getNumberOfTransitions()==1 &&
p.transition(0) instanceof RuleTransition )
{
RuleTransition rt = (RuleTransition) p.transition(0);
addFollowLink(rt.ruleIndex, rt.followState);
}
}
}
class TailEpsilonRemover extends ATNVisitor { class TailEpsilonRemover extends ATNVisitor {
@Override @Override
public void visitState(ATNState p) { public void visitState(ATNState p) {
@ -241,6 +226,7 @@ public class ParserATNFactory implements ATNFactory {
public void addFollowLink(int ruleIndex, ATNState right) { public void addFollowLink(int ruleIndex, ATNState right) {
// add follow edge from end of invoked rule // add follow edge from end of invoked rule
RuleStopState stop = atn.ruleToStopState[ruleIndex]; RuleStopState stop = atn.ruleToStopState[ruleIndex];
// System.out.println("add follow link from "+ruleIndex+" to "+right);
epsilon(stop, right); epsilon(stop, right);
} }
@ -521,10 +507,14 @@ public class ParserATNFactory implements ATNFactory {
} }
public void addRuleFollowLinks() { public void addRuleFollowLinks() {
FollowLinkAdder flinker = new FollowLinkAdder(); for (ATNState p : atn.states) {
for (Rule r : g.rules.values()) { if ( p!=null &&
ATNState start = atn.ruleToStartState[r.index]; p.getClass() == ATNState.class && p.getNumberOfTransitions()==1 &&
flinker.visit(start); p.transition(0) instanceof RuleTransition )
{
RuleTransition rt = (RuleTransition) p.transition(0);
addFollowLink(rt.ruleIndex, rt.followState);
}
} }
} }