📄 testrewriteast.java
字号:
"tokens {BLOCK;}\n" + "a : x+=b x+=b -> $x+;\n"+ "b : ID ;\n"+ "ID : 'a'..'z'+ ;\n" + "WS : (' '|'\\n') {$channel=HIDDEN;} ;\n"; String found = execParser("T.g", grammar, "TParser", "TLexer", "a", "a b", debug); assertEquals("a b\n", found); } public void testRuleListLabel2() throws Exception { String grammar = "grammar T;\n" + "options {output=AST;}\n" + "tokens {BLOCK;}\n" + "a : x+=b x+=b -> $x $x*;\n"+ "b : ID ;\n"+ "ID : 'a'..'z'+ ;\n" + "WS : (' '|'\\n') {$channel=HIDDEN;} ;\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=HIDDEN;} ;\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=HIDDEN;} ;\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=HIDDEN;} ;\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=HIDDEN;} ;\n"; String found = execParser("T.g", grammar, "TParser", "TLexer", "a", "a b", debug); assertEquals("a b\n", found); } public void testOptional5() throws Exception { String grammar = "grammar T;\n" + "options {output=AST;}\n" + "tokens {BLOCK;}\n" + "a : ID -> ID? ;\n"+ // match an ID to optional ID "b : ID ;\n"+ "ID : 'a'..'z'+ ;\n" + "WS : (' '|'\\n') {$channel=HIDDEN;} ;\n"; String found = execParser("T.g", grammar, "TParser", "TLexer", "a", "a", debug); assertEquals("a\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 CommonTree()};\n"+ "b : ID ;\n"+ "ID : 'a'..'z'+ ;\n" + "WS : (' '|'\\n') {$channel=HIDDEN;} ;\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); } public void testSet() throws Exception { String grammar = "grammar T;\n" + "options { output = AST; } \n" + "a: (INT|ID)+ -> INT+ ID+ ;\n" + "INT: '0'..'9'+;\n" + "ID : 'a'..'z'+;\n" + "WS : (' '|'\\n') {$channel=HIDDEN;} ;\n"; String found = execParser("T.g", grammar, "TParser", "TLexer", "a", "2 a 34 de", debug); assertEquals("2 34 a de\n", found); } public void testRewriteAction() throws Exception { String grammar = "grammar T; \n" + "options { output = AST; }\n" + "tokens { FLOAT; }\n" + "r\n" + " : INT -> {new CommonTree(new CommonToken(FLOAT,$INT.text+\".0\"))} \n" + " ; \n" + "INT : '0'..'9'+; \n" + "WS: (' ' | '\\n' | '\\t')+ {$channel = HIDDEN;}; \n"; String found = execParser("T.g", grammar, "TParser", "TLexer", "r", "25", debug); assertEquals("25.0\n", found); } public void testOptionalSubruleWithoutRealElements() throws Exception { // copy type *and* modifier even though it's optional // for each invocation of (...)+ in rewrite String grammar = "grammar T;\n" + "options {output=AST;} \n" + "tokens {PARMS;} \n" + "\n" + "modulo \n" + " : 'modulo' ID ('(' parms+ ')')? -> ^('modulo' ID ^(PARMS parms+)?) \n" + " ; \n" + "parms : '#'|ID; \n" + "ID : ('a'..'z' | 'A'..'Z')+;\n" + "WS : (' '|'\\n') {$channel=HIDDEN;} ;\n"; String found = execParser("T.g", grammar, "TParser", "TLexer", "modulo", "modulo abc (x y #)", debug); assertEquals("(modulo abc (PARMS x y #))\n", found); } // C A R D I N A L I T Y I S S U E S public void testCardinality() throws Exception { String grammar = "grammar T;\n" + "options {output=AST;}\n" + "tokens {BLOCK;}\n" + "a : ID ID INT INT INT -> (ID INT)+;\n"+ "ID : 'a'..'z'+ ;\n" + "INT : '0'..'9'+; \n" + "WS : (' '|'\\n') {$channel=HIDDEN;} ;\n"; execParser("T.g", grammar, "TParser", "TLexer", "a", "a b 3 4 5", debug); String expecting = "org.antlr.runtime.tree.RewriteCardinalityException: token ID"; String found = getFirstLineOfException(); assertEquals(expecting, found); } public void testCardinality2() throws Exception { String grammar = "grammar T;\n" + "options {output=AST;}\n" + "a : ID+ -> ID ID ID ;\n" + // only 2 input IDs "op : '+'|'-' ;\n" + "ID : 'a'..'z'+ ;\n" + "INT : '0'..'9'+;\n" + "WS : (' '|'\\n') {$channel=HIDDEN;} ;\n"; execParser("T.g", grammar, "TParser", "TLexer", "a", "a b", debug); String expecting = "org.antlr.runtime.tree.RewriteCardinalityException: token ID"; String found = getFirstLineOfException(); assertEquals(expecting, found); } public void testCardinality3() throws Exception { String grammar = "grammar T;\n" + "options {output=AST;}\n" + "a : ID? INT -> ID INT ;\n" + "op : '+'|'-' ;\n" + "ID : 'a'..'z'+ ;\n" + "INT : '0'..'9'+;\n" + "WS : (' '|'\\n') {$channel=HIDDEN;} ;\n"; execParser("T.g", grammar, "TParser", "TLexer", "a", "3", debug); String expecting = "org.antlr.runtime.tree.RewriteEmptyStreamException: token ID"; String found = getFirstLineOfException(); assertEquals(expecting, found); } public void testLoopCardinality() throws Exception { String grammar = "grammar T;\n" + "options {output=AST;}\n" + "a : ID? INT -> ID+ INT ;\n" + "op : '+'|'-' ;\n" + "ID : 'a'..'z'+ ;\n" + "INT : '0'..'9'+;\n" + "WS : (' '|'\\n') {$channel=HIDDEN;} ;\n"; execParser("T.g", grammar, "TParser", "TLexer", "a", "3", debug); String expecting = "org.antlr.runtime.tree.RewriteEarlyExitException"; String found = getFirstLineOfException(); assertEquals(expecting, 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=HIDDEN;} ;\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=HIDDEN;} ;\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=HIDDEN;} ;\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=HIDDEN;} ;\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=HIDDEN;} ;\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=HIDDEN;} ;\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 + -