protected void checkPrediction(DFA dfa, string input, int expected) //throws Exception { ANTLRStringStream stream = new ANTLRStringStream(input); assertEquals(dfa.Predict(stream), expected); }
public void TestFiniteCommonLeftPrefixes() /*throws Exception*/ { Grammar g = new Grammar( "lexer grammar t;\n" + "A : 'a' 'b' | 'a' 'c' | 'd' 'e' ;"); g.BuildNFA(); g.CreateLookaheadDFAs(false); DFA dfa = g.GetLookaheadDFA(1); checkPrediction(dfa, "ab", 1); checkPrediction(dfa, "ac", 2); checkPrediction(dfa, "de", 3); checkPrediction(dfa, "q", NFA.INVALID_ALT_NUMBER); }
public void TestSimpleAltCharTest() /*throws Exception*/ { Grammar g = new Grammar( "lexer grammar t;\n" + "A : {;}'a' | 'b' | 'c';"); g.BuildNFA(); g.CreateLookaheadDFAs(false); DFA dfa = g.GetLookaheadDFA(1); checkPrediction(dfa, "a", 1); checkPrediction(dfa, "b", 2); checkPrediction(dfa, "c", 3); checkPrediction(dfa, "d", NFA.INVALID_ALT_NUMBER); }
public void TestSimpleLoops() /*throws Exception*/ { Grammar g = new Grammar( "lexer grammar t;\n" + "A : (DIGIT)+ '.' DIGIT | (DIGIT)+ ;\n" + "fragment DIGIT : '0'..'9' ;\n"); g.BuildNFA(); g.CreateLookaheadDFAs(false); DFA dfa = g.GetLookaheadDFA(3); checkPrediction(dfa, "32", 2); checkPrediction(dfa, "999.2", 1); checkPrediction(dfa, ".2", NFA.INVALID_ALT_NUMBER); }
public void TestSets() /*throws Exception*/ { Grammar g = new Grammar( "lexer grammar t;\n" + "A : {;}'a'..'z' | ';' | '0'..'9' ;"); g.BuildNFA(); g.CreateLookaheadDFAs(false); DFA dfa = g.GetLookaheadDFA(1); checkPrediction(dfa, "a", 1); checkPrediction(dfa, "q", 1); checkPrediction(dfa, "z", 1); checkPrediction(dfa, ";", 2); checkPrediction(dfa, "9", 3); }
public void TestLexerDelegatorRuleOverridesDelegateLeavingNoRules() /*throws Exception*/ { // M.Tokens has nothing to predict tokens from S. Should // not include S.Tokens alt in this case? string slave = "lexer grammar S;\n" + "A : 'a' {System.out.println(\"S.A\");} ;\n"; mkdir(tmpdir); writeFile(tmpdir, "S.g", slave); string master = "lexer grammar M;\n" + "import S;\n" + "A : 'a' {System.out.println(\"M.A\");} ;\n" + "WS : (' '|'\\n') {skip();} ;\n"; writeFile(tmpdir, "M.g", master); ErrorQueue equeue = new ErrorQueue(); ErrorManager.SetErrorListener(equeue); AntlrTool antlr = newTool(new string[] { "-lib", tmpdir }); CompositeGrammar composite = new CompositeGrammar(); Grammar g = new Grammar(antlr, tmpdir + "/M.g", composite); composite.SetDelegationRoot(g); g.ParseAndBuildAST(); composite.AssignTokenTypes(); composite.DefineGrammarSymbols(); composite.CreateNFAs(); g.CreateLookaheadDFAs(false); // predict only alts from M not S string expectingDFA = ".s0-'a'->.s1\n" + ".s0-{'\\n', ' '}->:s3=>2\n" + ".s1-<EOT>->:s2=>1\n"; Antlr3.Analysis.DFA dfa = g.GetLookaheadDFA(1); FASerializer serializer = new FASerializer(g); string result = serializer.Serialize(dfa.startState); assertEquals(expectingDFA, result); // must not be a "unreachable alt: Tokens" error assertEquals("unexpected errors: " + equeue, 0, equeue.errors.Count); }
protected void checkDecision(Grammar g, int decision, string expecting, int[] expectingUnreachableAlts) //throws Exception { Antlr3.AntlrTool tool = new Antlr3.AntlrTool(); // mimic actions of org.antlr.Tool first time for grammar g if (g.CodeGenerator == null) { CodeGenerator generator = new CodeGenerator(tool, g, "Java"); g.CodeGenerator = generator; g.BuildNFA(); g.CreateLookaheadDFAs(false); } DFA dfa = g.GetLookaheadDFA(decision); assertNotNull("unknown decision #" + decision, dfa); FASerializer serializer = new FASerializer(g); string result = serializer.Serialize(dfa.startState); //System.out.print(result); var nonDetAlts = dfa.UnreachableAlts; //System.out.println("alts w/o predict state="+nonDetAlts); // first make sure nondeterministic alts are as expected if (expectingUnreachableAlts == null) { if (nonDetAlts != null && nonDetAlts.Count != 0) { Console.Error.WriteLine("nondeterministic alts (should be empty): " + ((IList)nonDetAlts).ToElementString()); } assertEquals("unreachable alts mismatch", 0, nonDetAlts != null ? nonDetAlts.Count : 0); } else { for (int i = 0; i < expectingUnreachableAlts.Length; i++) { assertTrue("unreachable alts mismatch", nonDetAlts != null ? nonDetAlts.Contains(expectingUnreachableAlts[i]) : false); } } assertEquals(expecting, result); }
public void TestLeftRecursivePred() /*throws Exception*/ { // No analysis possible. but probably good to fail. Not sure we really want // left-recursion even if guarded with pred. Grammar g = new Grammar( "parser grammar P;\n" + "s : a ;\n" + "a : {p1}? a | ID ;\n"); DecisionProbe.verbose = true; // make sure we get all error info ErrorQueue equeue = new ErrorQueue(); ErrorManager.SetErrorListener(equeue); CodeGenerator generator = new CodeGenerator(newTool(), g, "Java"); g.CodeGenerator = generator; if (g.NumberOfDecisions == 0) { g.BuildNFA(); g.CreateLookaheadDFAs(false); } DFA dfa = g.GetLookaheadDFA(1); assertEquals(null, dfa); // can't analyze. /* * String expecting = * ".s0-ID->.s1\n" + * ".s1-{p1}?->:s2=>1\n" + * ".s1-{true}?->:s3=>2\n"; * String result = serializer.serialize(dfa.startState); * assertEquals(expecting, result); */ assertEquals("unexpected number of expected problems", 1, equeue.size()); Message msg = equeue.errors[0]; assertTrue("warning must be a left recursion msg", msg is LeftRecursionCyclesMessage); }
public void TestLoopsWithOptimizedOutExitBranches() /*throws Exception*/ { Grammar g = new Grammar( "lexer grammar t;\n" + "A : 'x'* ~'x'+ ;\n"); string expecting = ".s0-'x'->:s1=>1\n" + ".s0-{'\\u0000'..'w', 'y'..'\\uFFFF'}->:s2=>2\n"; checkDecision(g, 1, expecting, null); // The optimizer yanks out all exit branches from EBNF blocks // This is ok because we've already verified there are no problems // with the enter/exit decision DFAOptimizer optimizer = new DFAOptimizer(g); optimizer.Optimize(); FASerializer serializer = new FASerializer(g); DFA dfa = g.GetLookaheadDFA(1); string result = serializer.Serialize(dfa.startState); expecting = ".s0-'x'->:s1=>1\n"; assertEquals(expecting, result); }
protected void checkDecision(Grammar g, int decision, string expecting, int[] expectingUnreachableAlts, int[] expectingNonDetAlts, string expectingAmbigInput, int[] expectingInsufficientPredAlts, int[] expectingDanglingAlts, int expectingNumWarnings, bool hasPredHiddenByAction) //throws Exception { DecisionProbe.verbose = true; // make sure we get all error info ErrorQueue equeue = new ErrorQueue(); ErrorManager.SetErrorListener(equeue); CodeGenerator generator = new CodeGenerator(newTool(), g, "Java"); g.CodeGenerator = generator; // mimic actions of org.antlr.Tool first time for grammar g if (g.NumberOfDecisions == 0) { g.BuildNFA(); g.CreateLookaheadDFAs(false); } if (equeue.size() != expectingNumWarnings) { Console.Error.WriteLine("Warnings issued: " + equeue); } Assert.AreEqual(expectingNumWarnings, equeue.size(), "unexpected number of expected problems"); DFA dfa = g.GetLookaheadDFA(decision); FASerializer serializer = new FASerializer(g); string result = serializer.Serialize(dfa.StartState); //System.out.print(result); var unreachableAlts = dfa.UnreachableAlts; // make sure unreachable alts are as expected if (expectingUnreachableAlts != null) { BitSet s = new BitSet(); s.AddAll(expectingUnreachableAlts); BitSet s2 = new BitSet(); s2.AddAll(unreachableAlts); Assert.AreEqual(s, s2, "unreachable alts mismatch"); } else { Assert.AreEqual(0, unreachableAlts != null ? unreachableAlts.Count : 0, "unreachable alts mismatch"); } // check conflicting input if (expectingAmbigInput != null) { // first, find nondet message Message msg = getNonDeterminismMessage(equeue.warnings); Assert.IsNotNull(msg, "no nondeterminism warning?"); Assert.IsTrue(msg is GrammarNonDeterminismMessage, "expecting nondeterminism; found " + msg.GetType().Name); GrammarNonDeterminismMessage nondetMsg = getNonDeterminismMessage(equeue.warnings); var labels = nondetMsg.probe.GetSampleNonDeterministicInputSequence(nondetMsg.problemState); string input = nondetMsg.probe.GetInputSequenceDisplay(labels); Assert.AreEqual(expectingAmbigInput, input); } // check nondet alts if (expectingNonDetAlts != null) { GrammarNonDeterminismMessage nondetMsg = getNonDeterminismMessage(equeue.warnings); Assert.IsNotNull(nondetMsg, "found no nondet alts; expecting: " + str(expectingNonDetAlts)); var nonDetAlts = nondetMsg.probe.GetNonDeterministicAltsForState(nondetMsg.problemState); // compare nonDetAlts with expectingNonDetAlts BitSet s = new BitSet(); s.AddAll(expectingNonDetAlts); BitSet s2 = new BitSet(); s2.AddAll(nonDetAlts); Assert.AreEqual(s, s2, "nondet alts mismatch"); Assert.AreEqual(hasPredHiddenByAction, nondetMsg.problemState.Dfa.HasPredicateBlockedByAction, "mismatch between expected hasPredHiddenByAction"); } else { // not expecting any nondet alts, make sure there are none GrammarNonDeterminismMessage nondetMsg = getNonDeterminismMessage(equeue.warnings); Assert.IsNull(nondetMsg, "found nondet alts, but expecting none"); } if (expectingInsufficientPredAlts != null) { GrammarInsufficientPredicatesMessage insuffPredMsg = getGrammarInsufficientPredicatesMessage(equeue.warnings); Assert.IsNotNull(insuffPredMsg, "found no GrammarInsufficientPredicatesMessage alts; expecting: " + str(expectingNonDetAlts)); var locations = insuffPredMsg.altToLocations; var actualAlts = locations.Keys; BitSet s = new BitSet(); s.AddAll(expectingInsufficientPredAlts); BitSet s2 = new BitSet(); s2.AddAll(actualAlts); Assert.AreEqual(s, s2, "mismatch between insufficiently covered alts"); Assert.AreEqual(hasPredHiddenByAction, insuffPredMsg.problemState.Dfa.HasPredicateBlockedByAction, "mismatch between expected hasPredHiddenByAction"); } else { // not expecting any nondet alts, make sure there are none GrammarInsufficientPredicatesMessage nondetMsg = getGrammarInsufficientPredicatesMessage(equeue.warnings); if (nondetMsg != null) { Console.Out.WriteLine(equeue.warnings); } Assert.IsNull(nondetMsg, "found insufficiently covered alts, but expecting none"); } Assert.AreEqual(expecting, result); }
//throws Exception protected void checkPrediction( DFA dfa, string input, int expected ) { ANTLRStringStream stream = new ANTLRStringStream( input ); assertEquals( dfa.Predict( stream ), expected ); }