示例#1
0
        protected void checkError(ErrorQueue equeue,
                                  GrammarSemanticsMessage expectedMessage)
        //throws Exception
        {
            /*
             * System.out.println(equeue.infos);
             * System.out.println(equeue.warnings);
             * System.out.println(equeue.errors);
             */
            Message foundMsg = null;

            for (int i = 0; i < equeue.errors.Count; i++)
            {
                Message m = (Message)equeue.errors[i];
                if (m.msgID == expectedMessage.msgID)
                {
                    foundMsg = m;
                }
            }
            assertTrue("no error; " + expectedMessage.msgID + " expected", equeue.errors.Count > 0);
            assertTrue("too many errors; " + equeue.errors, equeue.errors.Count <= 1);
            assertTrue("couldn't find expected error: " + expectedMessage.msgID, foundMsg != null);
            assertTrue("error is not a GrammarSemanticsMessage",
                       foundMsg is GrammarSemanticsMessage);
            assertEquals(expectedMessage.arg, foundMsg.arg);
            assertEquals(expectedMessage.arg2, foundMsg.arg2);
        }
示例#2
0
        public void TestCannotHaveSpaceAfterDot() /*throws Exception*/
        {
            string action = "%x. y = z;";
            //String expecting = null;

            ErrorQueue equeue = new ErrorQueue();

            ErrorManager.SetErrorListener(equeue);
            Grammar g = new Grammar(
                "grammar t;\n" +
                "options {\n" +
                "    output=template;\n" +
                "}\n" +
                "\n" +
                "a : ID {" + action + "}\n" +
                "  ;\n" +
                "\n" +
                "ID : 'a';\n");
            AntlrTool     antlr     = newTool();
            CodeGenerator generator = new CodeGenerator(antlr, g, "Java");

            g.CodeGenerator = generator;
            generator.GenRecognizer(); // forces load of templates

            int    expectedMsgID = ErrorManager.MSG_INVALID_TEMPLATE_ACTION;
            object expectedArg   = "%x.";
            GrammarSemanticsMessage expectedMessage =
                new GrammarSemanticsMessage(expectedMsgID, g, null, expectedArg);

            checkError(equeue, expectedMessage);
        }
        public void TestSameStringTwoNames() /*throws Exception*/
        {
            ErrorQueue equeue = new ErrorQueue();

            ErrorManager.SetErrorListener(equeue);
            string slave =
                "parser grammar S;\n" +
                "tokens { A='a'; }\n" +
                "x : A {System.out.println(\"S.x\");} ;\n";

            mkdir(tmpdir);
            writeFile(tmpdir, "S.g", slave);
            string slave2 =
                "parser grammar T;\n" +
                "tokens { X='a'; }\n" +
                "y : X {System.out.println(\"T.y\");} ;\n";

            mkdir(tmpdir);
            writeFile(tmpdir, "T.g", slave2);

            string master =
                "grammar M;\n" +
                "import S,T;\n" +
                "s : x y ;\n" +
                "WS : (' '|'\\n') {skip();} ;\n";

            writeFile(tmpdir, "M.g", master);
            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();
            g.composite.AssignTokenTypes();

            string expectedTokenIDToTypeMap       = "[A=4, WS=5, X=6]";
            string expectedStringLiteralToTypeMap = "{'a'=4}";
            string expectedTypeToTokenList        = "[A, WS, X]";

            Assert.AreEqual(expectedTokenIDToTypeMap,
                            realElements(g.composite.TokenIDToTypeMap).ToElementString());
            Assert.AreEqual(expectedStringLiteralToTypeMap, g.composite.StringLiteralToTypeMap.ToElementString());
            Assert.AreEqual(expectedTypeToTokenList,
                            realElements(g.composite.TypeToTokenList).ToElementString());

            object expectedArg   = "X='a'";
            object expectedArg2  = "A";
            int    expectedMsgID = ErrorManager.MSG_TOKEN_ALIAS_CONFLICT;
            GrammarSemanticsMessage expectedMessage =
                new GrammarSemanticsMessage(expectedMsgID, g, null, expectedArg, expectedArg2);

            checkGrammarSemanticsError(equeue, expectedMessage);

            Assert.AreEqual(1, equeue.errors.Count, "unexpected errors: " + equeue);

            string expectedError =
                "error(158): T.g:2:10: cannot alias X='a'; string already assigned to A";

            Assert.AreEqual(expectedError, equeue.errors[0].ToString());
        }
示例#4
0
        public void TestSameNameTwoStrings() /*throws Exception*/
        {
            Assert.Inconclusive("May be failing on just my port...");
            ErrorQueue equeue = new ErrorQueue();

            ErrorManager.SetErrorListener(equeue);
            string slave =
                "parser grammar S;\n" +
                "tokens { A='a'; }\n" +
                "x : A {System.out.println(\"S.x\");} ;\n";

            mkdir(tmpdir);
            writeFile(tmpdir, "S.g", slave);
            string slave2 =
                "parser grammar T;\n" +
                "tokens { A='x'; }\n" +
                "y : A {System.out.println(\"T.y\");} ;\n";

            writeFile(tmpdir, "T.g", slave2);

            string master =
                "grammar M;\n" +
                "import S,T;\n" +
                "s : x y ;\n" +
                "WS : (' '|'\\n') {skip();} ;\n";

            writeFile(tmpdir, "M.g", master);
            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();
            g.composite.AssignTokenTypes();

            string expectedTokenIDToTypeMap       = "[A=4, T__6=6, WS=5]";
            string expectedStringLiteralToTypeMap = "{'a'=4, 'x'=6}";
            string expectedTypeToTokenList        = "[A, WS, T__6]";

            assertEquals(expectedTokenIDToTypeMap,
                         realElements(g.composite.tokenIDToTypeMap).ToElementString());
            assertEquals(expectedStringLiteralToTypeMap, sortMapToString(g.composite.stringLiteralToTypeMap));
            assertEquals(expectedTypeToTokenList,
                         realElements(g.composite.typeToTokenList).ToElementString());

            object expectedArg   = "A='x'";
            object expectedArg2  = "'a'";
            int    expectedMsgID = ErrorManager.MSG_TOKEN_ALIAS_REASSIGNMENT;
            GrammarSemanticsMessage expectedMessage =
                new GrammarSemanticsMessage(expectedMsgID, g, null, expectedArg, expectedArg2);

            checkGrammarSemanticsError(equeue, expectedMessage);

            assertEquals("unexpected errors: " + equeue, 1, equeue.errors.Count);

            string expectedError =
                "error(159): T.g:2:10: cannot alias A='x'; token name already assigned to 'a'";

            assertEquals(expectedError, equeue.errors[0].ToString());
        }
示例#5
0
        public void TestMessageStringificationIsConsistent() /*throws Exception*/
        {
            string     action = "$other.tree = null;";
            ErrorQueue equeue = new ErrorQueue();

            ErrorManager.SetErrorListener(equeue);
            Grammar g = new Grammar(
                "grammar a;\n" +
                "options { output = AST;}" +
                "otherrule\n" +
                "    : 'y' ;" +
                "rule\n" +
                "    : other=otherrule {" + action + "}\n" +
                "    ;");
            AntlrTool     antlr     = newTool();
            CodeGenerator generator = new CodeGenerator(antlr, g, "Java");

            g.CodeGenerator = generator;
            generator.GenRecognizer(); // forces load of templates
            ActionTranslator translator = new ActionTranslator(generator,
                                                               "rule",
                                                               new CommonToken(ANTLRParser.ACTION, action), 1);
            string rawTranslation =
                translator.Translate();

            int    expectedMsgID = ErrorManager.MSG_WRITE_TO_READONLY_ATTR;
            object expectedArg   = "other";
            object expectedArg2  = "tree";
            GrammarSemanticsMessage expectedMessage =
                new GrammarSemanticsMessage(expectedMsgID, g, null, expectedArg, expectedArg2);
            string expectedMessageString = expectedMessage.ToString();

            Assert.AreEqual(expectedMessageString, expectedMessage.ToString());
        }
        public void TestParserRuleInLexer() /*throws Exception*/
        {
            ErrorQueue equeue = new ErrorQueue();

            ErrorManager.SetErrorListener(equeue);   // unique listener per thread
            Grammar g = new Grammar(
                "lexer grammar t;\n" +
                "a : ;");

            object expectedArg   = "a";
            int    expectedMsgID = ErrorManager.MSG_PARSER_RULES_NOT_ALLOWED;
            GrammarSemanticsMessage expectedMessage =
                new GrammarSemanticsMessage(expectedMsgID, g, null, expectedArg);

            checkGrammarSemanticsError(equeue, expectedMessage);
        }
        public void TestUndefinedRule() /*throws Exception*/
        {
            ErrorQueue equeue = new ErrorQueue();

            ErrorManager.SetErrorListener(equeue);   // unique listener per thread
            Grammar g = new Grammar(
                "grammar t;\n" +
                "x : r ;");

            object expectedArg   = "r";
            int    expectedMsgID = ErrorManager.MSG_UNDEFINED_RULE_REF;
            GrammarSemanticsMessage expectedMessage =
                new GrammarSemanticsMessage(expectedMsgID, g, null, expectedArg);

            checkGrammarSemanticsError(equeue, expectedMessage);
        }
        public void TestUndefinedToken() /*throws Exception*/
        {
            ErrorQueue equeue = new ErrorQueue();

            ErrorManager.SetErrorListener(equeue);   // unique listener per thread
            Grammar g = new Grammar(
                "grammar t;\n" +
                "x : ID ;");

            object expectedArg   = "ID";
            int    expectedMsgID = ErrorManager.MSG_NO_TOKEN_DEFINITION;
            GrammarSemanticsMessage expectedMessage =
                new GrammarSemanticsMessage(expectedMsgID, g, null, expectedArg);

            checkGrammarSemanticsWarning(equeue, expectedMessage);
        }
        public void TestParserCharLiterals() /*throws Exception*/
        {
            ErrorQueue equeue = new ErrorQueue();

            ErrorManager.SetErrorListener(equeue);
            Grammar g = new Grammar(
                "parser grammar t;\n" +
                "a : '(' b ;\n" +
                "b : C ;");
            object expectedArg   = "'('";
            int    expectedMsgID = ErrorManager.MSG_LITERAL_NOT_ASSOCIATED_WITH_LEXER_RULE;
            GrammarSemanticsMessage expectedMessage =
                new GrammarSemanticsMessage(expectedMsgID, g, null, expectedArg);

            checkGrammarSemanticsError(equeue, expectedMessage);
        }
示例#10
0
        public void TestLexerRuleRedefinition() /*throws Exception*/
        {
            ErrorQueue equeue = new ErrorQueue();

            ErrorManager.SetErrorListener(equeue);   // unique listener per thread
            Grammar g = new Grammar(
                "lexer grammar t;\n" +
                "ID : 'a' ;\n" +
                "ID : 'd' ;");

            object expectedArg   = "ID";
            int    expectedMsgID = ErrorManager.MSG_RULE_REDEFINITION;
            GrammarSemanticsMessage expectedMessage =
                new GrammarSemanticsMessage(expectedMsgID, g, null, expectedArg);

            checkGrammarSemanticsError(equeue, expectedMessage);
        }
示例#11
0
        public void TestEmptyNotSet() /*throws Exception*/
        {
            ErrorQueue equeue = new ErrorQueue();

            ErrorManager.SetErrorListener(equeue);
            Grammar g = new Grammar(
                "grammar foo;\n" +
                "a : (~(A|B))+ ;\n");

            g.BuildNFA();
            object expectedArg   = null;
            int    expectedMsgID = ErrorManager.MSG_EMPTY_COMPLEMENT;
            GrammarSemanticsMessage expectedMessage =
                new GrammarSemanticsMessage(expectedMsgID, g, null, expectedArg);

            checkGrammarSemanticsError(equeue, expectedMessage);
        }
示例#12
0
        public void TestLabelAndParameterConflict() /*throws Exception*/
        {
            ErrorQueue equeue = new ErrorQueue();

            ErrorManager.SetErrorListener(equeue);   // unique listener per thread
            Grammar g = new Grammar(
                "parser grammar t;\n" +
                "a[int i] returns [int x]: x=ID \n" +
                "  ;\n");

            object expectedArg   = "x";
            int    expectedMsgID = ErrorManager.MSG_LABEL_CONFLICTS_WITH_RULE_ARG_RETVAL;
            GrammarSemanticsMessage expectedMessage =
                new GrammarSemanticsMessage(expectedMsgID, g, null, expectedArg);

            checkGrammarSemanticsError(equeue, expectedMessage);
        }
示例#13
0
        public void TestBadRuleOption() /*throws Exception*/
        {
            ErrorQueue equeue = new ErrorQueue();

            ErrorManager.SetErrorListener(equeue);   // unique listener per thread
            Grammar g = new Grammar(
                "grammar t;\n" +
                "a\n" +
                "options {k=3; tokenVocab=blort;}\n" +
                "  : 'a';\n");

            object expectedArg   = "tokenVocab";
            int    expectedMsgID = ErrorManager.MSG_ILLEGAL_OPTION;
            GrammarSemanticsMessage expectedMessage =
                new GrammarSemanticsMessage(expectedMsgID, g, null, expectedArg);

            checkGrammarSemanticsError(equeue, expectedMessage);
        }
示例#14
0
        public void TestCharLiteralInLexerTokensSection() /*throws Exception*/
        {
            ErrorQueue equeue = new ErrorQueue();

            ErrorManager.SetErrorListener(equeue);   // unique listener per thread
            Grammar g = new Grammar(
                "lexer grammar t;\n" +
                "tokens {\n" +
                "  B='(';\n" +
                "}\n" +
                "ID : 'a';\n");
            object expectedArg   = "'('";
            int    expectedMsgID = ErrorManager.MSG_CANNOT_ALIAS_TOKENS_IN_LEXER;
            GrammarSemanticsMessage expectedMessage =
                new GrammarSemanticsMessage(expectedMsgID, g, null, expectedArg);

            checkGrammarSemanticsError(equeue, expectedMessage);
        }
示例#15
0
        public void TestBadGrammarOption() /*throws Exception*/
        {
            ErrorQueue equeue = new ErrorQueue();

            ErrorManager.SetErrorListener(equeue);   // unique listener per thread
            AntlrTool antlr = newTool();
            Grammar   g     = new Grammar(antlr,
                                          "grammar t;\n" +
                                          "options {foo=3; language=Java;}\n" +
                                          "a : 'a';\n");

            object expectedArg   = "foo";
            int    expectedMsgID = ErrorManager.MSG_ILLEGAL_OPTION;
            GrammarSemanticsMessage expectedMessage =
                new GrammarSemanticsMessage(expectedMsgID, g, null, expectedArg);

            checkGrammarSemanticsError(equeue, expectedMessage);
        }
示例#16
0
        public void TestImportedTokenVocabIgnoredWithWarning() /*throws Exception*/
        {
            ErrorQueue equeue = new ErrorQueue();

            ErrorManager.SetErrorListener(equeue);
            string slave =
                "parser grammar S;\n" +
                "options {tokenVocab=whatever;}\n" +
                "tokens { A='a'; }\n" +
                "x : A {System.out.println(\"S.x\");} ;\n";

            mkdir(tmpdir);
            writeFile(tmpdir, "S.g", slave);

            string master =
                "grammar M;\n" +
                "import S;\n" +
                "s : x ;\n" +
                "WS : (' '|'\\n') {skip();} ;\n";

            writeFile(tmpdir, "M.g", master);
            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();
            g.composite.AssignTokenTypes();

            object expectedArg   = "S";
            int    expectedMsgID = ErrorManager.MSG_TOKEN_VOCAB_IN_DELEGATE;
            GrammarSemanticsMessage expectedMessage =
                new GrammarSemanticsMessage(expectedMsgID, g, null, expectedArg);

            checkGrammarSemanticsWarning(equeue, expectedMessage);

            assertEquals("unexpected errors: " + equeue, 0, equeue.errors.Count);
            assertEquals("unexpected errors: " + equeue, 1, equeue.warnings.Count);

            string expectedError =
                "warning(160): S.g:2:10: tokenVocab option ignored in imported grammar S";

            assertEquals(expectedError, equeue.warnings[0].ToString());
        }
示例#17
0
        public void TestCharLiteralInParserTokensSection() /*throws Exception*/
        {
            ErrorQueue equeue = new ErrorQueue();

            ErrorManager.SetErrorListener(equeue);   // unique listener per thread
            Grammar g = new Grammar(
                "parser grammar t;\n" +
                "tokens {\n" +
                "  B='(';\n" +
                "}\n" +
                "a : A B;\n" +
                "b : C ;");
            object expectedArg   = "'('";
            int    expectedMsgID = ErrorManager.MSG_LITERAL_NOT_ASSOCIATED_WITH_LEXER_RULE;
            GrammarSemanticsMessage expectedMessage =
                new GrammarSemanticsMessage(expectedMsgID, g, null, expectedArg);

            checkGrammarSemanticsError(equeue, expectedMessage);
        }
示例#18
0
        public void TestLabelAndTokenNameConflict() /*throws Exception*/
        {
            ErrorQueue equeue = new ErrorQueue();

            ErrorManager.SetErrorListener(equeue);   // unique listener per thread
            Grammar g = new Grammar(
                "parser grammar t;\n" +
                "a : ID=b \n" +
                "  ;\n" +
                "b : ID ;\n" +
                "c : ;\n");

            object expectedArg   = "ID";
            int    expectedMsgID = ErrorManager.MSG_LABEL_CONFLICTS_WITH_TOKEN;
            GrammarSemanticsMessage expectedMessage =
                new GrammarSemanticsMessage(expectedMsgID, g, null, expectedArg);

            checkGrammarSemanticsError(equeue, expectedMessage);
        }
示例#19
0
        public void TestBadSubRuleOption() /*throws Exception*/
        {
            ErrorQueue equeue = new ErrorQueue();

            ErrorManager.SetErrorListener(equeue);   // unique listener per thread
            Grammar g = new Grammar(
                "grammar t;\n" +
                "a : ( options {k=3; language=Java;}\n" +
                "    : 'a'\n" +
                "    | 'b'\n" +
                "    )\n" +
                "  ;\n");
            object expectedArg   = "language";
            int    expectedMsgID = ErrorManager.MSG_ILLEGAL_OPTION;
            GrammarSemanticsMessage expectedMessage =
                new GrammarSemanticsMessage(expectedMsgID, g, null, expectedArg);

            checkGrammarSemanticsError(equeue, expectedMessage);
        }
示例#20
0
        public void TestTokenLabelScopeConflict() /*throws Exception*/
        {
            ErrorQueue equeue = new ErrorQueue();

            ErrorManager.SetErrorListener(equeue);   // unique listener per thread
            Grammar g = new Grammar(
                "parser grammar t;\n" +
                "scope s {\n" +
                "  int n;\n" +
                "}\n" +
                "a : s=ID \n" +
                "  ;\n");

            object expectedArg   = "s";
            int    expectedMsgID = ErrorManager.MSG_SYMBOL_CONFLICTS_WITH_GLOBAL_SCOPE;
            GrammarSemanticsMessage expectedMessage =
                new GrammarSemanticsMessage(expectedMsgID, g, null, expectedArg);

            checkGrammarSemanticsError(equeue, expectedMessage);
        }
示例#21
0
        protected void checkGrammarSemanticsWarning(ErrorQueue equeue,
                                                    GrammarSemanticsMessage expectedMessage)
        {
            ANTLRMessage foundMsg = null;

            for (int i = 0; i < equeue.warnings.Count; i++)
            {
                ANTLRMessage m = equeue.warnings.get(i);
                if (m.getErrorType() == expectedMessage.getErrorType())
                {
                    foundMsg = m;
                }
            }
            assertNotNull("no error; " + expectedMessage.getErrorType() + " expected", foundMsg);
            Assert.IsTrue("error is not a GrammarSemanticsMessage",
                          foundMsg is GrammarSemanticsMessage);
            assertEquals(Arrays.tostring(expectedMessage.getArgs()), Arrays.tostring(foundMsg.getArgs()));
            if (equeue.Count != 1)
            {
                Console.Error.WriteLine(equeue);
            }
        }
示例#22
0
        public void TestRuleScopeRuleNameConflict() /*throws Exception*/
        {
            ErrorQueue equeue = new ErrorQueue();

            ErrorManager.SetErrorListener(equeue);   // unique listener per thread
            Grammar g = new Grammar(
                "parser grammar t;\n" +
                "a\n" +
                "scope {" +
                "  int a;" +
                "}\n" +
                "  : \n" +
                "  ;\n");

            object expectedArg   = "a";
            object expectedArg2  = null;
            int    expectedMsgID = ErrorManager.MSG_ATTRIBUTE_CONFLICTS_WITH_RULE;
            GrammarSemanticsMessage expectedMessage =
                new GrammarSemanticsMessage(expectedMsgID, g, null, expectedArg, expectedArg2);

            checkGrammarSemanticsError(equeue, expectedMessage);
        }