aboutsummaryrefslogtreecommitdiff
path: root/runtime/Python/tests/t051treeRewriteAST.py
diff options
context:
space:
mode:
Diffstat (limited to 'runtime/Python/tests/t051treeRewriteAST.py')
-rw-r--r--runtime/Python/tests/t051treeRewriteAST.py1593
1 files changed, 1593 insertions, 0 deletions
diff --git a/runtime/Python/tests/t051treeRewriteAST.py b/runtime/Python/tests/t051treeRewriteAST.py
new file mode 100644
index 0000000..39253b4
--- /dev/null
+++ b/runtime/Python/tests/t051treeRewriteAST.py
@@ -0,0 +1,1593 @@
+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):
+ base.__init__(self, *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 is not None:
+ return r.tree.toStringTree()
+
+ return ""
+
+
+ def testFlatList(self):
+ grammar = textwrap.dedent(
+ r'''
+ grammar T1;
+ options {
+ language=Python;
+ output=AST;
+ }
+ a : ID INT;
+ ID : 'a'..'z'+ ;
+ INT : '0'..'9'+;
+ WS : (' '|'\\n') {$channel=HIDDEN;} ;
+ ''')
+
+ treeGrammar = textwrap.dedent(
+ r'''
+ tree grammar TP1;
+ options {
+ language=Python;
+ output=AST;
+ ASTLabelType=CommonTree;
+ tokenVocab=T1;
+ }
+
+ a : ID INT -> INT ID;
+ ''')
+
+ found = self.execTreeParser(
+ grammar, 'a',
+ treeGrammar, 'a',
+ "abc 34"
+ )
+
+ self.failUnlessEqual("34 abc", found)
+
+
+ def testSimpleTree(self):
+ grammar = textwrap.dedent(
+ r'''
+ grammar T2;
+ options {
+ language=Python;
+ 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=Python;
+ output=AST;
+ ASTLabelType=CommonTree;
+ tokenVocab=T2;
+ }
+ a : ^(ID INT) -> ^(INT ID);
+ ''')
+
+ found = self.execTreeParser(
+ grammar, 'a',
+ treeGrammar, 'a',
+ "abc 34"
+ )
+
+ self.failUnlessEqual("(34 abc)", found)
+
+
+ def testCombinedRewriteAndAuto(self):
+ grammar = textwrap.dedent(
+ r'''
+ grammar T3;
+ options {
+ language=Python;
+ 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=Python;
+ output=AST;
+ ASTLabelType=CommonTree;
+ tokenVocab=T3;
+ }
+ a : ^(ID INT) -> ^(INT ID) | INT;
+ ''')
+
+ found = self.execTreeParser(
+ grammar, 'a',
+ treeGrammar, 'a',
+ "abc 34"
+ )
+
+ self.failUnlessEqual("(34 abc)", found)
+
+
+ found = self.execTreeParser(
+ grammar, 'a',
+ treeGrammar, 'a',
+ "34"
+ )
+
+ self.failUnlessEqual("34", found)
+
+
+ def testAvoidDup(self):
+ grammar = textwrap.dedent(
+ r'''
+ grammar T4;
+ options {
+ language=Python;
+ output=AST;
+ }
+ a : ID ;
+ ID : 'a'..'z'+ ;
+ INT : '0'..'9'+;
+ WS : (' '|'\\n') {$channel=HIDDEN;} ;
+ ''')
+
+ treeGrammar = textwrap.dedent(
+ r'''
+ tree grammar TP4;
+ options {
+ language=Python;
+ output=AST;
+ ASTLabelType=CommonTree;
+ tokenVocab=T4;
+ }
+ a : ID -> ^(ID ID);
+ ''')
+
+ found = self.execTreeParser(
+ grammar, 'a',
+ treeGrammar, 'a',
+ "abc"
+ )
+
+ self.failUnlessEqual("(abc abc)", found)
+
+
+ def testLoop(self):
+ grammar = textwrap.dedent(
+ r'''
+ grammar T5;
+ options {
+ language=Python;
+ 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=Python;
+ 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.failUnlessEqual("3 4 5 a b c", found)
+
+
+ def testAutoDup(self):
+ grammar = textwrap.dedent(
+ r'''
+ grammar T6;
+ options {
+ language=Python;
+ output=AST;
+ }
+ a : ID ;
+ ID : 'a'..'z'+ ;
+ INT : '0'..'9'+;
+ WS : (' '|'\\n') {$channel=HIDDEN;} ;
+ ''')
+
+ treeGrammar = textwrap.dedent(
+ r'''
+ tree grammar TP6;
+ options {
+ language=Python;
+ output=AST;
+ ASTLabelType=CommonTree;
+ tokenVocab=T6;
+ }
+ a : ID;
+ ''')
+
+ found = self.execTreeParser(
+ grammar, 'a',
+ treeGrammar, 'a',
+ "abc"
+ )
+
+ self.failUnlessEqual("abc", found)
+
+
+ def testAutoDupRule(self):
+ grammar = textwrap.dedent(
+ r'''
+ grammar T7;
+ options {
+ language=Python;
+ output=AST;
+ }
+ a : ID INT ;
+ ID : 'a'..'z'+ ;
+ INT : '0'..'9'+;
+ WS : (' '|'\\n') {$channel=HIDDEN;} ;
+ ''')
+
+ treeGrammar = textwrap.dedent(
+ r'''
+ tree grammar TP7;
+ options {
+ language=Python;
+ output=AST;
+ ASTLabelType=CommonTree;
+ tokenVocab=T7;
+ }
+ a : b c ;
+ b : ID ;
+ c : INT ;
+ ''')
+
+ found = self.execTreeParser(
+ grammar, 'a',
+ treeGrammar, 'a',
+ "a 1"
+ )
+
+ self.failUnlessEqual("a 1", found)
+
+
+ def testAutoWildcard(self):
+ grammar = textwrap.dedent(
+ r'''
+ grammar T;
+ options {language=Python;output=AST;}
+ a : ID INT ;
+ ID : 'a'..'z'+ ;
+ INT : '0'..'9'+;
+ WS : (' '|'\n') {$channel=HIDDEN;} ;
+ ''')
+
+ treeGrammar = textwrap.dedent(
+ r'''
+ tree grammar TP;
+ options {language=Python;output=AST; ASTLabelType=CommonTree; tokenVocab=T;}
+ a : ID .
+ ;
+ ''')
+
+ found = self.execTreeParser(
+ grammar, 'a',
+ treeGrammar, 'a',
+ "abc 34")
+ self.assertEquals("abc 34", found)
+
+
+# def testNoWildcardAsRootError(self):
+# ErrorQueue equeue = new ErrorQueue();
+# ErrorManager.setErrorListener(equeue);
+# >
+# String treeGrammar =
+# "tree grammar TP;\n"+
+# "options {language=Python;output=AST;}
+# "a : ^(. INT)
+# " ;\n";
+# >
+# Grammar g = new Grammar(treeGrammar);
+# Tool antlr = newTool();
+# antlr.setOutputDirectory(null); // write to /dev/null
+# CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
+# g.setCodeGenerator(generator);
+# generator.genRecognizer();
+# >
+# assertEquals("unexpected errors: "+equeue, 1, equeue.errors.size());
+# >
+# int expectedMsgID = ErrorManager.MSG_WILDCARD_AS_ROOT;
+# Object expectedArg = null;
+# antlr.RecognitionException expectedExc = null;
+# GrammarSyntaxMessage expectedMessage =
+# new GrammarSyntaxMessage(expectedMsgID, g, null, expectedArg, expectedExc);
+# >
+# checkError(equeue, expectedMessage);
+# }
+
+ def testAutoWildcard2(self):
+ grammar = textwrap.dedent(
+ r'''
+ grammar T;
+ options {language=Python;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=Python;output=AST; ASTLabelType=CommonTree; tokenVocab=T;}
+ a : ^(ID .)
+ ;
+ ''')
+
+ found = self.execTreeParser(
+ grammar, 'a',
+ treeGrammar, 'a',
+ "abc 34")
+ self.assertEquals("(abc 34)", found)
+
+
+ def testAutoWildcardWithLabel(self):
+ grammar = textwrap.dedent(
+ r'''
+ grammar T;
+ options {language=Python;output=AST;}
+ a : ID INT ;
+ ID : 'a'..'z'+ ;
+ INT : '0'..'9'+;
+ WS : (' '|'\n') {$channel=HIDDEN;} ;
+ ''')
+
+ treeGrammar = textwrap.dedent(
+ r'''
+ tree grammar TP;
+ options {language=Python;output=AST; ASTLabelType=CommonTree; tokenVocab=T;}
+ a : ID c=.
+ ;
+ ''')
+
+ found = self.execTreeParser(
+ grammar, 'a',
+ treeGrammar, 'a',
+ "abc 34")
+ self.assertEquals("abc 34", found)
+
+
+ def testAutoWildcardWithListLabel(self):
+ grammar = textwrap.dedent(
+ r'''
+ grammar T;
+ options {language=Python;output=AST;}
+ a : ID INT ;
+ ID : 'a'..'z'+ ;
+ INT : '0'..'9'+;
+ WS : (' '|'\n') {$channel=HIDDEN;} ;
+ ''')
+
+ treeGrammar = textwrap.dedent(
+ r'''
+ tree grammar TP;
+ options {language=Python;output=AST; ASTLabelType=CommonTree; tokenVocab=T;}
+ a : ID c+=.
+ ;
+ ''')
+
+ found = self.execTreeParser(
+ grammar, 'a',
+ treeGrammar, 'a',
+ "abc 34")
+ self.assertEquals("abc 34", found)
+
+
+ def testAutoDupMultiple(self):
+ grammar = textwrap.dedent(
+ r'''
+ grammar T8;
+ options {
+ language=Python;
+ 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=Python;
+ output=AST;
+ ASTLabelType=CommonTree;
+ tokenVocab=T8;
+ }
+ a : ID ID INT
+ ;
+ ''')
+
+ found = self.execTreeParser(
+ grammar, 'a',
+ treeGrammar, 'a',
+ "a b 3"
+ )
+
+ self.failUnlessEqual("a b 3", found)
+
+
+ def testAutoDupTree(self):
+ grammar = textwrap.dedent(
+ r'''
+ grammar T9;
+ options {
+ language=Python;
+ 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=Python;
+ output=AST;
+ ASTLabelType=CommonTree;
+ tokenVocab=T9;
+ }
+ a : ^(ID INT)
+ ;
+ ''')
+
+ found = self.execTreeParser(
+ grammar, 'a',
+ treeGrammar, 'a',
+ "a 3"
+ )
+
+ self.failUnlessEqual("(a 3)", found)
+
+
+ def testAutoDupTreeWithLabels(self):
+ grammar = textwrap.dedent(
+ r'''
+ grammar T10;
+ options {
+ language=Python;
+ 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=Python;
+ output=AST;
+ ASTLabelType=CommonTree;
+ tokenVocab=T10;
+ }
+ a : ^(x=ID y=INT)
+ ;
+ ''')
+
+ found = self.execTreeParser(
+ grammar, 'a',
+ treeGrammar, 'a',
+ "a 3"
+ )
+
+ self.failUnlessEqual("(a 3)", found)
+
+
+ def testAutoDupTreeWithListLabels(self):
+ grammar = textwrap.dedent(
+ r'''
+ grammar T11;
+ options {
+ language=Python;
+ 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=Python;
+ output=AST;
+ ASTLabelType=CommonTree;
+ tokenVocab=T11;
+ }
+ a : ^(x+=ID y+=INT)
+ ;
+ ''')
+
+ found = self.execTreeParser(
+ grammar, 'a',
+ treeGrammar, 'a',
+ "a 3"
+ )
+
+ self.failUnlessEqual("(a 3)", found)
+
+
+ def testAutoDupTreeWithRuleRoot(self):
+ grammar = textwrap.dedent(
+ r'''
+ grammar T12;
+ options {
+ language=Python;
+ 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=Python;
+ output=AST;
+ ASTLabelType=CommonTree;
+ tokenVocab=T12;
+ }
+ a : ^(b INT) ;
+ b : ID ;
+ ''')
+
+ found = self.execTreeParser(
+ grammar, 'a',
+ treeGrammar, 'a',
+ "a 3"
+ )
+
+ self.failUnlessEqual("(a 3)", found)
+
+
+ def testAutoDupTreeWithRuleRootAndLabels(self):
+ grammar = textwrap.dedent(
+ r'''
+ grammar T13;
+ options {
+ language=Python;
+ 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=Python;
+ output=AST;
+ ASTLabelType=CommonTree;
+ tokenVocab=T13;
+ }
+ a : ^(x=b INT) ;
+ b : ID ;
+ ''')
+
+ found = self.execTreeParser(
+ grammar, 'a',
+ treeGrammar, 'a',
+ "a 3"
+ )
+
+ self.failUnlessEqual("(a 3)", found)
+
+
+ def testAutoDupTreeWithRuleRootAndListLabels(self):
+ grammar = textwrap.dedent(
+ r'''
+ grammar T14;
+ options {
+ language=Python;
+ 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=Python;
+ 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.failUnlessEqual("(a 3)", found)
+
+
+ def testAutoDupNestedTree(self):
+ grammar = textwrap.dedent(
+ r'''
+ grammar T15;
+ options {
+ language=Python;
+ 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=Python;
+ output=AST;
+ ASTLabelType=CommonTree;
+ tokenVocab=T15;
+ }
+ a : ^(ID ^(ID INT))
+ ;
+ ''')
+
+ found = self.execTreeParser(
+ grammar, 'a',
+ treeGrammar, 'a',
+ "a b 3"
+ )
+
+ self.failUnlessEqual("(a (b 3))", found)
+
+
+ def testDelete(self):
+ grammar = textwrap.dedent(
+ r'''
+ grammar T16;
+ options {
+ language=Python;
+ output=AST;
+ }
+ a : ID ;
+ ID : 'a'..'z'+ ;
+ INT : '0'..'9'+;
+ WS : (' '|'\\n') {$channel=HIDDEN;} ;
+ ''')
+
+ treeGrammar = textwrap.dedent(
+ r'''
+ tree grammar TP16;
+ options {
+ language=Python;
+ output=AST;
+ ASTLabelType=CommonTree;
+ tokenVocab=T16;
+ }
+ a : ID ->
+ ;
+ ''')
+
+ found = self.execTreeParser(
+ grammar, 'a',
+ treeGrammar, 'a',
+ "abc"
+ )
+
+ self.failUnlessEqual("", found)
+
+ def testSetMatchNoRewrite(self):
+ grammar = textwrap.dedent(
+ r'''
+ grammar T;
+ options {
+ language=Python;
+ output=AST;
+ }
+ a : ID INT ;
+ ID : 'a'..'z'+ ;
+ INT : '0'..'9'+;
+ WS : (' '|'\n') {$channel=HIDDEN;} ;
+ ''')
+
+ treeGrammar = textwrap.dedent(
+ r'''
+ tree grammar TP;
+ options {
+ language=Python;
+ output=AST;
+ ASTLabelType=CommonTree;
+ tokenVocab=T;
+ }
+ a : b INT;
+ b : ID | INT;
+ ''')
+
+ found = self.execTreeParser(
+ grammar, 'a',
+ treeGrammar, 'a',
+ "abc 34"
+ )
+
+ self.failUnlessEqual("abc 34", found)
+
+
+ def testSetOptionalMatchNoRewrite(self):
+ grammar = textwrap.dedent(
+ r'''
+ grammar T;
+ options {
+ language=Python;
+ output=AST;
+ }
+ a : ID INT ;
+ ID : 'a'..'z'+ ;
+ INT : '0'..'9'+;
+ WS : (' '|'\n') {$channel=HIDDEN;} ;
+ ''')
+
+ treeGrammar = textwrap.dedent(
+ r'''
+ tree grammar TP;
+ options {
+ language=Python;
+ output=AST;
+ ASTLabelType=CommonTree;
+ tokenVocab=T;
+ }
+ a : (ID|INT)? INT ;
+ ''')
+
+ found = self.execTreeParser(
+ grammar, 'a',
+ treeGrammar, 'a',
+ "abc 34")
+
+ self.failUnlessEqual("abc 34", found)
+
+
+ def testSetMatchNoRewriteLevel2(self):
+ grammar = textwrap.dedent(
+ r'''
+ grammar T;
+ options {
+ language=Python;
+ 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=Python;
+ output=AST;
+ ASTLabelType=CommonTree;
+ tokenVocab=T;
+ }
+ a : ^(ID (ID | INT) ) ;
+ ''')
+
+ found = self.execTreeParser(
+ grammar, 'a',
+ treeGrammar, 'a',
+ "abc 34"
+ )
+
+ self.failUnlessEqual("(abc 34)", found)
+
+
+ def testSetMatchNoRewriteLevel2Root(self):
+ grammar = textwrap.dedent(
+ r'''
+ grammar T;
+ options {
+ language=Python;
+ 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=Python;
+ output=AST;
+ ASTLabelType=CommonTree;
+ tokenVocab=T;
+ }
+ a : ^((ID | INT) INT) ;
+ ''')
+
+ found = self.execTreeParser(
+ grammar, 'a',
+ treeGrammar, 'a',
+ "abc 34"
+ )
+
+ self.failUnlessEqual("(abc 34)", found)
+
+
+ ## REWRITE MODE
+
+ def testRewriteModeCombinedRewriteAndAuto(self):
+ grammar = textwrap.dedent(
+ r'''
+ grammar T17;
+ options {
+ language=Python;
+ 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=Python;
+ 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.failUnlessEqual("(ick 34)", found)
+
+
+ found = self.execTreeParser(
+ grammar, 'a',
+ treeGrammar, 'a',
+ "34"
+ )
+
+ self.failUnlessEqual("34", found)
+
+
+ def testRewriteModeFlatTree(self):
+ grammar = textwrap.dedent(
+ r'''
+ grammar T18;
+ options {
+ language=Python;
+ 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=Python;
+ 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.assertEquals("abc 1", found)
+
+
+ def testRewriteModeChainRuleFlatTree(self):
+ grammar = textwrap.dedent(
+ r'''
+ grammar T;
+ options {language=Python; 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=Python; 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.assertEquals("34 abc", found)
+
+
+ def testRewriteModeChainRuleTree(self):
+ grammar = textwrap.dedent(
+ r'''
+ grammar T;
+ options {language=Python; 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=Python; 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.assertEquals("34", found)
+
+
+ def testRewriteModeChainRuleTree2(self):
+ grammar = textwrap.dedent(
+ r'''
+ grammar T;
+ options {language=Python; 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=Python; 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.assertEquals("34", found)
+
+
+ def testRewriteModeChainRuleTree3(self):
+ grammar = textwrap.dedent(
+ r'''
+ grammar T;
+ options {language=Python; 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=Python; 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.assertEquals("boo 34", found)
+
+
+ def testRewriteModeChainRuleTree4(self):
+ grammar = textwrap.dedent(
+ r"""
+ grammar T;
+ options {language=Python; 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=Python; 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.assertEquals("(boo 34)", found)
+
+
+ def testRewriteModeChainRuleTree5(self):
+ grammar = textwrap.dedent(
+ r"""
+ grammar T;
+ options {language=Python; 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=Python; 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.assertEquals("(boo 34)", found)
+
+
+ def testRewriteOfRuleRef(self):
+ grammar = textwrap.dedent(
+ r"""
+ grammar T;
+ options {language=Python; 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=Python; 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.failUnlessEqual("abc 34", found)
+
+
+ def testRewriteOfRuleRefRoot(self):
+ grammar = textwrap.dedent(
+ r"""
+ grammar T;
+ options {language=Python; 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=Python; 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.failUnlessEqual("(12 (abc 34))", found)
+
+
+ def testRewriteOfRuleRefRootLabeled(self):
+ grammar = textwrap.dedent(
+ r"""
+ grammar T;
+ options {language=Python; 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=Python; 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.failUnlessEqual("(12 (abc 34))", found)
+
+
+ def testRewriteOfRuleRefRootListLabeled(self):
+ grammar = textwrap.dedent(
+ r"""
+ grammar T;
+ options {language=Python; 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=Python; 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.failUnlessEqual("(12 (abc 34))", found)
+
+
+ def testRewriteOfRuleRefChild(self):
+ grammar = textwrap.dedent(
+ r"""
+ grammar T;
+ options {language=Python; 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=Python; 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.failUnlessEqual("(34 34)", found)
+
+
+ def testRewriteOfRuleRefLabel(self):
+ grammar = textwrap.dedent(
+ r"""
+ grammar T;
+ options {language=Python; 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=Python; 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.failUnlessEqual("(34 34)", found)
+
+
+ def testRewriteOfRuleRefListLabel(self):
+ grammar = textwrap.dedent(
+ r"""
+ grammar T;
+ options {language=Python; 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=Python; 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.failUnlessEqual("(34 34)", found)
+
+
+
+ def testRewriteModeWithPredicatedRewrites(self):
+ grammar = textwrap.dedent(
+ r'''
+ grammar T19;
+ options {
+ language=Python;
+ 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=Python;
+ 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.failUnlessEqual("(root (ick 34))", found)
+
+
+ def testWildcardSingleNode(self):
+ grammar = textwrap.dedent(
+ r'''
+ grammar T;
+ options {
+ language=Python;
+ 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=Python;
+ output=AST;
+ ASTLabelType=CommonTree;
+ tokenVocab=T;
+ }
+ s : ^(ID c=.) -> $c
+ ;
+ ''')
+
+ found = self.execTreeParser(
+ grammar, 'a',
+ treeGrammar, 's',
+ "abc 34"
+ )
+
+ self.failUnlessEqual("34", found)
+
+ def testWildcardUnlabeledSingleNode(self):
+ grammar = textwrap.dedent(
+ r'''
+ grammar T;
+ options {language=Python; 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=Python; output=AST; ASTLabelType=CommonTree; tokenVocab=T;}
+ s : ^(ID .) -> ID
+ ;
+ ''')
+
+ found = self.execTreeParser(
+ grammar, 'a',
+ treeGrammar, 's',
+ "abc 34")
+ self.assertEquals("abc", found)
+
+
+ def testWildcardGrabsSubtree(self):
+ grammar = textwrap.dedent(
+ r'''
+ grammar T;
+ options {language=Python; 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=Python; output=AST; ASTLabelType=CommonTree; tokenVocab=T;}
+ s : ^(ID c=.) -> $c
+ ;
+ ''')
+
+ found = self.execTreeParser(
+ grammar, 'a',
+ treeGrammar, 's',
+ "abc 1 2 3")
+ self.assertEquals("(1 2 3)", found)
+
+
+ def testWildcardGrabsSubtree2(self):
+ grammar = textwrap.dedent(
+ r'''
+ grammar T;
+ options {language=Python; 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=Python; output=AST; ASTLabelType=CommonTree; tokenVocab=T;}
+ s : ID c=. -> $c
+ ;
+ ''')
+
+ found = self.execTreeParser(
+ grammar, 'a',
+ treeGrammar, 's',
+ "abc 1 2 3")
+ self.assertEquals("(1 2 3)", found)
+
+
+ def testWildcardListLabel(self):
+ grammar = textwrap.dedent(
+ r'''
+ grammar T;
+ options {language=Python; 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=Python; output=AST; ASTLabelType=CommonTree; tokenVocab=T;}
+ s : (c+=.)+ -> $c+
+ ;
+ ''')
+
+ found = self.execTreeParser(
+ grammar, 'a',
+ treeGrammar, 's',
+ "1 2 3")
+ self.assertEquals("1 2 3", found)
+
+
+ def testWildcardListLabel2(self):
+ grammar = textwrap.dedent(
+ r'''
+ grammar T;
+ options {language=Python; 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=Python; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;}
+ s : ^(INT (c+=.)+) -> $c+
+ ;
+ ''')
+
+ found = self.execTreeParser(
+ grammar, 'a',
+ treeGrammar, 's',
+ "1 2 3")
+ self.assertEquals("(2 3) (2 3)", found)
+
+
+ def testRuleResultAsRoot(self):
+ grammar = textwrap.dedent(
+ r'''
+ grammar T;
+ options {
+ language=Python;
+ 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=Python;
+ 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.assertEquals("(= 34 abc)", found)
+
+
+if __name__ == '__main__':
+ unittest.main()