📄 testrewriteast.java
字号:
"grammar T;\n" + "options {output=AST;}\n" + "tokens {BLOCK;}\n" + "a : lc='{' ID+ '}' -> ^(BLOCK[$lc,\"block\"] ID+) ;\n" + "type : 'int' | 'float' ;\n" + "ID : 'a'..'z'+ ;\n" + "INT : '0'..'9'+;\n" + "WS : (' '|'\\n') {channel=99;} ;\n"; String found = execParser("t.g", grammar, "TParser", "TLexer", "a", "{a b c}", debug); assertEquals("(block a b c)\n", found); } public void testMixedRewriteAndAutoAST() throws Exception { String grammar = "grammar T;\n" + "options {output=AST;}\n" + "tokens {BLOCK;}\n" + "a : b b^ ;\n" + // 2nd b matches only an INT; can make it root "b : ID INT -> INT ID\n" + " | INT\n" + " ;\n" + "ID : 'a'..'z'+ ;\n" + "INT : '0'..'9'+;\n" + "WS : (' '|'\\n') {channel=99;} ;\n"; String found = execParser("t.g", grammar, "TParser", "TLexer", "a", "a 1 2", debug); assertEquals("(2 1 a)\n", found); } public void testSubruleWithRewrite() throws Exception { String grammar = "grammar T;\n" + "options {output=AST;}\n" + "tokens {BLOCK;}\n" + "a : b b ;\n" + "b : (ID INT -> INT ID | INT INT -> INT+ )\n" + " ;\n" + "ID : 'a'..'z'+ ;\n" + "INT : '0'..'9'+;\n" + "WS : (' '|'\\n') {channel=99;} ;\n"; String found = execParser("t.g", grammar, "TParser", "TLexer", "a", "a 1 2 3", debug); assertEquals("1 a 2 3\n", found); } public void testSubruleWithRewriteReferencingPreviousElement() throws Exception { String grammar = "grammar T;\n" + "options {output=AST;}\n" + "tokens {TYPE;}\n" + "a : b b ;\n" + "b : 'int'\n" + " ( ID -> ^(TYPE 'int' ID)\n" + " | ID '=' INT -> ^(TYPE 'int' ID INT)\n" + " )\n" + " ';'\n" + " ;\n" + "ID : 'a'..'z'+ ;\n" + "INT : '0'..'9'+;\n" + "WS : (' '|'\\n') {channel=99;} ;\n"; String found = execParser("t.g", grammar, "TParser", "TLexer", "a", "int a; int b=3;", debug); assertEquals("(TYPE int a) (TYPE int b 3)\n", found); } public void testNestedRewriteShutsOffAutoAST() throws Exception { String grammar = "grammar T;\n" + "options {output=AST;}\n" + "tokens {BLOCK;}\n" + "a : b b ;\n" + "b : ID ( ID (last=ID -> $last)+ ) ';'\n" + // get last ID " | INT\n" + // should still get auto AST construction " ;\n" + "ID : 'a'..'z'+ ;\n" + "INT : '0'..'9'+;\n" + "WS : (' '|'\\n') {channel=99;} ;\n"; String found = execParser("t.g", grammar, "TParser", "TLexer", "a", "a b c d; 42", debug); assertEquals("d 42\n", found); } public void testRewriteActions() throws Exception { String grammar = "grammar T;\n" + "options {output=AST;}\n" + "a : atom -> ^({adaptor.create(INT,\"9\")} atom) ;\n" + "atom : INT ;\n" + "ID : 'a'..'z'+ ;\n" + "INT : '0'..'9'+;\n" + "WS : (' '|'\\n') {channel=99;} ;\n"; String found = execParser("t.g", grammar, "TParser", "TLexer", "a", "3", debug); assertEquals("(9 3)\n", found); } public void testRewriteActions2() throws Exception { String grammar = "grammar T;\n" + "options {output=AST;}\n" + "a : atom -> {adaptor.create(INT,\"9\")} atom ;\n" + "atom : INT ;\n" + "ID : 'a'..'z'+ ;\n" + "INT : '0'..'9'+;\n" + "WS : (' '|'\\n') {channel=99;} ;\n"; String found = execParser("t.g", grammar, "TParser", "TLexer", "a", "3", debug); assertEquals("9 3\n", found); } public void testRefToOldValue() throws Exception { String grammar = "grammar T;\n" + "options {output=AST;}\n" + "tokens {BLOCK;}\n" + "a : (atom -> atom) (op='+' r=atom -> ^($op $a $r) )* ;\n" + "atom : INT ;\n" + "ID : 'a'..'z'+ ;\n" + "INT : '0'..'9'+;\n" + "WS : (' '|'\\n') {channel=99;} ;\n"; String found = execParser("t.g", grammar, "TParser", "TLexer", "a", "3+4+5", debug); assertEquals("(+ (+ 3 4) 5)\n", found); } public void testCopySemanticsForRules() throws Exception { String grammar = "grammar T;\n" + "options {output=AST;}\n" + "tokens {BLOCK;}\n" + "a : atom -> ^(atom atom) ;\n" + // NOT CYCLE! (dup atom) "atom : INT ;\n" + "ID : 'a'..'z'+ ;\n" + "INT : '0'..'9'+;\n" + "WS : (' '|'\\n') {channel=99;} ;\n"; String found = execParser("t.g", grammar, "TParser", "TLexer", "a", "3", debug); assertEquals("(3 3)\n", found); } public void testComplicatedMelange() throws Exception { String grammar = "grammar T;\n" + "options {output=AST;}\n" + "tokens {BLOCK;}\n" + "a : A A b=B B b=B c+=C C c+=C D {$D.text;} -> A+ B+ C+ D ;\n" + "type : 'int' | 'float' ;\n" + "A : 'a' ;\n" + "B : 'b' ;\n" + "C : 'c' ;\n" + "D : 'd' ;\n" + "WS : (' '|'\\n') {channel=99;} ;\n"; String found = execParser("t.g", grammar, "TParser", "TLexer", "a", "a a b b b c c c d", debug); assertEquals("a a b b b c c c d\n", found); } public void testRuleListLabel() throws Exception { String grammar = "grammar T;\n" + "options {output=AST;}\n" + "tokens {BLOCK;}\n" + "a : x+=b x+=b -> $x+;\n"+ "b : ID ;\n"+ "ID : 'a'..'z'+ ;\n" + "WS : (' '|'\\n') {channel=99;} ;\n"; String found = execParser("t.g", grammar, "TParser", "TLexer", "a", "a b", debug); assertEquals("a b\n", found); } public void testOptional() throws Exception { String grammar = "grammar T;\n" + "options {output=AST;}\n" + "tokens {BLOCK;}\n" + "a : x=b (y=b)? -> $x $y?;\n"+ "b : ID ;\n"+ "ID : 'a'..'z'+ ;\n" + "WS : (' '|'\\n') {channel=99;} ;\n"; String found = execParser("t.g", grammar, "TParser", "TLexer", "a", "a", debug); assertEquals("a\n", found); } public void testOptional2() throws Exception { String grammar = "grammar T;\n" + "options {output=AST;}\n" + "tokens {BLOCK;}\n" + "a : x=ID (y=b)? -> $x $y?;\n"+ "b : ID ;\n"+ "ID : 'a'..'z'+ ;\n" + "WS : (' '|'\\n') {channel=99;} ;\n"; String found = execParser("t.g", grammar, "TParser", "TLexer", "a", "a b", debug); assertEquals("a b\n", found); } public void testOptional3() throws Exception { String grammar = "grammar T;\n" + "options {output=AST;}\n" + "tokens {BLOCK;}\n" + "a : x=ID (y=b)? -> ($x $y)?;\n"+ "b : ID ;\n"+ "ID : 'a'..'z'+ ;\n" + "WS : (' '|'\\n') {channel=99;} ;\n"; String found = execParser("t.g", grammar, "TParser", "TLexer", "a", "a b", debug); assertEquals("a b\n", found); } public void testOptional4() throws Exception { String grammar = "grammar T;\n" + "options {output=AST;}\n" + "tokens {BLOCK;}\n" + "a : x+=ID (y=b)? -> ($x $y)?;\n"+ "b : ID ;\n"+ "ID : 'a'..'z'+ ;\n" + "WS : (' '|'\\n') {channel=99;} ;\n"; String found = execParser("t.g", grammar, "TParser", "TLexer", "a", "a b", debug); assertEquals("a b\n", found); } public void testArbitraryExprType() throws Exception { String grammar = "grammar T;\n" + "options {output=AST;}\n" + "tokens {BLOCK;}\n" + "a : x+=b x+=b -> {new Object()};\n"+ "b : ID ;\n"+ "ID : 'a'..'z'+ ;\n" + "WS : (' '|'\\n') {channel=99;} ;\n"; String found = execParser("t.g", grammar, "TParser", "TLexer", "a", "a b", debug); //assertEquals("[not sure what this should be!]\n", found);//ATTENTION: I changed this one's behavior from the above. Is it right? assertEquals("nil\n", found); } // E R R O R S public void testUnknownRule() throws Exception { ErrorQueue equeue = new ErrorQueue(); ErrorManager.setErrorListener(equeue); String grammar = "grammar T;\n" + "options {output=AST;}\n" + "a : INT -> ugh ;\n" + "ID : 'a'..'z'+ ;\n" + "INT : '0'..'9'+;\n" + "WS : (' '|'\\n') {channel=99;} ;\n"; Grammar g = new Grammar(grammar); Tool antlr = newTool(); antlr.setOutputDirectory(null); // write to /dev/null CodeGenerator generator = new CodeGenerator(antlr, g, "Java"); g.setCodeGenerator(generator); generator.genRecognizer(); int expectedMsgID = ErrorManager.MSG_UNDEFINED_RULE_REF; Object expectedArg = "ugh"; Object expectedArg2 = null; GrammarSemanticsMessage expectedMessage = new GrammarSemanticsMessage(expectedMsgID, g, null, expectedArg, expectedArg2); checkError(equeue, expectedMessage); } public void testKnownRuleButNotInLHS() throws Exception { ErrorQueue equeue = new ErrorQueue(); ErrorManager.setErrorListener(equeue); String grammar = "grammar T;\n" + "options {output=AST;}\n" + "a : INT -> b ;\n" + "b : 'b' ;\n" + "ID : 'a'..'z'+ ;\n" + "INT : '0'..'9'+;\n" + "WS : (' '|'\\n') {channel=99;} ;\n"; Grammar g = new Grammar(grammar); Tool antlr = newTool(); antlr.setOutputDirectory(null); // write to /dev/null CodeGenerator generator = new CodeGenerator(antlr, g, "Java"); g.setCodeGenerator(generator); generator.genRecognizer(); int expectedMsgID = ErrorManager.MSG_REWRITE_ELEMENT_NOT_PRESENT_ON_LHS; Object expectedArg = "b"; Object expectedArg2 = null; GrammarSemanticsMessage expectedMessage = new GrammarSemanticsMessage(expectedMsgID, g, null, expectedArg, expectedArg2); checkError(equeue, expectedMessage); } public void testUnknownToken() throws Exception { ErrorQueue equeue = new ErrorQueue(); ErrorManager.setErrorListener(equeue); String grammar = "grammar T;\n" + "options {output=AST;}\n" + "a : INT -> ICK ;\n" + "ID : 'a'..'z'+ ;\n" + "INT : '0'..'9'+;\n" + "WS : (' '|'\\n') {channel=99;} ;\n"; Grammar g = new Grammar(grammar); Tool antlr = newTool(); antlr.setOutputDirectory(null); // write to /dev/null CodeGenerator generator = new CodeGenerator(antlr, g, "Java"); g.setCodeGenerator(generator); generator.genRecognizer(); int expectedMsgID = ErrorManager.MSG_UNDEFINED_TOKEN_REF_IN_REWRITE; Object expectedArg = "ICK"; Object expectedArg2 = null; GrammarSemanticsMessage expectedMessage = new GrammarSemanticsMessage(expectedMsgID, g, null, expectedArg, expectedArg2); checkError(equeue, expectedMessage); } public void testUnknownLabel() throws Exception { ErrorQueue equeue = new ErrorQueue(); ErrorManager.setErrorListener(equeue); String grammar = "grammar T;\n" + "options {output=AST;}\n" + "a : INT -> $foo ;\n" + "ID : 'a'..'z'+ ;\n" + "INT : '0'..'9'+;\n" + "WS : (' '|'\\n') {channel=99;} ;\n"; Grammar g = new Grammar(grammar); Tool antlr = newTool(); antlr.setOutputDirectory(null); // write to /dev/null CodeGenerator generator = new CodeGenerator(antlr, g, "Java"); g.setCodeGenerator(generator); generator.genRecognizer(); int expectedMsgID = ErrorManager.MSG_UNDEFINED_LABEL_REF_IN_REWRITE; Object expectedArg = "foo"; Object expectedArg2 = null; GrammarSemanticsMessage expectedMessage = new GrammarSemanticsMessage(expectedMsgID, g, null, expectedArg, expectedArg2); checkError(equeue, expectedMessage); } public void testUnknownCharLiteralToken() throws Exception { ErrorQueue equeue = new ErrorQueue(); ErrorManager.setErrorListener(equeue); String grammar = "grammar T;\n" + "options {output=AST;}\n" + "a : INT -> 'a' ;\n" + "ID : 'a'..'z'+ ;\n" + "INT : '0'..'9'+;\n" + "WS : (' '|'\\n') {channel=99;} ;\n"; Grammar g = new Grammar(grammar); Tool antlr = newTool(); antlr.setOutputDirectory(null); // write to /dev/null CodeGenerator generator = new CodeGenerator(antlr, g, "Java"); g.setCodeGenerator(generator); generator.genRecognizer(); int expectedMsgID = ErrorManager.MSG_UNDEFINED_TOKEN_REF_IN_REWRITE; Object expectedArg = "'a'"; Object expectedArg2 = null; GrammarSemanticsMessage expectedMessage = new GrammarSemanticsMessage(expectedMsgID, g, null, expectedArg, expectedArg2); checkError(equeue, expectedMessage); } public void testUnknownStringLiteralToken() throws Exception { ErrorQueue equeue = new ErrorQueue(); ErrorManager.setErrorListener(equeue); String grammar = "grammar T;\n" + "options {output=AST;}\n" + "a : INT -> 'foo' ;\n" + "ID : 'a'..'z'+ ;\n" + "INT : '0'..'9'+;\n" + "WS : (' '|'\\n') {channel=99;} ;\n"; Grammar g = new Grammar(grammar); Tool antlr = newTool(); antlr.setOutputDirectory(null); // write to /dev/null CodeGenerator generator = new CodeGenerator(antlr, g, "Java"); g.setCodeGenerator(generator); generator.genRecognizer(); int expectedMsgID = ErrorManager.MSG_UNDEFINED_TOKEN_REF_IN_REWRITE; Object expectedArg = "'foo'"; Object expectedArg2 = null; GrammarSemanticsMessage expectedMessage = new GrammarSemanticsMessage(expectedMsgID, g, null, expectedArg, expectedArg2); checkError(equeue, expectedMessage); } // S U P P O R T protected void checkError(ErrorQueue equeue, GrammarSemanticsMessage expectedMessage) throws Exception { //System.out.println("errors="+equeue); Message foundMsg = null; for (int i = 0; i < equeue.errors.size(); i++) { Message m = (Message)equeue.errors.get(i); if (m.msgID==expectedMessage.msgID ) { foundMsg = m; } } assertTrue("no error; "+expectedMessage.msgID+" expected", equeue.errors.size()>0); assertTrue("too many errors; "+equeue.errors, equeue.errors.size()<=1); assertNotNull("couldn't find expected error: "+expectedMessage.msgID, foundMsg); assertTrue("error is not a GrammarSemanticsMessage", foundMsg instanceof GrammarSemanticsMessage); assertEquals(expectedMessage.arg, foundMsg.arg); assertEquals(expectedMessage.arg2, foundMsg.arg2); ErrorManager.resetErrorState(); // wack errors for next test }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -