import unittest import textwrap import antlr3 import antlr3.tree import testbase class T(testbase.ANTLRTest): def walkerClass(self, base): class TWalker(base): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.buf = "" def traceIn(self, ruleName, ruleIndex): self.traces.append('>'+ruleName) def traceOut(self, ruleName, ruleIndex): self.traces.append('<'+ruleName) def recover(self, input, re): # no error recovery yet, just crash! raise return TWalker def execTreeParser(self, grammar, grammarEntry, treeGrammar, treeEntry, input): lexerCls, parserCls = self.compileInlineGrammar(grammar) walkerCls = self.compileInlineGrammar(treeGrammar) cStream = antlr3.StringStream(input) lexer = lexerCls(cStream) tStream = antlr3.CommonTokenStream(lexer) parser = parserCls(tStream) r = getattr(parser, grammarEntry)() nodes = antlr3.tree.CommonTreeNodeStream(r.tree) nodes.setTokenStream(tStream) walker = walkerCls(nodes) r = getattr(walker, treeEntry)() if r.tree: return r.tree.toStringTree() return "" def testFlatList(self): grammar = textwrap.dedent( r''' grammar T1; options { language=Python3; output=AST; } a : ID INT; ID : 'a'..'z'+ ; INT : '0'..'9'+; WS : (' '|'\\n') {$channel=HIDDEN;} ; ''') treeGrammar = textwrap.dedent( r''' tree grammar TP1; options { language=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T1; } a : ID INT -> INT ID; ''') found = self.execTreeParser( grammar, 'a', treeGrammar, 'a', "abc 34" ) self.assertEqual("34 abc", found) def testSimpleTree(self): grammar = textwrap.dedent( r''' grammar T2; options { language=Python3; output=AST; } a : ID INT -> ^(ID INT); ID : 'a'..'z'+ ; INT : '0'..'9'+; WS : (' '|'\\n') {$channel=HIDDEN;} ; ''') treeGrammar = textwrap.dedent( r''' tree grammar TP2; options { language=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T2; } a : ^(ID INT) -> ^(INT ID); ''') found = self.execTreeParser( grammar, 'a', treeGrammar, 'a', "abc 34" ) self.assertEqual("(34 abc)", found) def testCombinedRewriteAndAuto(self): grammar = textwrap.dedent( r''' grammar T3; options { language=Python3; output=AST; } a : ID INT -> ^(ID INT) | INT ; ID : 'a'..'z'+ ; INT : '0'..'9'+; WS : (' '|'\\n') {$channel=HIDDEN;} ; ''') treeGrammar = textwrap.dedent( r''' tree grammar TP3; options { language=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T3; } a : ^(ID INT) -> ^(INT ID) | INT; ''') found = self.execTreeParser( grammar, 'a', treeGrammar, 'a', "abc 34" ) self.assertEqual("(34 abc)", found) found = self.execTreeParser( grammar, 'a', treeGrammar, 'a', "34" ) self.assertEqual("34", found) def testAvoidDup(self): grammar = textwrap.dedent( r''' grammar T4; options { language=Python3; output=AST; } a : ID ; ID : 'a'..'z'+ ; INT : '0'..'9'+; WS : (' '|'\\n') {$channel=HIDDEN;} ; ''') treeGrammar = textwrap.dedent( r''' tree grammar TP4; options { language=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T4; } a : ID -> ^(ID ID); ''') found = self.execTreeParser( grammar, 'a', treeGrammar, 'a', "abc" ) self.assertEqual("(abc abc)", found) def testLoop(self): grammar = textwrap.dedent( r''' grammar T5; options { language=Python3; output=AST; } a : ID+ INT+ -> (^(ID INT))+ ; ID : 'a'..'z'+ ; INT : '0'..'9'+; WS : (' '|'\\n') {$channel=HIDDEN;} ; ''') treeGrammar = textwrap.dedent( r''' tree grammar TP5; options { language=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T5; } a : (^(ID INT))+ -> INT+ ID+; ''') found = self.execTreeParser( grammar, 'a', treeGrammar, 'a', "a b c 3 4 5" ) self.assertEqual("3 4 5 a b c", found) def testAutoDup(self): grammar = textwrap.dedent( r''' grammar T6; options { language=Python3; output=AST; } a : ID ; ID : 'a'..'z'+ ; INT : '0'..'9'+; WS : (' '|'\\n') {$channel=HIDDEN;} ; ''') treeGrammar = textwrap.dedent( r''' tree grammar TP6; options { language=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T6; } a : ID; ''') found = self.execTreeParser( grammar, 'a', treeGrammar, 'a', "abc" ) self.assertEqual("abc", found) def testAutoDupRule(self): grammar = textwrap.dedent( r''' grammar T7; options { language=Python3; output=AST; } a : ID INT ; ID : 'a'..'z'+ ; INT : '0'..'9'+; WS : (' '|'\\n') {$channel=HIDDEN;} ; ''') treeGrammar = textwrap.dedent( r''' tree grammar TP7; options { language=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T7; } a : b c ; b : ID ; c : INT ; ''') found = self.execTreeParser( grammar, 'a', treeGrammar, 'a', "a 1" ) self.assertEqual("a 1", found) def testAutoWildcard(self): grammar = textwrap.dedent( r''' grammar T; options {language=Python3;output=AST;} a : ID INT ; ID : 'a'..'z'+ ; INT : '0'..'9'+; WS : (' '|'\n') {$channel=HIDDEN;} ; ''') treeGrammar = textwrap.dedent( r''' tree grammar TP; options {language=Python3;output=AST; ASTLabelType=CommonTree; tokenVocab=T;} a : ID . ; ''') found = self.execTreeParser( grammar, 'a', treeGrammar, 'a', "abc 34") self.assertEqual("abc 34", found) def testAutoWildcard2(self): grammar = textwrap.dedent( r''' grammar T; options {language=Python3;output=AST;} a : ID INT -> ^(ID INT); ID : 'a'..'z'+ ; INT : '0'..'9'+; WS : (' '|'\n') {$channel=HIDDEN;} ; ''') treeGrammar = textwrap.dedent( r''' tree grammar TP; options {language=Python3;output=AST; ASTLabelType=CommonTree; tokenVocab=T;} a : ^(ID .) ; ''') found = self.execTreeParser( grammar, 'a', treeGrammar, 'a', "abc 34") self.assertEqual("(abc 34)", found) def testAutoWildcardWithLabel(self): grammar = textwrap.dedent( r''' grammar T; options {language=Python3;output=AST;} a : ID INT ; ID : 'a'..'z'+ ; INT : '0'..'9'+; WS : (' '|'\n') {$channel=HIDDEN;} ; ''') treeGrammar = textwrap.dedent( r''' tree grammar TP; options {language=Python3;output=AST; ASTLabelType=CommonTree; tokenVocab=T;} a : ID c=. ; ''') found = self.execTreeParser( grammar, 'a', treeGrammar, 'a', "abc 34") self.assertEqual("abc 34", found) def testAutoWildcardWithListLabel(self): grammar = textwrap.dedent( r''' grammar T; options {language=Python3;output=AST;} a : ID INT ; ID : 'a'..'z'+ ; INT : '0'..'9'+; WS : (' '|'\n') {$channel=HIDDEN;} ; ''') treeGrammar = textwrap.dedent( r''' tree grammar TP; options {language=Python3;output=AST; ASTLabelType=CommonTree; tokenVocab=T;} a : ID c+=. ; ''') found = self.execTreeParser( grammar, 'a', treeGrammar, 'a', "abc 34") self.assertEqual("abc 34", found) def testAutoDupMultiple(self): grammar = textwrap.dedent( r''' grammar T8; options { language=Python3; output=AST; } a : ID ID INT; ID : 'a'..'z'+ ; INT : '0'..'9'+; WS : (' '|'\\n') {$channel=HIDDEN;} ; ''') treeGrammar = textwrap.dedent( r''' tree grammar TP8; options { language=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T8; } a : ID ID INT ; ''') found = self.execTreeParser( grammar, 'a', treeGrammar, 'a', "a b 3" ) self.assertEqual("a b 3", found) def testAutoDupTree(self): grammar = textwrap.dedent( r''' grammar T9; options { language=Python3; output=AST; } a : ID INT -> ^(ID INT); ID : 'a'..'z'+ ; INT : '0'..'9'+; WS : (' '|'\\n') {$channel=HIDDEN;} ; ''') treeGrammar = textwrap.dedent( r''' tree grammar TP9; options { language=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T9; } a : ^(ID INT) ; ''') found = self.execTreeParser( grammar, 'a', treeGrammar, 'a', "a 3" ) self.assertEqual("(a 3)", found) def testAutoDupTreeWithLabels(self): grammar = textwrap.dedent( r''' grammar T10; options { language=Python3; output=AST; } a : ID INT -> ^(ID INT); ID : 'a'..'z'+ ; INT : '0'..'9'+; WS : (' '|'\\n') {$channel=HIDDEN;} ; ''') treeGrammar = textwrap.dedent( r''' tree grammar TP10; options { language=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T10; } a : ^(x=ID y=INT) ; ''') found = self.execTreeParser( grammar, 'a', treeGrammar, 'a', "a 3" ) self.assertEqual("(a 3)", found) def testAutoDupTreeWithListLabels(self): grammar = textwrap.dedent( r''' grammar T11; options { language=Python3; output=AST; } a : ID INT -> ^(ID INT); ID : 'a'..'z'+ ; INT : '0'..'9'+; WS : (' '|'\\n') {$channel=HIDDEN;} ; ''') treeGrammar = textwrap.dedent( r''' tree grammar TP11; options { language=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T11; } a : ^(x+=ID y+=INT) ; ''') found = self.execTreeParser( grammar, 'a', treeGrammar, 'a', "a 3" ) self.assertEqual("(a 3)", found) def testAutoDupTreeWithRuleRoot(self): grammar = textwrap.dedent( r''' grammar T12; options { language=Python3; output=AST; } a : ID INT -> ^(ID INT); ID : 'a'..'z'+ ; INT : '0'..'9'+; WS : (' '|'\\n') {$channel=HIDDEN;} ; ''') treeGrammar = textwrap.dedent( r''' tree grammar TP12; options { language=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T12; } a : ^(b INT) ; b : ID ; ''') found = self.execTreeParser( grammar, 'a', treeGrammar, 'a', "a 3" ) self.assertEqual("(a 3)", found) def testAutoDupTreeWithRuleRootAndLabels(self): grammar = textwrap.dedent( r''' grammar T13; options { language=Python3; output=AST; } a : ID INT -> ^(ID INT); ID : 'a'..'z'+ ; INT : '0'..'9'+; WS : (' '|'\\n') {$channel=HIDDEN;} ; ''') treeGrammar = textwrap.dedent( r''' tree grammar TP13; options { language=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T13; } a : ^(x=b INT) ; b : ID ; ''') found = self.execTreeParser( grammar, 'a', treeGrammar, 'a', "a 3" ) self.assertEqual("(a 3)", found) def testAutoDupTreeWithRuleRootAndListLabels(self): grammar = textwrap.dedent( r''' grammar T14; options { language=Python3; output=AST; } a : ID INT -> ^(ID INT); ID : 'a'..'z'+ ; INT : '0'..'9'+; WS : (' '|'\\n') {$channel=HIDDEN;} ; ''') treeGrammar = textwrap.dedent( r''' tree grammar TP14; options { language=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T14; } a : ^(x+=b y+=c) ; b : ID ; c : INT ; ''') found = self.execTreeParser( grammar, 'a', treeGrammar, 'a', "a 3" ) self.assertEqual("(a 3)", found) def testAutoDupNestedTree(self): grammar = textwrap.dedent( r''' grammar T15; options { language=Python3; output=AST; } a : x=ID y=ID INT -> ^($x ^($y INT)); ID : 'a'..'z'+ ; INT : '0'..'9'+; WS : (' '|'\\n') {$channel=HIDDEN;} ; ''') treeGrammar = textwrap.dedent( r''' tree grammar TP15; options { language=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T15; } a : ^(ID ^(ID INT)) ; ''') found = self.execTreeParser( grammar, 'a', treeGrammar, 'a', "a b 3" ) self.assertEqual("(a (b 3))", found) def testDelete(self): grammar = textwrap.dedent( r''' grammar T16; options { language=Python3; output=AST; } a : ID ; ID : 'a'..'z'+ ; INT : '0'..'9'+; WS : (' '|'\\n') {$channel=HIDDEN;} ; ''') treeGrammar = textwrap.dedent( r''' tree grammar TP16; options { language=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T16; } a : ID -> ; ''') found = self.execTreeParser( grammar, 'a', treeGrammar, 'a', "abc" ) self.assertEqual("", found) def testSetMatchNoRewrite(self): grammar = textwrap.dedent( r''' grammar T; options { language=Python3; output=AST; } a : ID INT ; ID : 'a'..'z'+ ; INT : '0'..'9'+; WS : (' '|'\n') {$channel=HIDDEN;} ; ''') treeGrammar = textwrap.dedent( r''' tree grammar TP; options { language=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T; } a : b INT; b : ID | INT; ''') found = self.execTreeParser( grammar, 'a', treeGrammar, 'a', "abc 34" ) self.assertEqual("abc 34", found) def testSetOptionalMatchNoRewrite(self): grammar = textwrap.dedent( r''' grammar T; options { language=Python3; output=AST; } a : ID INT ; ID : 'a'..'z'+ ; INT : '0'..'9'+; WS : (' '|'\n') {$channel=HIDDEN;} ; ''') treeGrammar = textwrap.dedent( r''' tree grammar TP; options { language=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T; } a : (ID|INT)? INT ; ''') found = self.execTreeParser( grammar, 'a', treeGrammar, 'a', "abc 34") self.assertEqual("abc 34", found) def testSetMatchNoRewriteLevel2(self): grammar = textwrap.dedent( r''' grammar T; options { language=Python3; output=AST; } a : x=ID INT -> ^($x INT); ID : 'a'..'z'+ ; INT : '0'..'9'+; WS : (' '|'\n') {$channel=HIDDEN;} ; ''') treeGrammar = textwrap.dedent( r''' tree grammar TP; options { language=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T; } a : ^(ID (ID | INT) ) ; ''') found = self.execTreeParser( grammar, 'a', treeGrammar, 'a', "abc 34" ) self.assertEqual("(abc 34)", found) def testSetMatchNoRewriteLevel2Root(self): grammar = textwrap.dedent( r''' grammar T; options { language=Python3; output=AST; } a : x=ID INT -> ^($x INT); ID : 'a'..'z'+ ; INT : '0'..'9'+; WS : (' '|'\n') {$channel=HIDDEN;} ; ''') treeGrammar = textwrap.dedent( r''' tree grammar TP; options { language=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T; } a : ^((ID | INT) INT) ; ''') found = self.execTreeParser( grammar, 'a', treeGrammar, 'a', "abc 34" ) self.assertEqual("(abc 34)", found) ## REWRITE MODE def testRewriteModeCombinedRewriteAndAuto(self): grammar = textwrap.dedent( r''' grammar T17; options { language=Python3; output=AST; } a : ID INT -> ^(ID INT) | INT ; ID : 'a'..'z'+ ; INT : '0'..'9'+; WS : (' '|'\\n') {$channel=HIDDEN;} ; ''') treeGrammar = textwrap.dedent( r''' tree grammar TP17; options { language=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T17; rewrite=true; } a : ^(ID INT) -> ^(ID["ick"] INT) | INT // leaves it alone, returning $a.start ; ''') found = self.execTreeParser( grammar, 'a', treeGrammar, 'a', "abc 34" ) self.assertEqual("(ick 34)", found) found = self.execTreeParser( grammar, 'a', treeGrammar, 'a', "34" ) self.assertEqual("34", found) def testRewriteModeFlatTree(self): grammar = textwrap.dedent( r''' grammar T18; options { language=Python3; output=AST; } a : ID INT -> ID INT | INT ; ID : 'a'..'z'+ ; INT : '0'..'9'+; WS : (' '|'\n') {$channel=HIDDEN;} ; ''') treeGrammar = textwrap.dedent( r''' tree grammar TP18; options { language=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T18; rewrite=true; } s : ID a ; a : INT -> INT["1"] ; ''') found = self.execTreeParser( grammar, 'a', treeGrammar, 's', "abc 34" ) self.assertEqual("abc 1", found) def testRewriteModeChainRuleFlatTree(self): grammar = textwrap.dedent( r''' grammar T; options {language=Python3; output=AST;} a : ID INT -> ID INT | INT ; ID : 'a'..'z'+ ; INT : '0'..'9'+; WS : (' '|'\n') {$channel=HIDDEN;} ; ''') treeGrammar = textwrap.dedent( r''' tree grammar TP; options {language=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;} s : a ; a : b ; b : ID INT -> INT ID ; ''') found = self.execTreeParser( grammar, 'a', treeGrammar, 's', "abc 34") self.assertEqual("34 abc", found) def testRewriteModeChainRuleTree(self): grammar = textwrap.dedent( r''' grammar T; options {language=Python3; output=AST;} a : ID INT -> ^(ID INT) ; ID : 'a'..'z'+ ; INT : '0'..'9'+; WS : (' '|'\n') {$channel=HIDDEN;} ; ''') treeGrammar = textwrap.dedent( r''' tree grammar TP; options {language=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;} s : a ; a : b ; // a.tree must become b.tree b : ^(ID INT) -> INT ; ''') found = self.execTreeParser( grammar, 'a', treeGrammar, 's', "abc 34") self.assertEqual("34", found) def testRewriteModeChainRuleTree2(self): grammar = textwrap.dedent( r''' grammar T; options {language=Python3; output=AST;} a : ID INT -> ^(ID INT) ; ID : 'a'..'z'+ ; INT : '0'..'9'+; WS : (' '|'\n') {$channel=HIDDEN;} ; ''') treeGrammar = textwrap.dedent( r""" tree grammar TP; options {language=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;} tokens { X; } s : a* b ; // only b contributes to tree, but it's after a*; s.tree = b.tree a : X ; b : ^(ID INT) -> INT ; """) found = self.execTreeParser( grammar, 'a', treeGrammar, 's', "abc 34") self.assertEqual("34", found) def testRewriteModeChainRuleTree3(self): grammar = textwrap.dedent( r''' grammar T; options {language=Python3; output=AST;} a : 'boo' ID INT -> 'boo' ^(ID INT) ; ID : 'a'..'z'+ ; INT : '0'..'9'+; WS : (' '|'\n') {$channel=HIDDEN;} ; ''') treeGrammar = textwrap.dedent( r""" tree grammar TP; options {language=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;} tokens { X; } s : 'boo' a* b ; // don't reset s.tree to b.tree due to 'boo' a : X ; b : ^(ID INT) -> INT ; """) found = self.execTreeParser( grammar, 'a', treeGrammar, 's', "boo abc 34") self.assertEqual("boo 34", found) def testRewriteModeChainRuleTree4(self): grammar = textwrap.dedent( r""" grammar T; options {language=Python3; output=AST;} a : 'boo' ID INT -> ^('boo' ^(ID INT)) ; ID : 'a'..'z'+ ; INT : '0'..'9'+; WS : (' '|'\n') {$channel=HIDDEN;} ; """) treeGrammar = textwrap.dedent( r""" tree grammar TP; options {language=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;} tokens { X; } s : ^('boo' a* b) ; // don't reset s.tree to b.tree due to 'boo' a : X ; b : ^(ID INT) -> INT ; """) found = self.execTreeParser( grammar, 'a', treeGrammar, 's', "boo abc 34") self.assertEqual("(boo 34)", found) def testRewriteModeChainRuleTree5(self): grammar = textwrap.dedent( r""" grammar T; options {language=Python3; output=AST;} a : 'boo' ID INT -> ^('boo' ^(ID INT)) ; ID : 'a'..'z'+ ; INT : '0'..'9'+; WS : (' '|'\n') {$channel=HIDDEN;} ; """) treeGrammar = textwrap.dedent( r""" tree grammar TP; options {language=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;} tokens { X; } s : ^(a b) ; // s.tree is a.tree a : 'boo' ; b : ^(ID INT) -> INT ; """) found = self.execTreeParser( grammar, 'a', treeGrammar, 's', "boo abc 34") self.assertEqual("(boo 34)", found) def testRewriteOfRuleRef(self): grammar = textwrap.dedent( r""" grammar T; options {language=Python3; output=AST;} a : ID INT -> ID INT | INT ; ID : 'a'..'z'+ ; INT : '0'..'9'+; WS : (' '|'\n') {$channel=HIDDEN;} ; """) treeGrammar = textwrap.dedent( r""" tree grammar TP; options {language=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;} s : a -> a ; a : ID INT -> ID INT ; """) found = self.execTreeParser( grammar, 'a', treeGrammar, 's', "abc 34") self.assertEqual("abc 34", found) def testRewriteOfRuleRefRoot(self): grammar = textwrap.dedent( r""" grammar T; options {language=Python3; output=AST;} a : ID INT INT -> ^(INT ^(ID INT)); ID : 'a'..'z'+ ; INT : '0'..'9'+; WS : (' '|'\n') {$channel=HIDDEN;} ; """) treeGrammar = textwrap.dedent( r""" tree grammar TP; options {language=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;} s : ^(a ^(ID INT)) -> a ; a : INT ; """) found = self.execTreeParser( grammar, 'a', treeGrammar, 's', "abc 12 34") # emits whole tree when you ref the root since I can't know whether # you want the children or not. You might be returning a whole new # tree. Hmm...still seems weird. oh well. self.assertEqual("(12 (abc 34))", found) def testRewriteOfRuleRefRootLabeled(self): grammar = textwrap.dedent( r""" grammar T; options {language=Python3; output=AST;} a : ID INT INT -> ^(INT ^(ID INT)); ID : 'a'..'z'+ ; INT : '0'..'9'+; WS : (' '|'\n') {$channel=HIDDEN;} ; """) treeGrammar = textwrap.dedent( r""" tree grammar TP; options {language=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;} s : ^(label=a ^(ID INT)) -> a ; a : INT ; """) found = self.execTreeParser( grammar, 'a', treeGrammar, 's', "abc 12 34") # emits whole tree when you ref the root since I can't know whether # you want the children or not. You might be returning a whole new # tree. Hmm...still seems weird. oh well. self.assertEqual("(12 (abc 34))", found) def testRewriteOfRuleRefRootListLabeled(self): grammar = textwrap.dedent( r""" grammar T; options {language=Python3; output=AST;} a : ID INT INT -> ^(INT ^(ID INT)); ID : 'a'..'z'+ ; INT : '0'..'9'+; WS : (' '|'\n') {$channel=HIDDEN;} ; """) treeGrammar = textwrap.dedent( r""" tree grammar TP; options {language=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;} s : ^(label+=a ^(ID INT)) -> a ; a : INT ; """) found = self.execTreeParser( grammar, 'a', treeGrammar, 's', "abc 12 34") # emits whole tree when you ref the root since I can't know whether # you want the children or not. You might be returning a whole new # tree. Hmm...still seems weird. oh well. self.assertEqual("(12 (abc 34))", found) def testRewriteOfRuleRefChild(self): grammar = textwrap.dedent( r""" grammar T; options {language=Python3; output=AST;} a : ID INT -> ^(ID ^(INT INT)); ID : 'a'..'z'+ ; INT : '0'..'9'+; WS : (' '|'\n') {$channel=HIDDEN;} ; """) treeGrammar = textwrap.dedent( r""" tree grammar TP; options {language=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;} s : ^(ID a) -> a ; a : ^(INT INT) ; """) found = self.execTreeParser( grammar, 'a', treeGrammar, 's', "abc 34") self.assertEqual("(34 34)", found) def testRewriteOfRuleRefLabel(self): grammar = textwrap.dedent( r""" grammar T; options {language=Python3; output=AST;} a : ID INT -> ^(ID ^(INT INT)); ID : 'a'..'z'+ ; INT : '0'..'9'+; WS : (' '|'\n') {$channel=HIDDEN;} ; """) treeGrammar = textwrap.dedent( r""" tree grammar TP; options {language=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;} s : ^(ID label=a) -> a ; a : ^(INT INT) ; """) found = self.execTreeParser( grammar, 'a', treeGrammar, 's', "abc 34") self.assertEqual("(34 34)", found) def testRewriteOfRuleRefListLabel(self): grammar = textwrap.dedent( r""" grammar T; options {language=Python3; output=AST;} a : ID INT -> ^(ID ^(INT INT)); ID : 'a'..'z'+ ; INT : '0'..'9'+; WS : (' '|'\n') {$channel=HIDDEN;} ; """) treeGrammar = textwrap.dedent( r""" tree grammar TP; options {language=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;} s : ^(ID label+=a) -> a ; a : ^(INT INT) ; """) found = self.execTreeParser( grammar, 'a', treeGrammar, 's', "abc 34") self.assertEqual("(34 34)", found) def testRewriteModeWithPredicatedRewrites(self): grammar = textwrap.dedent( r''' grammar T19; options { language=Python3; output=AST; } a : ID INT -> ^(ID["root"] ^(ID INT)) | INT -> ^(ID["root"] INT) ; ID : 'a'..'z'+ ; INT : '0'..'9'+; WS : (' '|'\n') {$channel=HIDDEN;} ; ''') treeGrammar = textwrap.dedent( r''' tree grammar TP19; options { language=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T19; rewrite=true; } s : ^(ID a) { self.buf += $s.start.toStringTree() }; a : ^(ID INT) -> {True}? ^(ID["ick"] INT) -> INT ; ''') found = self.execTreeParser( grammar, 'a', treeGrammar, 's', "abc 34" ) self.assertEqual("(root (ick 34))", found) def testWildcardSingleNode(self): grammar = textwrap.dedent( r''' grammar T; options { language=Python3; output=AST; } a : ID INT -> ^(ID["root"] INT); ID : 'a'..'z'+ ; INT : '0'..'9'+; WS : (' '|'\n') {$channel=HIDDEN;} ; ''') treeGrammar = textwrap.dedent( r''' tree grammar TP; options { language=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T; } s : ^(ID c=.) -> $c ; ''') found = self.execTreeParser( grammar, 'a', treeGrammar, 's', "abc 34" ) self.assertEqual("34", found) def testWildcardUnlabeledSingleNode(self): grammar = textwrap.dedent( r''' grammar T; options {language=Python3; output=AST;} a : ID INT -> ^(ID INT); ID : 'a'..'z'+ ; INT : '0'..'9'+; WS : (' '|'\n') {$channel=HIDDEN;} ; ''') treeGrammar = textwrap.dedent( r''' tree grammar TP; options {language=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T;} s : ^(ID .) -> ID ; ''') found = self.execTreeParser( grammar, 'a', treeGrammar, 's', "abc 34") self.assertEqual("abc", found) def testWildcardGrabsSubtree(self): grammar = textwrap.dedent( r''' grammar T; options {language=Python3; output=AST;} a : ID x=INT y=INT z=INT -> ^(ID[\"root\"] ^($x $y $z)); ID : 'a'..'z'+ ; INT : '0'..'9'+; WS : (' '|'\n') {$channel=HIDDEN;} ; ''') treeGrammar = textwrap.dedent( r''' tree grammar TP; options {language=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T;} s : ^(ID c=.) -> $c ; ''') found = self.execTreeParser( grammar, 'a', treeGrammar, 's', "abc 1 2 3") self.assertEqual("(1 2 3)", found) def testWildcardGrabsSubtree2(self): grammar = textwrap.dedent( r''' grammar T; options {language=Python3; output=AST;} a : ID x=INT y=INT z=INT -> ID ^($x $y $z); ID : 'a'..'z'+ ; INT : '0'..'9'+; WS : (' '|'\n') {$channel=HIDDEN;} ; ''') treeGrammar = textwrap.dedent( r''' tree grammar TP; options {language=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T;} s : ID c=. -> $c ; ''') found = self.execTreeParser( grammar, 'a', treeGrammar, 's', "abc 1 2 3") self.assertEqual("(1 2 3)", found) def testWildcardListLabel(self): grammar = textwrap.dedent( r''' grammar T; options {language=Python3; output=AST;} a : INT INT INT ; ID : 'a'..'z'+ ; INT : '0'..'9'+; WS : (' '|'\n') {$channel=HIDDEN;} ; ''') treeGrammar = textwrap.dedent( r''' tree grammar TP; options {language=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T;} s : (c+=.)+ -> $c+ ; ''') found = self.execTreeParser( grammar, 'a', treeGrammar, 's', "1 2 3") self.assertEqual("1 2 3", found) def testWildcardListLabel2(self): grammar = textwrap.dedent( r''' grammar T; options {language=Python3; output=AST; ASTLabelType=CommonTree;} a : x=INT y=INT z=INT -> ^($x ^($y $z) ^($y $z)); ID : 'a'..'z'+ ; INT : '0'..'9'+; WS : (' '|'\n') {$channel=HIDDEN;} ; ''') treeGrammar = textwrap.dedent( r''' tree grammar TP; options {language=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;} s : ^(INT (c+=.)+) -> $c+ ; ''') found = self.execTreeParser( grammar, 'a', treeGrammar, 's', "1 2 3") self.assertEqual("(2 3) (2 3)", found) def testRuleResultAsRoot(self): grammar = textwrap.dedent( r''' grammar T; options { language=Python3; output=AST; } a : ID '=' INT -> ^('=' ID INT); ID : 'a'..'z'+ ; INT : '0'..'9'+; COLON : ':' ; WS : (' '|'\n') {$channel=HIDDEN;} ; ''') treeGrammar = textwrap.dedent( r''' tree grammar TP; options { language=Python3; output=AST; rewrite=true; ASTLabelType=CommonTree; tokenVocab=T; } a : ^(eq e1=ID e2=.) -> ^(eq $e2 $e1) ; eq : '=' | ':' {pass} ; // bug in set match, doesn't add to tree!! booh. force nonset. ''') found = self.execTreeParser( grammar, 'a', treeGrammar, 'a', "abc = 34") self.assertEqual("(= 34 abc)", found) if __name__ == '__main__': unittest.main()