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 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); }