⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 testrewriteast.java

📁 ANTLR(ANother Tool for Language Recognition)它是这样的一种工具
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
			"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 + -