fix test so it correctly illustrates bug 1480, which was fixed apparently by https://github.com/antlr/antlr4/pull/1477

This commit is contained in:
parrt 2016-12-10 10:03:44 -08:00
parent 9f51ec1e6b
commit 2053143665
1 changed files with 34 additions and 28 deletions

View File

@ -5,7 +5,6 @@ import org.antlr.v4.runtime.RuleContext;
import org.antlr.v4.runtime.atn.ATN;
import org.antlr.v4.runtime.misc.IntervalSet;
import org.antlr.v4.test.runtime.java.BaseJavaTest;
import org.antlr.v4.tool.DOTGenerator;
import org.antlr.v4.tool.Grammar;
import org.junit.Test;
@ -97,41 +96,48 @@ public class TestExpectedTokens extends BaseJavaTest {
@Test public void testFollowIncludedInLeftRecursiveRule() throws Exception {
String gtext =
"grammar T;\n" +
"s : expr EOF ;\n" +
"expr : L expr R\n"+
" | expr PLUS expr\n"+
" | ID\n"+
" ;\n";
Grammar g = new Grammar(gtext);
String atnText =
"RuleStart_expr_0->BlockStart_8\n"+
"BlockStart_8->s2\n"+
"BlockStart_8->s7\n"+
"s2-action_0:-1->s3\n"+
"s7-ID->BlockEnd_9\n"+
"s3-L->s4\n"+
"BlockEnd_9->StarLoopEntry_15\n"+
"s4-expr->RuleStart_expr_0\n"+
"StarLoopEntry_15->StarBlockStart_13\n"+
"StarLoopEntry_15->s16\n"+
"s5-R->s6\n"+
"StarBlockStart_13->s10\n"+
"s16->RuleStop_expr_1\n"+
"s6->BlockEnd_9\n"+
"s10-2 >= _p->s11\n"+
"RuleStop_expr_1->s5\n"+
"RuleStop_expr_1->BlockEnd_14\n"+
"s11-PLUS->s12\n"+
"s12-expr->RuleStart_expr_0\n"+
"BlockEnd_14->StarLoopBack_17\n"+
"StarLoopBack_17->StarLoopEntry_15\n";
"RuleStart_expr_2->BlockStart_13\n"+
"BlockStart_13->s7\n"+
"BlockStart_13->s12\n"+
"s7-action_1:-1->s8\n"+
"s12-ID->BlockEnd_14\n"+
"s8-L->s9\n"+
"BlockEnd_14->StarLoopEntry_20\n"+
"s9-expr->RuleStart_expr_2\n"+
"StarLoopEntry_20->StarBlockStart_18\n"+
"StarLoopEntry_20->s21\n"+
"s10-R->s11\n"+
"StarBlockStart_18->s15\n"+
"s21->RuleStop_expr_3\n"+
"s11->BlockEnd_14\n"+
"s15-2 >= _p->s16\n"+
"RuleStop_expr_3->s5\n"+
"RuleStop_expr_3->s10\n"+
"RuleStop_expr_3->BlockEnd_19\n"+
"s16-PLUS->s17\n"+
"s17-expr->RuleStart_expr_2\n"+
"BlockEnd_19->StarLoopBack_22\n"+
"StarLoopBack_22->StarLoopEntry_20\n";
checkRuleATN(g, "expr", atnText);
ATN atn = g.getATN();
DOTGenerator gen = new DOTGenerator(g);
String dot = gen.getDOT(atn.states.get(0), g.getRuleNames(), false);
System.out.println(dot);
int blkStartStateNumber = 9;
IntervalSet tokens = atn.getExpectedTokens(blkStartStateNumber, null);
assertEquals("{<EOF>, PLUS}", tokens.toString(g.getTokenNames()));
// DOTGenerator gen = new DOTGenerator(g);
// String dot = gen.getDOT(atn.states.get(2), g.getRuleNames(), false);
// System.out.println(dot);
// Simulate call stack after input '(x'
ParserRuleContext callStackFrom_s = new ParserRuleContext(null, 4);
ParserRuleContext callStackFrom_expr = new ParserRuleContext(callStackFrom_s, 9);
int afterID = 14;
IntervalSet tokens = atn.getExpectedTokens(afterID, callStackFrom_expr);
assertEquals("{R, PLUS}", tokens.toString(g.getTokenNames()));
}
}