xref: /aosp_15_r20/external/antlr/runtime/Python/tests/t051treeRewriteAST.py (revision 16467b971bd3e2009fad32dd79016f2c7e421deb)
1*16467b97STreehugger Robotimport unittest
2*16467b97STreehugger Robotimport textwrap
3*16467b97STreehugger Robotimport antlr3
4*16467b97STreehugger Robotimport antlr3.tree
5*16467b97STreehugger Robotimport testbase
6*16467b97STreehugger Robot
7*16467b97STreehugger Robotclass T(testbase.ANTLRTest):
8*16467b97STreehugger Robot    def walkerClass(self, base):
9*16467b97STreehugger Robot        class TWalker(base):
10*16467b97STreehugger Robot            def __init__(self, *args, **kwargs):
11*16467b97STreehugger Robot                base.__init__(self, *args, **kwargs)
12*16467b97STreehugger Robot                self.buf = ""
13*16467b97STreehugger Robot
14*16467b97STreehugger Robot            def traceIn(self, ruleName, ruleIndex):
15*16467b97STreehugger Robot                self.traces.append('>'+ruleName)
16*16467b97STreehugger Robot
17*16467b97STreehugger Robot
18*16467b97STreehugger Robot            def traceOut(self, ruleName, ruleIndex):
19*16467b97STreehugger Robot                self.traces.append('<'+ruleName)
20*16467b97STreehugger Robot
21*16467b97STreehugger Robot
22*16467b97STreehugger Robot            def recover(self, input, re):
23*16467b97STreehugger Robot                # no error recovery yet, just crash!
24*16467b97STreehugger Robot                raise
25*16467b97STreehugger Robot
26*16467b97STreehugger Robot        return TWalker
27*16467b97STreehugger Robot
28*16467b97STreehugger Robot
29*16467b97STreehugger Robot    def execTreeParser(self, grammar, grammarEntry, treeGrammar, treeEntry, input):
30*16467b97STreehugger Robot        lexerCls, parserCls = self.compileInlineGrammar(grammar)
31*16467b97STreehugger Robot        walkerCls = self.compileInlineGrammar(treeGrammar)
32*16467b97STreehugger Robot
33*16467b97STreehugger Robot        cStream = antlr3.StringStream(input)
34*16467b97STreehugger Robot        lexer = lexerCls(cStream)
35*16467b97STreehugger Robot        tStream = antlr3.CommonTokenStream(lexer)
36*16467b97STreehugger Robot        parser = parserCls(tStream)
37*16467b97STreehugger Robot        r = getattr(parser, grammarEntry)()
38*16467b97STreehugger Robot        nodes = antlr3.tree.CommonTreeNodeStream(r.tree)
39*16467b97STreehugger Robot        nodes.setTokenStream(tStream)
40*16467b97STreehugger Robot        walker = walkerCls(nodes)
41*16467b97STreehugger Robot        r = getattr(walker, treeEntry)()
42*16467b97STreehugger Robot
43*16467b97STreehugger Robot        if r.tree is not None:
44*16467b97STreehugger Robot            return r.tree.toStringTree()
45*16467b97STreehugger Robot
46*16467b97STreehugger Robot        return ""
47*16467b97STreehugger Robot
48*16467b97STreehugger Robot
49*16467b97STreehugger Robot    def testFlatList(self):
50*16467b97STreehugger Robot        grammar = textwrap.dedent(
51*16467b97STreehugger Robot        r'''
52*16467b97STreehugger Robot        grammar T1;
53*16467b97STreehugger Robot        options {
54*16467b97STreehugger Robot            language=Python;
55*16467b97STreehugger Robot            output=AST;
56*16467b97STreehugger Robot        }
57*16467b97STreehugger Robot        a : ID INT;
58*16467b97STreehugger Robot        ID : 'a'..'z'+ ;
59*16467b97STreehugger Robot        INT : '0'..'9'+;
60*16467b97STreehugger Robot        WS : (' '|'\\n') {$channel=HIDDEN;} ;
61*16467b97STreehugger Robot        ''')
62*16467b97STreehugger Robot
63*16467b97STreehugger Robot        treeGrammar = textwrap.dedent(
64*16467b97STreehugger Robot        r'''
65*16467b97STreehugger Robot        tree grammar TP1;
66*16467b97STreehugger Robot        options {
67*16467b97STreehugger Robot            language=Python;
68*16467b97STreehugger Robot            output=AST;
69*16467b97STreehugger Robot            ASTLabelType=CommonTree;
70*16467b97STreehugger Robot            tokenVocab=T1;
71*16467b97STreehugger Robot        }
72*16467b97STreehugger Robot
73*16467b97STreehugger Robot        a : ID INT -> INT ID;
74*16467b97STreehugger Robot        ''')
75*16467b97STreehugger Robot
76*16467b97STreehugger Robot        found = self.execTreeParser(
77*16467b97STreehugger Robot            grammar, 'a',
78*16467b97STreehugger Robot            treeGrammar, 'a',
79*16467b97STreehugger Robot            "abc 34"
80*16467b97STreehugger Robot            )
81*16467b97STreehugger Robot
82*16467b97STreehugger Robot        self.failUnlessEqual("34 abc", found)
83*16467b97STreehugger Robot
84*16467b97STreehugger Robot
85*16467b97STreehugger Robot    def testSimpleTree(self):
86*16467b97STreehugger Robot        grammar = textwrap.dedent(
87*16467b97STreehugger Robot        r'''
88*16467b97STreehugger Robot        grammar T2;
89*16467b97STreehugger Robot        options {
90*16467b97STreehugger Robot            language=Python;
91*16467b97STreehugger Robot            output=AST;
92*16467b97STreehugger Robot        }
93*16467b97STreehugger Robot        a : ID INT -> ^(ID INT);
94*16467b97STreehugger Robot        ID : 'a'..'z'+ ;
95*16467b97STreehugger Robot        INT : '0'..'9'+;
96*16467b97STreehugger Robot        WS : (' '|'\\n') {$channel=HIDDEN;} ;
97*16467b97STreehugger Robot        ''')
98*16467b97STreehugger Robot
99*16467b97STreehugger Robot        treeGrammar = textwrap.dedent(
100*16467b97STreehugger Robot        r'''
101*16467b97STreehugger Robot        tree grammar TP2;
102*16467b97STreehugger Robot        options {
103*16467b97STreehugger Robot            language=Python;
104*16467b97STreehugger Robot            output=AST;
105*16467b97STreehugger Robot            ASTLabelType=CommonTree;
106*16467b97STreehugger Robot            tokenVocab=T2;
107*16467b97STreehugger Robot        }
108*16467b97STreehugger Robot        a : ^(ID INT) -> ^(INT ID);
109*16467b97STreehugger Robot        ''')
110*16467b97STreehugger Robot
111*16467b97STreehugger Robot        found = self.execTreeParser(
112*16467b97STreehugger Robot            grammar, 'a',
113*16467b97STreehugger Robot            treeGrammar, 'a',
114*16467b97STreehugger Robot            "abc 34"
115*16467b97STreehugger Robot            )
116*16467b97STreehugger Robot
117*16467b97STreehugger Robot        self.failUnlessEqual("(34 abc)", found)
118*16467b97STreehugger Robot
119*16467b97STreehugger Robot
120*16467b97STreehugger Robot    def testCombinedRewriteAndAuto(self):
121*16467b97STreehugger Robot        grammar = textwrap.dedent(
122*16467b97STreehugger Robot        r'''
123*16467b97STreehugger Robot        grammar T3;
124*16467b97STreehugger Robot        options {
125*16467b97STreehugger Robot            language=Python;
126*16467b97STreehugger Robot            output=AST;
127*16467b97STreehugger Robot        }
128*16467b97STreehugger Robot        a : ID INT -> ^(ID INT) | INT ;
129*16467b97STreehugger Robot        ID : 'a'..'z'+ ;
130*16467b97STreehugger Robot        INT : '0'..'9'+;
131*16467b97STreehugger Robot        WS : (' '|'\\n') {$channel=HIDDEN;} ;
132*16467b97STreehugger Robot        ''')
133*16467b97STreehugger Robot
134*16467b97STreehugger Robot        treeGrammar = textwrap.dedent(
135*16467b97STreehugger Robot        r'''
136*16467b97STreehugger Robot        tree grammar TP3;
137*16467b97STreehugger Robot        options {
138*16467b97STreehugger Robot            language=Python;
139*16467b97STreehugger Robot            output=AST;
140*16467b97STreehugger Robot            ASTLabelType=CommonTree;
141*16467b97STreehugger Robot            tokenVocab=T3;
142*16467b97STreehugger Robot        }
143*16467b97STreehugger Robot        a : ^(ID INT) -> ^(INT ID) | INT;
144*16467b97STreehugger Robot        ''')
145*16467b97STreehugger Robot
146*16467b97STreehugger Robot        found = self.execTreeParser(
147*16467b97STreehugger Robot            grammar, 'a',
148*16467b97STreehugger Robot            treeGrammar, 'a',
149*16467b97STreehugger Robot            "abc 34"
150*16467b97STreehugger Robot            )
151*16467b97STreehugger Robot
152*16467b97STreehugger Robot        self.failUnlessEqual("(34 abc)", found)
153*16467b97STreehugger Robot
154*16467b97STreehugger Robot
155*16467b97STreehugger Robot        found = self.execTreeParser(
156*16467b97STreehugger Robot            grammar, 'a',
157*16467b97STreehugger Robot            treeGrammar, 'a',
158*16467b97STreehugger Robot            "34"
159*16467b97STreehugger Robot            )
160*16467b97STreehugger Robot
161*16467b97STreehugger Robot        self.failUnlessEqual("34", found)
162*16467b97STreehugger Robot
163*16467b97STreehugger Robot
164*16467b97STreehugger Robot    def testAvoidDup(self):
165*16467b97STreehugger Robot        grammar = textwrap.dedent(
166*16467b97STreehugger Robot        r'''
167*16467b97STreehugger Robot        grammar T4;
168*16467b97STreehugger Robot        options {
169*16467b97STreehugger Robot            language=Python;
170*16467b97STreehugger Robot            output=AST;
171*16467b97STreehugger Robot        }
172*16467b97STreehugger Robot        a : ID ;
173*16467b97STreehugger Robot        ID : 'a'..'z'+ ;
174*16467b97STreehugger Robot        INT : '0'..'9'+;
175*16467b97STreehugger Robot        WS : (' '|'\\n') {$channel=HIDDEN;} ;
176*16467b97STreehugger Robot        ''')
177*16467b97STreehugger Robot
178*16467b97STreehugger Robot        treeGrammar = textwrap.dedent(
179*16467b97STreehugger Robot        r'''
180*16467b97STreehugger Robot        tree grammar TP4;
181*16467b97STreehugger Robot        options {
182*16467b97STreehugger Robot            language=Python;
183*16467b97STreehugger Robot            output=AST;
184*16467b97STreehugger Robot            ASTLabelType=CommonTree;
185*16467b97STreehugger Robot            tokenVocab=T4;
186*16467b97STreehugger Robot        }
187*16467b97STreehugger Robot        a : ID -> ^(ID ID);
188*16467b97STreehugger Robot        ''')
189*16467b97STreehugger Robot
190*16467b97STreehugger Robot        found = self.execTreeParser(
191*16467b97STreehugger Robot            grammar, 'a',
192*16467b97STreehugger Robot            treeGrammar, 'a',
193*16467b97STreehugger Robot            "abc"
194*16467b97STreehugger Robot            )
195*16467b97STreehugger Robot
196*16467b97STreehugger Robot        self.failUnlessEqual("(abc abc)", found)
197*16467b97STreehugger Robot
198*16467b97STreehugger Robot
199*16467b97STreehugger Robot    def testLoop(self):
200*16467b97STreehugger Robot        grammar = textwrap.dedent(
201*16467b97STreehugger Robot        r'''
202*16467b97STreehugger Robot        grammar T5;
203*16467b97STreehugger Robot        options {
204*16467b97STreehugger Robot            language=Python;
205*16467b97STreehugger Robot            output=AST;
206*16467b97STreehugger Robot        }
207*16467b97STreehugger Robot        a : ID+ INT+ -> (^(ID INT))+ ;
208*16467b97STreehugger Robot        ID : 'a'..'z'+ ;
209*16467b97STreehugger Robot        INT : '0'..'9'+;
210*16467b97STreehugger Robot        WS : (' '|'\\n') {$channel=HIDDEN;} ;
211*16467b97STreehugger Robot        ''')
212*16467b97STreehugger Robot
213*16467b97STreehugger Robot        treeGrammar = textwrap.dedent(
214*16467b97STreehugger Robot        r'''
215*16467b97STreehugger Robot        tree grammar TP5;
216*16467b97STreehugger Robot        options {
217*16467b97STreehugger Robot            language=Python;
218*16467b97STreehugger Robot            output=AST;
219*16467b97STreehugger Robot            ASTLabelType=CommonTree;
220*16467b97STreehugger Robot            tokenVocab=T5;
221*16467b97STreehugger Robot        }
222*16467b97STreehugger Robot        a : (^(ID INT))+ -> INT+ ID+;
223*16467b97STreehugger Robot        ''')
224*16467b97STreehugger Robot
225*16467b97STreehugger Robot        found = self.execTreeParser(
226*16467b97STreehugger Robot            grammar, 'a',
227*16467b97STreehugger Robot            treeGrammar, 'a',
228*16467b97STreehugger Robot            "a b c 3 4 5"
229*16467b97STreehugger Robot            )
230*16467b97STreehugger Robot
231*16467b97STreehugger Robot        self.failUnlessEqual("3 4 5 a b c", found)
232*16467b97STreehugger Robot
233*16467b97STreehugger Robot
234*16467b97STreehugger Robot    def testAutoDup(self):
235*16467b97STreehugger Robot        grammar = textwrap.dedent(
236*16467b97STreehugger Robot        r'''
237*16467b97STreehugger Robot        grammar T6;
238*16467b97STreehugger Robot        options {
239*16467b97STreehugger Robot            language=Python;
240*16467b97STreehugger Robot            output=AST;
241*16467b97STreehugger Robot        }
242*16467b97STreehugger Robot        a : ID ;
243*16467b97STreehugger Robot        ID : 'a'..'z'+ ;
244*16467b97STreehugger Robot        INT : '0'..'9'+;
245*16467b97STreehugger Robot        WS : (' '|'\\n') {$channel=HIDDEN;} ;
246*16467b97STreehugger Robot        ''')
247*16467b97STreehugger Robot
248*16467b97STreehugger Robot        treeGrammar = textwrap.dedent(
249*16467b97STreehugger Robot        r'''
250*16467b97STreehugger Robot        tree grammar TP6;
251*16467b97STreehugger Robot        options {
252*16467b97STreehugger Robot            language=Python;
253*16467b97STreehugger Robot            output=AST;
254*16467b97STreehugger Robot            ASTLabelType=CommonTree;
255*16467b97STreehugger Robot            tokenVocab=T6;
256*16467b97STreehugger Robot        }
257*16467b97STreehugger Robot        a : ID;
258*16467b97STreehugger Robot        ''')
259*16467b97STreehugger Robot
260*16467b97STreehugger Robot        found = self.execTreeParser(
261*16467b97STreehugger Robot            grammar, 'a',
262*16467b97STreehugger Robot            treeGrammar, 'a',
263*16467b97STreehugger Robot            "abc"
264*16467b97STreehugger Robot            )
265*16467b97STreehugger Robot
266*16467b97STreehugger Robot        self.failUnlessEqual("abc", found)
267*16467b97STreehugger Robot
268*16467b97STreehugger Robot
269*16467b97STreehugger Robot    def testAutoDupRule(self):
270*16467b97STreehugger Robot        grammar = textwrap.dedent(
271*16467b97STreehugger Robot        r'''
272*16467b97STreehugger Robot        grammar T7;
273*16467b97STreehugger Robot        options {
274*16467b97STreehugger Robot            language=Python;
275*16467b97STreehugger Robot            output=AST;
276*16467b97STreehugger Robot        }
277*16467b97STreehugger Robot        a : ID INT ;
278*16467b97STreehugger Robot        ID : 'a'..'z'+ ;
279*16467b97STreehugger Robot        INT : '0'..'9'+;
280*16467b97STreehugger Robot        WS : (' '|'\\n') {$channel=HIDDEN;} ;
281*16467b97STreehugger Robot        ''')
282*16467b97STreehugger Robot
283*16467b97STreehugger Robot        treeGrammar = textwrap.dedent(
284*16467b97STreehugger Robot        r'''
285*16467b97STreehugger Robot        tree grammar TP7;
286*16467b97STreehugger Robot        options {
287*16467b97STreehugger Robot            language=Python;
288*16467b97STreehugger Robot            output=AST;
289*16467b97STreehugger Robot            ASTLabelType=CommonTree;
290*16467b97STreehugger Robot            tokenVocab=T7;
291*16467b97STreehugger Robot        }
292*16467b97STreehugger Robot        a : b c ;
293*16467b97STreehugger Robot        b : ID ;
294*16467b97STreehugger Robot        c : INT ;
295*16467b97STreehugger Robot        ''')
296*16467b97STreehugger Robot
297*16467b97STreehugger Robot        found = self.execTreeParser(
298*16467b97STreehugger Robot            grammar, 'a',
299*16467b97STreehugger Robot            treeGrammar, 'a',
300*16467b97STreehugger Robot            "a 1"
301*16467b97STreehugger Robot            )
302*16467b97STreehugger Robot
303*16467b97STreehugger Robot        self.failUnlessEqual("a 1", found)
304*16467b97STreehugger Robot
305*16467b97STreehugger Robot
306*16467b97STreehugger Robot    def testAutoWildcard(self):
307*16467b97STreehugger Robot        grammar = textwrap.dedent(
308*16467b97STreehugger Robot            r'''
309*16467b97STreehugger Robot            grammar T;
310*16467b97STreehugger Robot            options {language=Python;output=AST;}
311*16467b97STreehugger Robot            a : ID INT ;
312*16467b97STreehugger Robot            ID : 'a'..'z'+ ;
313*16467b97STreehugger Robot            INT : '0'..'9'+;
314*16467b97STreehugger Robot            WS : (' '|'\n') {$channel=HIDDEN;} ;
315*16467b97STreehugger Robot            ''')
316*16467b97STreehugger Robot
317*16467b97STreehugger Robot        treeGrammar = textwrap.dedent(
318*16467b97STreehugger Robot            r'''
319*16467b97STreehugger Robot            tree grammar TP;
320*16467b97STreehugger Robot            options {language=Python;output=AST; ASTLabelType=CommonTree; tokenVocab=T;}
321*16467b97STreehugger Robot            a : ID .
322*16467b97STreehugger Robot              ;
323*16467b97STreehugger Robot            ''')
324*16467b97STreehugger Robot
325*16467b97STreehugger Robot        found = self.execTreeParser(
326*16467b97STreehugger Robot            grammar, 'a',
327*16467b97STreehugger Robot            treeGrammar, 'a',
328*16467b97STreehugger Robot            "abc 34")
329*16467b97STreehugger Robot        self.assertEquals("abc 34", found)
330*16467b97STreehugger Robot
331*16467b97STreehugger Robot
332*16467b97STreehugger Robot#     def testNoWildcardAsRootError(self):
333*16467b97STreehugger Robot#         ErrorQueue equeue = new ErrorQueue();
334*16467b97STreehugger Robot#         ErrorManager.setErrorListener(equeue);
335*16467b97STreehugger Robot# >
336*16467b97STreehugger Robot#         String treeGrammar =
337*16467b97STreehugger Robot#             "tree grammar TP;\n"+
338*16467b97STreehugger Robot#             "options {language=Python;output=AST;}
339*16467b97STreehugger Robot#             "a : ^(. INT)
340*16467b97STreehugger Robot#             "  ;\n";
341*16467b97STreehugger Robot# >
342*16467b97STreehugger Robot#         Grammar g = new Grammar(treeGrammar);
343*16467b97STreehugger Robot#         Tool antlr = newTool();
344*16467b97STreehugger Robot#         antlr.setOutputDirectory(null); // write to /dev/null
345*16467b97STreehugger Robot#         CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
346*16467b97STreehugger Robot#         g.setCodeGenerator(generator);
347*16467b97STreehugger Robot#         generator.genRecognizer();
348*16467b97STreehugger Robot# >
349*16467b97STreehugger Robot#         assertEquals("unexpected errors: "+equeue, 1, equeue.errors.size());
350*16467b97STreehugger Robot# >
351*16467b97STreehugger Robot#         int expectedMsgID = ErrorManager.MSG_WILDCARD_AS_ROOT;
352*16467b97STreehugger Robot#         Object expectedArg = null;
353*16467b97STreehugger Robot#         antlr.RecognitionException expectedExc = null;
354*16467b97STreehugger Robot#         GrammarSyntaxMessage expectedMessage =
355*16467b97STreehugger Robot#             new GrammarSyntaxMessage(expectedMsgID, g, null, expectedArg, expectedExc);
356*16467b97STreehugger Robot# >
357*16467b97STreehugger Robot#         checkError(equeue, expectedMessage);
358*16467b97STreehugger Robot#     }
359*16467b97STreehugger Robot
360*16467b97STreehugger Robot    def testAutoWildcard2(self):
361*16467b97STreehugger Robot        grammar = textwrap.dedent(
362*16467b97STreehugger Robot            r'''
363*16467b97STreehugger Robot            grammar T;
364*16467b97STreehugger Robot            options {language=Python;output=AST;}
365*16467b97STreehugger Robot            a : ID INT -> ^(ID INT);
366*16467b97STreehugger Robot            ID : 'a'..'z'+ ;
367*16467b97STreehugger Robot            INT : '0'..'9'+;
368*16467b97STreehugger Robot            WS : (' '|'\n') {$channel=HIDDEN;} ;
369*16467b97STreehugger Robot            ''')
370*16467b97STreehugger Robot
371*16467b97STreehugger Robot        treeGrammar = textwrap.dedent(
372*16467b97STreehugger Robot            r'''
373*16467b97STreehugger Robot            tree grammar TP;
374*16467b97STreehugger Robot            options {language=Python;output=AST; ASTLabelType=CommonTree; tokenVocab=T;}
375*16467b97STreehugger Robot            a : ^(ID .)
376*16467b97STreehugger Robot              ;
377*16467b97STreehugger Robot            ''')
378*16467b97STreehugger Robot
379*16467b97STreehugger Robot        found = self.execTreeParser(
380*16467b97STreehugger Robot            grammar, 'a',
381*16467b97STreehugger Robot            treeGrammar, 'a',
382*16467b97STreehugger Robot            "abc 34")
383*16467b97STreehugger Robot        self.assertEquals("(abc 34)", found)
384*16467b97STreehugger Robot
385*16467b97STreehugger Robot
386*16467b97STreehugger Robot    def testAutoWildcardWithLabel(self):
387*16467b97STreehugger Robot        grammar = textwrap.dedent(
388*16467b97STreehugger Robot            r'''
389*16467b97STreehugger Robot            grammar T;
390*16467b97STreehugger Robot            options {language=Python;output=AST;}
391*16467b97STreehugger Robot            a : ID INT ;
392*16467b97STreehugger Robot            ID : 'a'..'z'+ ;
393*16467b97STreehugger Robot            INT : '0'..'9'+;
394*16467b97STreehugger Robot            WS : (' '|'\n') {$channel=HIDDEN;} ;
395*16467b97STreehugger Robot            ''')
396*16467b97STreehugger Robot
397*16467b97STreehugger Robot        treeGrammar = textwrap.dedent(
398*16467b97STreehugger Robot            r'''
399*16467b97STreehugger Robot            tree grammar TP;
400*16467b97STreehugger Robot            options {language=Python;output=AST; ASTLabelType=CommonTree; tokenVocab=T;}
401*16467b97STreehugger Robot            a : ID c=.
402*16467b97STreehugger Robot              ;
403*16467b97STreehugger Robot            ''')
404*16467b97STreehugger Robot
405*16467b97STreehugger Robot        found = self.execTreeParser(
406*16467b97STreehugger Robot            grammar, 'a',
407*16467b97STreehugger Robot            treeGrammar, 'a',
408*16467b97STreehugger Robot            "abc 34")
409*16467b97STreehugger Robot        self.assertEquals("abc 34", found)
410*16467b97STreehugger Robot
411*16467b97STreehugger Robot
412*16467b97STreehugger Robot    def testAutoWildcardWithListLabel(self):
413*16467b97STreehugger Robot        grammar = textwrap.dedent(
414*16467b97STreehugger Robot            r'''
415*16467b97STreehugger Robot            grammar T;
416*16467b97STreehugger Robot            options {language=Python;output=AST;}
417*16467b97STreehugger Robot            a : ID INT ;
418*16467b97STreehugger Robot            ID : 'a'..'z'+ ;
419*16467b97STreehugger Robot            INT : '0'..'9'+;
420*16467b97STreehugger Robot            WS : (' '|'\n') {$channel=HIDDEN;} ;
421*16467b97STreehugger Robot            ''')
422*16467b97STreehugger Robot
423*16467b97STreehugger Robot        treeGrammar = textwrap.dedent(
424*16467b97STreehugger Robot            r'''
425*16467b97STreehugger Robot            tree grammar TP;
426*16467b97STreehugger Robot            options {language=Python;output=AST; ASTLabelType=CommonTree; tokenVocab=T;}
427*16467b97STreehugger Robot            a : ID c+=.
428*16467b97STreehugger Robot              ;
429*16467b97STreehugger Robot            ''')
430*16467b97STreehugger Robot
431*16467b97STreehugger Robot        found = self.execTreeParser(
432*16467b97STreehugger Robot            grammar, 'a',
433*16467b97STreehugger Robot            treeGrammar, 'a',
434*16467b97STreehugger Robot            "abc 34")
435*16467b97STreehugger Robot        self.assertEquals("abc 34", found)
436*16467b97STreehugger Robot
437*16467b97STreehugger Robot
438*16467b97STreehugger Robot    def testAutoDupMultiple(self):
439*16467b97STreehugger Robot        grammar = textwrap.dedent(
440*16467b97STreehugger Robot        r'''
441*16467b97STreehugger Robot        grammar T8;
442*16467b97STreehugger Robot        options {
443*16467b97STreehugger Robot            language=Python;
444*16467b97STreehugger Robot            output=AST;
445*16467b97STreehugger Robot        }
446*16467b97STreehugger Robot        a : ID ID INT;
447*16467b97STreehugger Robot        ID : 'a'..'z'+ ;
448*16467b97STreehugger Robot        INT : '0'..'9'+;
449*16467b97STreehugger Robot        WS : (' '|'\\n') {$channel=HIDDEN;} ;
450*16467b97STreehugger Robot        ''')
451*16467b97STreehugger Robot
452*16467b97STreehugger Robot        treeGrammar = textwrap.dedent(
453*16467b97STreehugger Robot        r'''
454*16467b97STreehugger Robot        tree grammar TP8;
455*16467b97STreehugger Robot        options {
456*16467b97STreehugger Robot            language=Python;
457*16467b97STreehugger Robot            output=AST;
458*16467b97STreehugger Robot            ASTLabelType=CommonTree;
459*16467b97STreehugger Robot            tokenVocab=T8;
460*16467b97STreehugger Robot        }
461*16467b97STreehugger Robot        a : ID ID INT
462*16467b97STreehugger Robot          ;
463*16467b97STreehugger Robot        ''')
464*16467b97STreehugger Robot
465*16467b97STreehugger Robot        found = self.execTreeParser(
466*16467b97STreehugger Robot            grammar, 'a',
467*16467b97STreehugger Robot            treeGrammar, 'a',
468*16467b97STreehugger Robot            "a b 3"
469*16467b97STreehugger Robot            )
470*16467b97STreehugger Robot
471*16467b97STreehugger Robot        self.failUnlessEqual("a b 3", found)
472*16467b97STreehugger Robot
473*16467b97STreehugger Robot
474*16467b97STreehugger Robot    def testAutoDupTree(self):
475*16467b97STreehugger Robot        grammar = textwrap.dedent(
476*16467b97STreehugger Robot        r'''
477*16467b97STreehugger Robot        grammar T9;
478*16467b97STreehugger Robot        options {
479*16467b97STreehugger Robot            language=Python;
480*16467b97STreehugger Robot            output=AST;
481*16467b97STreehugger Robot        }
482*16467b97STreehugger Robot        a : ID INT -> ^(ID INT);
483*16467b97STreehugger Robot        ID : 'a'..'z'+ ;
484*16467b97STreehugger Robot        INT : '0'..'9'+;
485*16467b97STreehugger Robot        WS : (' '|'\\n') {$channel=HIDDEN;} ;
486*16467b97STreehugger Robot        ''')
487*16467b97STreehugger Robot
488*16467b97STreehugger Robot        treeGrammar = textwrap.dedent(
489*16467b97STreehugger Robot        r'''
490*16467b97STreehugger Robot        tree grammar TP9;
491*16467b97STreehugger Robot        options {
492*16467b97STreehugger Robot            language=Python;
493*16467b97STreehugger Robot            output=AST;
494*16467b97STreehugger Robot            ASTLabelType=CommonTree;
495*16467b97STreehugger Robot            tokenVocab=T9;
496*16467b97STreehugger Robot        }
497*16467b97STreehugger Robot        a : ^(ID INT)
498*16467b97STreehugger Robot          ;
499*16467b97STreehugger Robot        ''')
500*16467b97STreehugger Robot
501*16467b97STreehugger Robot        found = self.execTreeParser(
502*16467b97STreehugger Robot            grammar, 'a',
503*16467b97STreehugger Robot            treeGrammar, 'a',
504*16467b97STreehugger Robot            "a 3"
505*16467b97STreehugger Robot            )
506*16467b97STreehugger Robot
507*16467b97STreehugger Robot        self.failUnlessEqual("(a 3)", found)
508*16467b97STreehugger Robot
509*16467b97STreehugger Robot
510*16467b97STreehugger Robot    def testAutoDupTreeWithLabels(self):
511*16467b97STreehugger Robot        grammar = textwrap.dedent(
512*16467b97STreehugger Robot        r'''
513*16467b97STreehugger Robot        grammar T10;
514*16467b97STreehugger Robot        options {
515*16467b97STreehugger Robot            language=Python;
516*16467b97STreehugger Robot            output=AST;
517*16467b97STreehugger Robot        }
518*16467b97STreehugger Robot        a : ID INT -> ^(ID INT);
519*16467b97STreehugger Robot        ID : 'a'..'z'+ ;
520*16467b97STreehugger Robot        INT : '0'..'9'+;
521*16467b97STreehugger Robot        WS : (' '|'\\n') {$channel=HIDDEN;} ;
522*16467b97STreehugger Robot        ''')
523*16467b97STreehugger Robot
524*16467b97STreehugger Robot        treeGrammar = textwrap.dedent(
525*16467b97STreehugger Robot        r'''
526*16467b97STreehugger Robot        tree grammar TP10;
527*16467b97STreehugger Robot        options {
528*16467b97STreehugger Robot            language=Python;
529*16467b97STreehugger Robot            output=AST;
530*16467b97STreehugger Robot            ASTLabelType=CommonTree;
531*16467b97STreehugger Robot            tokenVocab=T10;
532*16467b97STreehugger Robot        }
533*16467b97STreehugger Robot        a : ^(x=ID y=INT)
534*16467b97STreehugger Robot          ;
535*16467b97STreehugger Robot        ''')
536*16467b97STreehugger Robot
537*16467b97STreehugger Robot        found = self.execTreeParser(
538*16467b97STreehugger Robot            grammar, 'a',
539*16467b97STreehugger Robot            treeGrammar, 'a',
540*16467b97STreehugger Robot            "a 3"
541*16467b97STreehugger Robot            )
542*16467b97STreehugger Robot
543*16467b97STreehugger Robot        self.failUnlessEqual("(a 3)", found)
544*16467b97STreehugger Robot
545*16467b97STreehugger Robot
546*16467b97STreehugger Robot    def testAutoDupTreeWithListLabels(self):
547*16467b97STreehugger Robot        grammar = textwrap.dedent(
548*16467b97STreehugger Robot        r'''
549*16467b97STreehugger Robot        grammar T11;
550*16467b97STreehugger Robot        options {
551*16467b97STreehugger Robot            language=Python;
552*16467b97STreehugger Robot            output=AST;
553*16467b97STreehugger Robot        }
554*16467b97STreehugger Robot        a : ID INT -> ^(ID INT);
555*16467b97STreehugger Robot        ID : 'a'..'z'+ ;
556*16467b97STreehugger Robot        INT : '0'..'9'+;
557*16467b97STreehugger Robot        WS : (' '|'\\n') {$channel=HIDDEN;} ;
558*16467b97STreehugger Robot        ''')
559*16467b97STreehugger Robot
560*16467b97STreehugger Robot        treeGrammar = textwrap.dedent(
561*16467b97STreehugger Robot        r'''
562*16467b97STreehugger Robot        tree grammar TP11;
563*16467b97STreehugger Robot        options {
564*16467b97STreehugger Robot            language=Python;
565*16467b97STreehugger Robot            output=AST;
566*16467b97STreehugger Robot            ASTLabelType=CommonTree;
567*16467b97STreehugger Robot            tokenVocab=T11;
568*16467b97STreehugger Robot        }
569*16467b97STreehugger Robot        a : ^(x+=ID y+=INT)
570*16467b97STreehugger Robot          ;
571*16467b97STreehugger Robot        ''')
572*16467b97STreehugger Robot
573*16467b97STreehugger Robot        found = self.execTreeParser(
574*16467b97STreehugger Robot            grammar, 'a',
575*16467b97STreehugger Robot            treeGrammar, 'a',
576*16467b97STreehugger Robot            "a 3"
577*16467b97STreehugger Robot            )
578*16467b97STreehugger Robot
579*16467b97STreehugger Robot        self.failUnlessEqual("(a 3)", found)
580*16467b97STreehugger Robot
581*16467b97STreehugger Robot
582*16467b97STreehugger Robot    def testAutoDupTreeWithRuleRoot(self):
583*16467b97STreehugger Robot        grammar = textwrap.dedent(
584*16467b97STreehugger Robot        r'''
585*16467b97STreehugger Robot        grammar T12;
586*16467b97STreehugger Robot        options {
587*16467b97STreehugger Robot            language=Python;
588*16467b97STreehugger Robot            output=AST;
589*16467b97STreehugger Robot        }
590*16467b97STreehugger Robot        a : ID INT -> ^(ID INT);
591*16467b97STreehugger Robot        ID : 'a'..'z'+ ;
592*16467b97STreehugger Robot        INT : '0'..'9'+;
593*16467b97STreehugger Robot        WS : (' '|'\\n') {$channel=HIDDEN;} ;
594*16467b97STreehugger Robot        ''')
595*16467b97STreehugger Robot
596*16467b97STreehugger Robot        treeGrammar = textwrap.dedent(
597*16467b97STreehugger Robot        r'''
598*16467b97STreehugger Robot        tree grammar TP12;
599*16467b97STreehugger Robot        options {
600*16467b97STreehugger Robot            language=Python;
601*16467b97STreehugger Robot            output=AST;
602*16467b97STreehugger Robot            ASTLabelType=CommonTree;
603*16467b97STreehugger Robot            tokenVocab=T12;
604*16467b97STreehugger Robot        }
605*16467b97STreehugger Robot        a : ^(b INT) ;
606*16467b97STreehugger Robot        b : ID ;
607*16467b97STreehugger Robot        ''')
608*16467b97STreehugger Robot
609*16467b97STreehugger Robot        found = self.execTreeParser(
610*16467b97STreehugger Robot            grammar, 'a',
611*16467b97STreehugger Robot            treeGrammar, 'a',
612*16467b97STreehugger Robot            "a 3"
613*16467b97STreehugger Robot            )
614*16467b97STreehugger Robot
615*16467b97STreehugger Robot        self.failUnlessEqual("(a 3)", found)
616*16467b97STreehugger Robot
617*16467b97STreehugger Robot
618*16467b97STreehugger Robot    def testAutoDupTreeWithRuleRootAndLabels(self):
619*16467b97STreehugger Robot        grammar = textwrap.dedent(
620*16467b97STreehugger Robot        r'''
621*16467b97STreehugger Robot        grammar T13;
622*16467b97STreehugger Robot        options {
623*16467b97STreehugger Robot            language=Python;
624*16467b97STreehugger Robot            output=AST;
625*16467b97STreehugger Robot        }
626*16467b97STreehugger Robot        a : ID INT -> ^(ID INT);
627*16467b97STreehugger Robot        ID : 'a'..'z'+ ;
628*16467b97STreehugger Robot        INT : '0'..'9'+;
629*16467b97STreehugger Robot        WS : (' '|'\\n') {$channel=HIDDEN;} ;
630*16467b97STreehugger Robot        ''')
631*16467b97STreehugger Robot
632*16467b97STreehugger Robot        treeGrammar = textwrap.dedent(
633*16467b97STreehugger Robot        r'''
634*16467b97STreehugger Robot        tree grammar TP13;
635*16467b97STreehugger Robot        options {
636*16467b97STreehugger Robot            language=Python;
637*16467b97STreehugger Robot            output=AST;
638*16467b97STreehugger Robot            ASTLabelType=CommonTree;
639*16467b97STreehugger Robot            tokenVocab=T13;
640*16467b97STreehugger Robot        }
641*16467b97STreehugger Robot        a : ^(x=b INT) ;
642*16467b97STreehugger Robot        b : ID ;
643*16467b97STreehugger Robot        ''')
644*16467b97STreehugger Robot
645*16467b97STreehugger Robot        found = self.execTreeParser(
646*16467b97STreehugger Robot            grammar, 'a',
647*16467b97STreehugger Robot            treeGrammar, 'a',
648*16467b97STreehugger Robot            "a 3"
649*16467b97STreehugger Robot            )
650*16467b97STreehugger Robot
651*16467b97STreehugger Robot        self.failUnlessEqual("(a 3)", found)
652*16467b97STreehugger Robot
653*16467b97STreehugger Robot
654*16467b97STreehugger Robot    def testAutoDupTreeWithRuleRootAndListLabels(self):
655*16467b97STreehugger Robot        grammar = textwrap.dedent(
656*16467b97STreehugger Robot        r'''
657*16467b97STreehugger Robot        grammar T14;
658*16467b97STreehugger Robot        options {
659*16467b97STreehugger Robot            language=Python;
660*16467b97STreehugger Robot            output=AST;
661*16467b97STreehugger Robot        }
662*16467b97STreehugger Robot        a : ID INT -> ^(ID INT);
663*16467b97STreehugger Robot        ID : 'a'..'z'+ ;
664*16467b97STreehugger Robot        INT : '0'..'9'+;
665*16467b97STreehugger Robot        WS : (' '|'\\n') {$channel=HIDDEN;} ;
666*16467b97STreehugger Robot        ''')
667*16467b97STreehugger Robot
668*16467b97STreehugger Robot        treeGrammar = textwrap.dedent(
669*16467b97STreehugger Robot        r'''
670*16467b97STreehugger Robot        tree grammar TP14;
671*16467b97STreehugger Robot        options {
672*16467b97STreehugger Robot            language=Python;
673*16467b97STreehugger Robot            output=AST;
674*16467b97STreehugger Robot            ASTLabelType=CommonTree;
675*16467b97STreehugger Robot            tokenVocab=T14;
676*16467b97STreehugger Robot        }
677*16467b97STreehugger Robot        a : ^(x+=b y+=c) ;
678*16467b97STreehugger Robot        b : ID ;
679*16467b97STreehugger Robot        c : INT ;
680*16467b97STreehugger Robot        ''')
681*16467b97STreehugger Robot
682*16467b97STreehugger Robot        found = self.execTreeParser(
683*16467b97STreehugger Robot            grammar, 'a',
684*16467b97STreehugger Robot            treeGrammar, 'a',
685*16467b97STreehugger Robot            "a 3"
686*16467b97STreehugger Robot            )
687*16467b97STreehugger Robot
688*16467b97STreehugger Robot        self.failUnlessEqual("(a 3)", found)
689*16467b97STreehugger Robot
690*16467b97STreehugger Robot
691*16467b97STreehugger Robot    def testAutoDupNestedTree(self):
692*16467b97STreehugger Robot        grammar = textwrap.dedent(
693*16467b97STreehugger Robot        r'''
694*16467b97STreehugger Robot        grammar T15;
695*16467b97STreehugger Robot        options {
696*16467b97STreehugger Robot            language=Python;
697*16467b97STreehugger Robot            output=AST;
698*16467b97STreehugger Robot        }
699*16467b97STreehugger Robot        a : x=ID y=ID INT -> ^($x ^($y INT));
700*16467b97STreehugger Robot        ID : 'a'..'z'+ ;
701*16467b97STreehugger Robot        INT : '0'..'9'+;
702*16467b97STreehugger Robot        WS : (' '|'\\n') {$channel=HIDDEN;} ;
703*16467b97STreehugger Robot        ''')
704*16467b97STreehugger Robot
705*16467b97STreehugger Robot        treeGrammar = textwrap.dedent(
706*16467b97STreehugger Robot        r'''
707*16467b97STreehugger Robot        tree grammar TP15;
708*16467b97STreehugger Robot        options {
709*16467b97STreehugger Robot            language=Python;
710*16467b97STreehugger Robot            output=AST;
711*16467b97STreehugger Robot            ASTLabelType=CommonTree;
712*16467b97STreehugger Robot            tokenVocab=T15;
713*16467b97STreehugger Robot        }
714*16467b97STreehugger Robot        a : ^(ID ^(ID INT))
715*16467b97STreehugger Robot          ;
716*16467b97STreehugger Robot        ''')
717*16467b97STreehugger Robot
718*16467b97STreehugger Robot        found = self.execTreeParser(
719*16467b97STreehugger Robot            grammar, 'a',
720*16467b97STreehugger Robot            treeGrammar, 'a',
721*16467b97STreehugger Robot            "a b 3"
722*16467b97STreehugger Robot            )
723*16467b97STreehugger Robot
724*16467b97STreehugger Robot        self.failUnlessEqual("(a (b 3))", found)
725*16467b97STreehugger Robot
726*16467b97STreehugger Robot
727*16467b97STreehugger Robot    def testDelete(self):
728*16467b97STreehugger Robot        grammar = textwrap.dedent(
729*16467b97STreehugger Robot        r'''
730*16467b97STreehugger Robot        grammar T16;
731*16467b97STreehugger Robot        options {
732*16467b97STreehugger Robot            language=Python;
733*16467b97STreehugger Robot            output=AST;
734*16467b97STreehugger Robot        }
735*16467b97STreehugger Robot        a : ID ;
736*16467b97STreehugger Robot        ID : 'a'..'z'+ ;
737*16467b97STreehugger Robot        INT : '0'..'9'+;
738*16467b97STreehugger Robot        WS : (' '|'\\n') {$channel=HIDDEN;} ;
739*16467b97STreehugger Robot        ''')
740*16467b97STreehugger Robot
741*16467b97STreehugger Robot        treeGrammar = textwrap.dedent(
742*16467b97STreehugger Robot        r'''
743*16467b97STreehugger Robot        tree grammar TP16;
744*16467b97STreehugger Robot        options {
745*16467b97STreehugger Robot            language=Python;
746*16467b97STreehugger Robot            output=AST;
747*16467b97STreehugger Robot            ASTLabelType=CommonTree;
748*16467b97STreehugger Robot            tokenVocab=T16;
749*16467b97STreehugger Robot        }
750*16467b97STreehugger Robot        a : ID ->
751*16467b97STreehugger Robot          ;
752*16467b97STreehugger Robot        ''')
753*16467b97STreehugger Robot
754*16467b97STreehugger Robot        found = self.execTreeParser(
755*16467b97STreehugger Robot            grammar, 'a',
756*16467b97STreehugger Robot            treeGrammar, 'a',
757*16467b97STreehugger Robot            "abc"
758*16467b97STreehugger Robot            )
759*16467b97STreehugger Robot
760*16467b97STreehugger Robot        self.failUnlessEqual("", found)
761*16467b97STreehugger Robot
762*16467b97STreehugger Robot    def testSetMatchNoRewrite(self):
763*16467b97STreehugger Robot        grammar = textwrap.dedent(
764*16467b97STreehugger Robot            r'''
765*16467b97STreehugger Robot            grammar T;
766*16467b97STreehugger Robot            options {
767*16467b97STreehugger Robot                language=Python;
768*16467b97STreehugger Robot                output=AST;
769*16467b97STreehugger Robot            }
770*16467b97STreehugger Robot            a : ID INT ;
771*16467b97STreehugger Robot            ID : 'a'..'z'+ ;
772*16467b97STreehugger Robot            INT : '0'..'9'+;
773*16467b97STreehugger Robot            WS : (' '|'\n') {$channel=HIDDEN;} ;
774*16467b97STreehugger Robot            ''')
775*16467b97STreehugger Robot
776*16467b97STreehugger Robot        treeGrammar = textwrap.dedent(
777*16467b97STreehugger Robot            r'''
778*16467b97STreehugger Robot            tree grammar TP;
779*16467b97STreehugger Robot            options {
780*16467b97STreehugger Robot                language=Python;
781*16467b97STreehugger Robot                output=AST;
782*16467b97STreehugger Robot                ASTLabelType=CommonTree;
783*16467b97STreehugger Robot                tokenVocab=T;
784*16467b97STreehugger Robot            }
785*16467b97STreehugger Robot            a : b INT;
786*16467b97STreehugger Robot            b : ID | INT;
787*16467b97STreehugger Robot            ''')
788*16467b97STreehugger Robot
789*16467b97STreehugger Robot        found = self.execTreeParser(
790*16467b97STreehugger Robot            grammar, 'a',
791*16467b97STreehugger Robot            treeGrammar, 'a',
792*16467b97STreehugger Robot            "abc 34"
793*16467b97STreehugger Robot            )
794*16467b97STreehugger Robot
795*16467b97STreehugger Robot        self.failUnlessEqual("abc 34", found)
796*16467b97STreehugger Robot
797*16467b97STreehugger Robot
798*16467b97STreehugger Robot    def testSetOptionalMatchNoRewrite(self):
799*16467b97STreehugger Robot        grammar = textwrap.dedent(
800*16467b97STreehugger Robot            r'''
801*16467b97STreehugger Robot            grammar T;
802*16467b97STreehugger Robot            options {
803*16467b97STreehugger Robot                language=Python;
804*16467b97STreehugger Robot                output=AST;
805*16467b97STreehugger Robot            }
806*16467b97STreehugger Robot            a : ID INT ;
807*16467b97STreehugger Robot            ID : 'a'..'z'+ ;
808*16467b97STreehugger Robot            INT : '0'..'9'+;
809*16467b97STreehugger Robot            WS : (' '|'\n') {$channel=HIDDEN;} ;
810*16467b97STreehugger Robot            ''')
811*16467b97STreehugger Robot
812*16467b97STreehugger Robot        treeGrammar = textwrap.dedent(
813*16467b97STreehugger Robot            r'''
814*16467b97STreehugger Robot            tree grammar TP;
815*16467b97STreehugger Robot            options {
816*16467b97STreehugger Robot                language=Python;
817*16467b97STreehugger Robot                output=AST;
818*16467b97STreehugger Robot                ASTLabelType=CommonTree;
819*16467b97STreehugger Robot                tokenVocab=T;
820*16467b97STreehugger Robot            }
821*16467b97STreehugger Robot            a : (ID|INT)? INT ;
822*16467b97STreehugger Robot            ''')
823*16467b97STreehugger Robot
824*16467b97STreehugger Robot        found = self.execTreeParser(
825*16467b97STreehugger Robot            grammar, 'a',
826*16467b97STreehugger Robot            treeGrammar, 'a',
827*16467b97STreehugger Robot            "abc 34")
828*16467b97STreehugger Robot
829*16467b97STreehugger Robot        self.failUnlessEqual("abc 34", found)
830*16467b97STreehugger Robot
831*16467b97STreehugger Robot
832*16467b97STreehugger Robot    def testSetMatchNoRewriteLevel2(self):
833*16467b97STreehugger Robot        grammar = textwrap.dedent(
834*16467b97STreehugger Robot            r'''
835*16467b97STreehugger Robot            grammar T;
836*16467b97STreehugger Robot            options {
837*16467b97STreehugger Robot                language=Python;
838*16467b97STreehugger Robot                output=AST;
839*16467b97STreehugger Robot            }
840*16467b97STreehugger Robot            a : x=ID INT -> ^($x INT);
841*16467b97STreehugger Robot            ID : 'a'..'z'+ ;
842*16467b97STreehugger Robot            INT : '0'..'9'+;
843*16467b97STreehugger Robot            WS : (' '|'\n') {$channel=HIDDEN;} ;
844*16467b97STreehugger Robot            ''')
845*16467b97STreehugger Robot
846*16467b97STreehugger Robot        treeGrammar = textwrap.dedent(
847*16467b97STreehugger Robot            r'''
848*16467b97STreehugger Robot            tree grammar TP;
849*16467b97STreehugger Robot            options {
850*16467b97STreehugger Robot                language=Python;
851*16467b97STreehugger Robot                output=AST;
852*16467b97STreehugger Robot                ASTLabelType=CommonTree;
853*16467b97STreehugger Robot                tokenVocab=T;
854*16467b97STreehugger Robot            }
855*16467b97STreehugger Robot            a : ^(ID (ID | INT) ) ;
856*16467b97STreehugger Robot            ''')
857*16467b97STreehugger Robot
858*16467b97STreehugger Robot        found = self.execTreeParser(
859*16467b97STreehugger Robot            grammar, 'a',
860*16467b97STreehugger Robot            treeGrammar, 'a',
861*16467b97STreehugger Robot            "abc 34"
862*16467b97STreehugger Robot            )
863*16467b97STreehugger Robot
864*16467b97STreehugger Robot        self.failUnlessEqual("(abc 34)", found)
865*16467b97STreehugger Robot
866*16467b97STreehugger Robot
867*16467b97STreehugger Robot    def testSetMatchNoRewriteLevel2Root(self):
868*16467b97STreehugger Robot        grammar = textwrap.dedent(
869*16467b97STreehugger Robot            r'''
870*16467b97STreehugger Robot            grammar T;
871*16467b97STreehugger Robot            options {
872*16467b97STreehugger Robot                language=Python;
873*16467b97STreehugger Robot                output=AST;
874*16467b97STreehugger Robot            }
875*16467b97STreehugger Robot            a : x=ID INT -> ^($x INT);
876*16467b97STreehugger Robot            ID : 'a'..'z'+ ;
877*16467b97STreehugger Robot            INT : '0'..'9'+;
878*16467b97STreehugger Robot            WS : (' '|'\n') {$channel=HIDDEN;} ;
879*16467b97STreehugger Robot            ''')
880*16467b97STreehugger Robot
881*16467b97STreehugger Robot        treeGrammar = textwrap.dedent(
882*16467b97STreehugger Robot            r'''
883*16467b97STreehugger Robot            tree grammar TP;
884*16467b97STreehugger Robot            options {
885*16467b97STreehugger Robot                language=Python;
886*16467b97STreehugger Robot                output=AST;
887*16467b97STreehugger Robot                ASTLabelType=CommonTree;
888*16467b97STreehugger Robot                tokenVocab=T;
889*16467b97STreehugger Robot            }
890*16467b97STreehugger Robot            a : ^((ID | INT) INT) ;
891*16467b97STreehugger Robot            ''')
892*16467b97STreehugger Robot
893*16467b97STreehugger Robot        found = self.execTreeParser(
894*16467b97STreehugger Robot            grammar, 'a',
895*16467b97STreehugger Robot            treeGrammar, 'a',
896*16467b97STreehugger Robot            "abc 34"
897*16467b97STreehugger Robot            )
898*16467b97STreehugger Robot
899*16467b97STreehugger Robot        self.failUnlessEqual("(abc 34)", found)
900*16467b97STreehugger Robot
901*16467b97STreehugger Robot
902*16467b97STreehugger Robot    ## REWRITE MODE
903*16467b97STreehugger Robot
904*16467b97STreehugger Robot    def testRewriteModeCombinedRewriteAndAuto(self):
905*16467b97STreehugger Robot        grammar = textwrap.dedent(
906*16467b97STreehugger Robot        r'''
907*16467b97STreehugger Robot        grammar T17;
908*16467b97STreehugger Robot        options {
909*16467b97STreehugger Robot            language=Python;
910*16467b97STreehugger Robot            output=AST;
911*16467b97STreehugger Robot        }
912*16467b97STreehugger Robot        a : ID INT -> ^(ID INT) | INT ;
913*16467b97STreehugger Robot        ID : 'a'..'z'+ ;
914*16467b97STreehugger Robot        INT : '0'..'9'+;
915*16467b97STreehugger Robot        WS : (' '|'\\n') {$channel=HIDDEN;} ;
916*16467b97STreehugger Robot        ''')
917*16467b97STreehugger Robot
918*16467b97STreehugger Robot        treeGrammar = textwrap.dedent(
919*16467b97STreehugger Robot        r'''
920*16467b97STreehugger Robot        tree grammar TP17;
921*16467b97STreehugger Robot        options {
922*16467b97STreehugger Robot            language=Python;
923*16467b97STreehugger Robot            output=AST;
924*16467b97STreehugger Robot            ASTLabelType=CommonTree;
925*16467b97STreehugger Robot            tokenVocab=T17;
926*16467b97STreehugger Robot            rewrite=true;
927*16467b97STreehugger Robot        }
928*16467b97STreehugger Robot        a : ^(ID INT) -> ^(ID["ick"] INT)
929*16467b97STreehugger Robot          | INT // leaves it alone, returning $a.start
930*16467b97STreehugger Robot          ;
931*16467b97STreehugger Robot        ''')
932*16467b97STreehugger Robot
933*16467b97STreehugger Robot        found = self.execTreeParser(
934*16467b97STreehugger Robot            grammar, 'a',
935*16467b97STreehugger Robot            treeGrammar, 'a',
936*16467b97STreehugger Robot            "abc 34"
937*16467b97STreehugger Robot            )
938*16467b97STreehugger Robot
939*16467b97STreehugger Robot        self.failUnlessEqual("(ick 34)", found)
940*16467b97STreehugger Robot
941*16467b97STreehugger Robot
942*16467b97STreehugger Robot        found = self.execTreeParser(
943*16467b97STreehugger Robot            grammar, 'a',
944*16467b97STreehugger Robot            treeGrammar, 'a',
945*16467b97STreehugger Robot            "34"
946*16467b97STreehugger Robot            )
947*16467b97STreehugger Robot
948*16467b97STreehugger Robot        self.failUnlessEqual("34", found)
949*16467b97STreehugger Robot
950*16467b97STreehugger Robot
951*16467b97STreehugger Robot    def testRewriteModeFlatTree(self):
952*16467b97STreehugger Robot        grammar = textwrap.dedent(
953*16467b97STreehugger Robot            r'''
954*16467b97STreehugger Robot            grammar T18;
955*16467b97STreehugger Robot            options {
956*16467b97STreehugger Robot              language=Python;
957*16467b97STreehugger Robot              output=AST;
958*16467b97STreehugger Robot            }
959*16467b97STreehugger Robot            a : ID INT -> ID INT | INT ;
960*16467b97STreehugger Robot            ID : 'a'..'z'+ ;
961*16467b97STreehugger Robot            INT : '0'..'9'+;
962*16467b97STreehugger Robot            WS : (' '|'\n') {$channel=HIDDEN;} ;
963*16467b97STreehugger Robot            ''')
964*16467b97STreehugger Robot
965*16467b97STreehugger Robot        treeGrammar = textwrap.dedent(
966*16467b97STreehugger Robot            r'''
967*16467b97STreehugger Robot            tree grammar TP18;
968*16467b97STreehugger Robot            options {
969*16467b97STreehugger Robot              language=Python;
970*16467b97STreehugger Robot              output=AST;
971*16467b97STreehugger Robot              ASTLabelType=CommonTree;
972*16467b97STreehugger Robot              tokenVocab=T18;
973*16467b97STreehugger Robot              rewrite=true;
974*16467b97STreehugger Robot            }
975*16467b97STreehugger Robot            s : ID a ;
976*16467b97STreehugger Robot            a : INT -> INT["1"]
977*16467b97STreehugger Robot              ;
978*16467b97STreehugger Robot            ''')
979*16467b97STreehugger Robot
980*16467b97STreehugger Robot        found = self.execTreeParser(
981*16467b97STreehugger Robot            grammar, 'a',
982*16467b97STreehugger Robot            treeGrammar, 's',
983*16467b97STreehugger Robot            "abc 34"
984*16467b97STreehugger Robot            )
985*16467b97STreehugger Robot        self.assertEquals("abc 1", found)
986*16467b97STreehugger Robot
987*16467b97STreehugger Robot
988*16467b97STreehugger Robot    def testRewriteModeChainRuleFlatTree(self):
989*16467b97STreehugger Robot        grammar = textwrap.dedent(
990*16467b97STreehugger Robot            r'''
991*16467b97STreehugger Robot            grammar T;
992*16467b97STreehugger Robot            options {language=Python; output=AST;}
993*16467b97STreehugger Robot            a : ID INT -> ID INT | INT ;
994*16467b97STreehugger Robot            ID : 'a'..'z'+ ;
995*16467b97STreehugger Robot            INT : '0'..'9'+;
996*16467b97STreehugger Robot            WS : (' '|'\n') {$channel=HIDDEN;} ;
997*16467b97STreehugger Robot            ''')
998*16467b97STreehugger Robot
999*16467b97STreehugger Robot        treeGrammar = textwrap.dedent(
1000*16467b97STreehugger Robot            r'''
1001*16467b97STreehugger Robot            tree grammar TP;
1002*16467b97STreehugger Robot            options {language=Python; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;}
1003*16467b97STreehugger Robot            s : a ;
1004*16467b97STreehugger Robot            a : b ;
1005*16467b97STreehugger Robot            b : ID INT -> INT ID
1006*16467b97STreehugger Robot              ;
1007*16467b97STreehugger Robot            ''')
1008*16467b97STreehugger Robot
1009*16467b97STreehugger Robot        found = self.execTreeParser(
1010*16467b97STreehugger Robot            grammar, 'a',
1011*16467b97STreehugger Robot            treeGrammar, 's',
1012*16467b97STreehugger Robot            "abc 34")
1013*16467b97STreehugger Robot        self.assertEquals("34 abc", found)
1014*16467b97STreehugger Robot
1015*16467b97STreehugger Robot
1016*16467b97STreehugger Robot    def testRewriteModeChainRuleTree(self):
1017*16467b97STreehugger Robot        grammar = textwrap.dedent(
1018*16467b97STreehugger Robot            r'''
1019*16467b97STreehugger Robot            grammar T;
1020*16467b97STreehugger Robot            options {language=Python; output=AST;}
1021*16467b97STreehugger Robot            a : ID INT -> ^(ID INT) ;
1022*16467b97STreehugger Robot            ID : 'a'..'z'+ ;
1023*16467b97STreehugger Robot            INT : '0'..'9'+;
1024*16467b97STreehugger Robot            WS : (' '|'\n') {$channel=HIDDEN;} ;
1025*16467b97STreehugger Robot            ''')
1026*16467b97STreehugger Robot
1027*16467b97STreehugger Robot        treeGrammar = textwrap.dedent(
1028*16467b97STreehugger Robot            r'''
1029*16467b97STreehugger Robot            tree grammar TP;
1030*16467b97STreehugger Robot            options {language=Python; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;}
1031*16467b97STreehugger Robot            s : a ;
1032*16467b97STreehugger Robot            a : b ; // a.tree must become b.tree
1033*16467b97STreehugger Robot            b : ^(ID INT) -> INT
1034*16467b97STreehugger Robot              ;
1035*16467b97STreehugger Robot            ''')
1036*16467b97STreehugger Robot
1037*16467b97STreehugger Robot        found = self.execTreeParser(
1038*16467b97STreehugger Robot            grammar, 'a',
1039*16467b97STreehugger Robot            treeGrammar, 's',
1040*16467b97STreehugger Robot            "abc 34")
1041*16467b97STreehugger Robot        self.assertEquals("34", found)
1042*16467b97STreehugger Robot
1043*16467b97STreehugger Robot
1044*16467b97STreehugger Robot    def testRewriteModeChainRuleTree2(self):
1045*16467b97STreehugger Robot        grammar = textwrap.dedent(
1046*16467b97STreehugger Robot            r'''
1047*16467b97STreehugger Robot            grammar T;
1048*16467b97STreehugger Robot            options {language=Python; output=AST;}
1049*16467b97STreehugger Robot            a : ID INT -> ^(ID INT) ;
1050*16467b97STreehugger Robot            ID : 'a'..'z'+ ;
1051*16467b97STreehugger Robot            INT : '0'..'9'+;
1052*16467b97STreehugger Robot            WS : (' '|'\n') {$channel=HIDDEN;} ;
1053*16467b97STreehugger Robot            ''')
1054*16467b97STreehugger Robot
1055*16467b97STreehugger Robot        treeGrammar = textwrap.dedent(
1056*16467b97STreehugger Robot            r"""
1057*16467b97STreehugger Robot            tree grammar TP;
1058*16467b97STreehugger Robot            options {language=Python; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;}
1059*16467b97STreehugger Robot            tokens { X; }
1060*16467b97STreehugger Robot            s : a* b ; // only b contributes to tree, but it's after a*; s.tree = b.tree
1061*16467b97STreehugger Robot            a : X ;
1062*16467b97STreehugger Robot            b : ^(ID INT) -> INT
1063*16467b97STreehugger Robot              ;
1064*16467b97STreehugger Robot            """)
1065*16467b97STreehugger Robot
1066*16467b97STreehugger Robot        found = self.execTreeParser(
1067*16467b97STreehugger Robot            grammar, 'a',
1068*16467b97STreehugger Robot            treeGrammar, 's',
1069*16467b97STreehugger Robot            "abc 34")
1070*16467b97STreehugger Robot        self.assertEquals("34", found)
1071*16467b97STreehugger Robot
1072*16467b97STreehugger Robot
1073*16467b97STreehugger Robot    def testRewriteModeChainRuleTree3(self):
1074*16467b97STreehugger Robot        grammar = textwrap.dedent(
1075*16467b97STreehugger Robot            r'''
1076*16467b97STreehugger Robot            grammar T;
1077*16467b97STreehugger Robot            options {language=Python; output=AST;}
1078*16467b97STreehugger Robot            a : 'boo' ID INT -> 'boo' ^(ID INT) ;
1079*16467b97STreehugger Robot            ID : 'a'..'z'+ ;
1080*16467b97STreehugger Robot            INT : '0'..'9'+;
1081*16467b97STreehugger Robot            WS : (' '|'\n') {$channel=HIDDEN;} ;
1082*16467b97STreehugger Robot            ''')
1083*16467b97STreehugger Robot
1084*16467b97STreehugger Robot        treeGrammar = textwrap.dedent(
1085*16467b97STreehugger Robot            r"""
1086*16467b97STreehugger Robot            tree grammar TP;
1087*16467b97STreehugger Robot            options {language=Python; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;}
1088*16467b97STreehugger Robot            tokens { X; }
1089*16467b97STreehugger Robot            s : 'boo' a* b ; // don't reset s.tree to b.tree due to 'boo'
1090*16467b97STreehugger Robot            a : X ;
1091*16467b97STreehugger Robot            b : ^(ID INT) -> INT
1092*16467b97STreehugger Robot              ;
1093*16467b97STreehugger Robot            """)
1094*16467b97STreehugger Robot
1095*16467b97STreehugger Robot        found = self.execTreeParser(
1096*16467b97STreehugger Robot            grammar, 'a',
1097*16467b97STreehugger Robot            treeGrammar, 's',
1098*16467b97STreehugger Robot            "boo abc 34")
1099*16467b97STreehugger Robot        self.assertEquals("boo 34", found)
1100*16467b97STreehugger Robot
1101*16467b97STreehugger Robot
1102*16467b97STreehugger Robot    def testRewriteModeChainRuleTree4(self):
1103*16467b97STreehugger Robot        grammar = textwrap.dedent(
1104*16467b97STreehugger Robot            r"""
1105*16467b97STreehugger Robot            grammar T;
1106*16467b97STreehugger Robot            options {language=Python; output=AST;}
1107*16467b97STreehugger Robot            a : 'boo' ID INT -> ^('boo' ^(ID INT)) ;
1108*16467b97STreehugger Robot            ID : 'a'..'z'+ ;
1109*16467b97STreehugger Robot            INT : '0'..'9'+;
1110*16467b97STreehugger Robot            WS : (' '|'\n') {$channel=HIDDEN;} ;
1111*16467b97STreehugger Robot            """)
1112*16467b97STreehugger Robot
1113*16467b97STreehugger Robot        treeGrammar = textwrap.dedent(
1114*16467b97STreehugger Robot            r"""
1115*16467b97STreehugger Robot            tree grammar TP;
1116*16467b97STreehugger Robot            options {language=Python; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;}
1117*16467b97STreehugger Robot            tokens { X; }
1118*16467b97STreehugger Robot            s : ^('boo' a* b) ; // don't reset s.tree to b.tree due to 'boo'
1119*16467b97STreehugger Robot            a : X ;
1120*16467b97STreehugger Robot            b : ^(ID INT) -> INT
1121*16467b97STreehugger Robot              ;
1122*16467b97STreehugger Robot            """)
1123*16467b97STreehugger Robot
1124*16467b97STreehugger Robot        found = self.execTreeParser(
1125*16467b97STreehugger Robot            grammar, 'a',
1126*16467b97STreehugger Robot            treeGrammar, 's',
1127*16467b97STreehugger Robot            "boo abc 34")
1128*16467b97STreehugger Robot        self.assertEquals("(boo 34)", found)
1129*16467b97STreehugger Robot
1130*16467b97STreehugger Robot
1131*16467b97STreehugger Robot    def testRewriteModeChainRuleTree5(self):
1132*16467b97STreehugger Robot        grammar = textwrap.dedent(
1133*16467b97STreehugger Robot            r"""
1134*16467b97STreehugger Robot            grammar T;
1135*16467b97STreehugger Robot            options {language=Python; output=AST;}
1136*16467b97STreehugger Robot            a : 'boo' ID INT -> ^('boo' ^(ID INT)) ;
1137*16467b97STreehugger Robot            ID : 'a'..'z'+ ;
1138*16467b97STreehugger Robot            INT : '0'..'9'+;
1139*16467b97STreehugger Robot            WS : (' '|'\n') {$channel=HIDDEN;} ;
1140*16467b97STreehugger Robot            """)
1141*16467b97STreehugger Robot
1142*16467b97STreehugger Robot        treeGrammar = textwrap.dedent(
1143*16467b97STreehugger Robot            r"""
1144*16467b97STreehugger Robot            tree grammar TP;
1145*16467b97STreehugger Robot            options {language=Python; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;}
1146*16467b97STreehugger Robot            tokens { X; }
1147*16467b97STreehugger Robot            s : ^(a b) ; // s.tree is a.tree
1148*16467b97STreehugger Robot            a : 'boo' ;
1149*16467b97STreehugger Robot            b : ^(ID INT) -> INT
1150*16467b97STreehugger Robot              ;
1151*16467b97STreehugger Robot            """)
1152*16467b97STreehugger Robot
1153*16467b97STreehugger Robot        found = self.execTreeParser(
1154*16467b97STreehugger Robot            grammar, 'a',
1155*16467b97STreehugger Robot            treeGrammar, 's',
1156*16467b97STreehugger Robot            "boo abc 34")
1157*16467b97STreehugger Robot        self.assertEquals("(boo 34)", found)
1158*16467b97STreehugger Robot
1159*16467b97STreehugger Robot
1160*16467b97STreehugger Robot    def testRewriteOfRuleRef(self):
1161*16467b97STreehugger Robot        grammar = textwrap.dedent(
1162*16467b97STreehugger Robot            r"""
1163*16467b97STreehugger Robot            grammar T;
1164*16467b97STreehugger Robot            options {language=Python; output=AST;}
1165*16467b97STreehugger Robot            a : ID INT -> ID INT | INT ;
1166*16467b97STreehugger Robot            ID : 'a'..'z'+ ;
1167*16467b97STreehugger Robot            INT : '0'..'9'+;
1168*16467b97STreehugger Robot            WS : (' '|'\n') {$channel=HIDDEN;} ;
1169*16467b97STreehugger Robot            """)
1170*16467b97STreehugger Robot
1171*16467b97STreehugger Robot        treeGrammar = textwrap.dedent(
1172*16467b97STreehugger Robot            r"""
1173*16467b97STreehugger Robot            tree grammar TP;
1174*16467b97STreehugger Robot            options {language=Python; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;}
1175*16467b97STreehugger Robot            s : a -> a ;
1176*16467b97STreehugger Robot            a : ID INT -> ID INT ;
1177*16467b97STreehugger Robot            """)
1178*16467b97STreehugger Robot
1179*16467b97STreehugger Robot        found = self.execTreeParser(
1180*16467b97STreehugger Robot            grammar, 'a',
1181*16467b97STreehugger Robot            treeGrammar, 's',
1182*16467b97STreehugger Robot            "abc 34")
1183*16467b97STreehugger Robot        self.failUnlessEqual("abc 34", found)
1184*16467b97STreehugger Robot
1185*16467b97STreehugger Robot
1186*16467b97STreehugger Robot    def testRewriteOfRuleRefRoot(self):
1187*16467b97STreehugger Robot        grammar = textwrap.dedent(
1188*16467b97STreehugger Robot            r"""
1189*16467b97STreehugger Robot            grammar T;
1190*16467b97STreehugger Robot            options {language=Python; output=AST;}
1191*16467b97STreehugger Robot            a : ID INT INT -> ^(INT ^(ID INT));
1192*16467b97STreehugger Robot            ID : 'a'..'z'+ ;
1193*16467b97STreehugger Robot            INT : '0'..'9'+;
1194*16467b97STreehugger Robot            WS : (' '|'\n') {$channel=HIDDEN;} ;
1195*16467b97STreehugger Robot            """)
1196*16467b97STreehugger Robot
1197*16467b97STreehugger Robot        treeGrammar = textwrap.dedent(
1198*16467b97STreehugger Robot            r"""
1199*16467b97STreehugger Robot            tree grammar TP;
1200*16467b97STreehugger Robot            options {language=Python; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;}
1201*16467b97STreehugger Robot            s : ^(a ^(ID INT)) -> a ;
1202*16467b97STreehugger Robot            a : INT ;
1203*16467b97STreehugger Robot            """)
1204*16467b97STreehugger Robot
1205*16467b97STreehugger Robot        found = self.execTreeParser(
1206*16467b97STreehugger Robot            grammar, 'a',
1207*16467b97STreehugger Robot            treeGrammar, 's',
1208*16467b97STreehugger Robot            "abc 12 34")
1209*16467b97STreehugger Robot        # emits whole tree when you ref the root since I can't know whether
1210*16467b97STreehugger Robot        # you want the children or not.  You might be returning a whole new
1211*16467b97STreehugger Robot        # tree.  Hmm...still seems weird.  oh well.
1212*16467b97STreehugger Robot        self.failUnlessEqual("(12 (abc 34))", found)
1213*16467b97STreehugger Robot
1214*16467b97STreehugger Robot
1215*16467b97STreehugger Robot    def testRewriteOfRuleRefRootLabeled(self):
1216*16467b97STreehugger Robot        grammar = textwrap.dedent(
1217*16467b97STreehugger Robot            r"""
1218*16467b97STreehugger Robot            grammar T;
1219*16467b97STreehugger Robot            options {language=Python; output=AST;}
1220*16467b97STreehugger Robot            a : ID INT INT -> ^(INT ^(ID INT));
1221*16467b97STreehugger Robot            ID : 'a'..'z'+ ;
1222*16467b97STreehugger Robot            INT : '0'..'9'+;
1223*16467b97STreehugger Robot            WS : (' '|'\n') {$channel=HIDDEN;} ;
1224*16467b97STreehugger Robot            """)
1225*16467b97STreehugger Robot
1226*16467b97STreehugger Robot        treeGrammar = textwrap.dedent(
1227*16467b97STreehugger Robot            r"""
1228*16467b97STreehugger Robot            tree grammar TP;
1229*16467b97STreehugger Robot            options {language=Python; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;}
1230*16467b97STreehugger Robot            s : ^(label=a ^(ID INT)) -> a ;
1231*16467b97STreehugger Robot            a : INT ;
1232*16467b97STreehugger Robot            """)
1233*16467b97STreehugger Robot
1234*16467b97STreehugger Robot        found = self.execTreeParser(
1235*16467b97STreehugger Robot            grammar, 'a',
1236*16467b97STreehugger Robot            treeGrammar, 's',
1237*16467b97STreehugger Robot            "abc 12 34")
1238*16467b97STreehugger Robot        # emits whole tree when you ref the root since I can't know whether
1239*16467b97STreehugger Robot        # you want the children or not.  You might be returning a whole new
1240*16467b97STreehugger Robot        # tree.  Hmm...still seems weird.  oh well.
1241*16467b97STreehugger Robot        self.failUnlessEqual("(12 (abc 34))", found)
1242*16467b97STreehugger Robot
1243*16467b97STreehugger Robot
1244*16467b97STreehugger Robot    def testRewriteOfRuleRefRootListLabeled(self):
1245*16467b97STreehugger Robot        grammar = textwrap.dedent(
1246*16467b97STreehugger Robot            r"""
1247*16467b97STreehugger Robot            grammar T;
1248*16467b97STreehugger Robot            options {language=Python; output=AST;}
1249*16467b97STreehugger Robot            a : ID INT INT -> ^(INT ^(ID INT));
1250*16467b97STreehugger Robot            ID : 'a'..'z'+ ;
1251*16467b97STreehugger Robot            INT : '0'..'9'+;
1252*16467b97STreehugger Robot            WS : (' '|'\n') {$channel=HIDDEN;} ;
1253*16467b97STreehugger Robot            """)
1254*16467b97STreehugger Robot
1255*16467b97STreehugger Robot        treeGrammar = textwrap.dedent(
1256*16467b97STreehugger Robot            r"""
1257*16467b97STreehugger Robot            tree grammar TP;
1258*16467b97STreehugger Robot            options {language=Python; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;}
1259*16467b97STreehugger Robot            s : ^(label+=a ^(ID INT)) -> a ;
1260*16467b97STreehugger Robot            a : INT ;
1261*16467b97STreehugger Robot            """)
1262*16467b97STreehugger Robot
1263*16467b97STreehugger Robot        found = self.execTreeParser(
1264*16467b97STreehugger Robot            grammar, 'a',
1265*16467b97STreehugger Robot            treeGrammar, 's',
1266*16467b97STreehugger Robot            "abc 12 34")
1267*16467b97STreehugger Robot        # emits whole tree when you ref the root since I can't know whether
1268*16467b97STreehugger Robot        # you want the children or not.  You might be returning a whole new
1269*16467b97STreehugger Robot        # tree.  Hmm...still seems weird.  oh well.
1270*16467b97STreehugger Robot        self.failUnlessEqual("(12 (abc 34))", found)
1271*16467b97STreehugger Robot
1272*16467b97STreehugger Robot
1273*16467b97STreehugger Robot    def testRewriteOfRuleRefChild(self):
1274*16467b97STreehugger Robot        grammar = textwrap.dedent(
1275*16467b97STreehugger Robot            r"""
1276*16467b97STreehugger Robot            grammar T;
1277*16467b97STreehugger Robot            options {language=Python; output=AST;}
1278*16467b97STreehugger Robot            a : ID INT -> ^(ID ^(INT INT));
1279*16467b97STreehugger Robot            ID : 'a'..'z'+ ;
1280*16467b97STreehugger Robot            INT : '0'..'9'+;
1281*16467b97STreehugger Robot            WS : (' '|'\n') {$channel=HIDDEN;} ;
1282*16467b97STreehugger Robot            """)
1283*16467b97STreehugger Robot
1284*16467b97STreehugger Robot        treeGrammar = textwrap.dedent(
1285*16467b97STreehugger Robot            r"""
1286*16467b97STreehugger Robot            tree grammar TP;
1287*16467b97STreehugger Robot            options {language=Python; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;}
1288*16467b97STreehugger Robot            s : ^(ID a) -> a ;
1289*16467b97STreehugger Robot            a : ^(INT INT) ;
1290*16467b97STreehugger Robot            """)
1291*16467b97STreehugger Robot
1292*16467b97STreehugger Robot        found = self.execTreeParser(
1293*16467b97STreehugger Robot            grammar, 'a',
1294*16467b97STreehugger Robot            treeGrammar, 's',
1295*16467b97STreehugger Robot            "abc 34")
1296*16467b97STreehugger Robot        self.failUnlessEqual("(34 34)", found)
1297*16467b97STreehugger Robot
1298*16467b97STreehugger Robot
1299*16467b97STreehugger Robot    def testRewriteOfRuleRefLabel(self):
1300*16467b97STreehugger Robot        grammar = textwrap.dedent(
1301*16467b97STreehugger Robot            r"""
1302*16467b97STreehugger Robot            grammar T;
1303*16467b97STreehugger Robot            options {language=Python; output=AST;}
1304*16467b97STreehugger Robot            a : ID INT -> ^(ID ^(INT INT));
1305*16467b97STreehugger Robot            ID : 'a'..'z'+ ;
1306*16467b97STreehugger Robot            INT : '0'..'9'+;
1307*16467b97STreehugger Robot            WS : (' '|'\n') {$channel=HIDDEN;} ;
1308*16467b97STreehugger Robot            """)
1309*16467b97STreehugger Robot
1310*16467b97STreehugger Robot        treeGrammar = textwrap.dedent(
1311*16467b97STreehugger Robot            r"""
1312*16467b97STreehugger Robot            tree grammar TP;
1313*16467b97STreehugger Robot            options {language=Python; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;}
1314*16467b97STreehugger Robot            s : ^(ID label=a) -> a ;
1315*16467b97STreehugger Robot            a : ^(INT INT) ;
1316*16467b97STreehugger Robot            """)
1317*16467b97STreehugger Robot
1318*16467b97STreehugger Robot        found = self.execTreeParser(
1319*16467b97STreehugger Robot            grammar, 'a',
1320*16467b97STreehugger Robot            treeGrammar, 's',
1321*16467b97STreehugger Robot            "abc 34")
1322*16467b97STreehugger Robot        self.failUnlessEqual("(34 34)", found)
1323*16467b97STreehugger Robot
1324*16467b97STreehugger Robot
1325*16467b97STreehugger Robot    def testRewriteOfRuleRefListLabel(self):
1326*16467b97STreehugger Robot        grammar = textwrap.dedent(
1327*16467b97STreehugger Robot            r"""
1328*16467b97STreehugger Robot            grammar T;
1329*16467b97STreehugger Robot            options {language=Python; output=AST;}
1330*16467b97STreehugger Robot            a : ID INT -> ^(ID ^(INT INT));
1331*16467b97STreehugger Robot            ID : 'a'..'z'+ ;
1332*16467b97STreehugger Robot            INT : '0'..'9'+;
1333*16467b97STreehugger Robot            WS : (' '|'\n') {$channel=HIDDEN;} ;
1334*16467b97STreehugger Robot            """)
1335*16467b97STreehugger Robot
1336*16467b97STreehugger Robot        treeGrammar = textwrap.dedent(
1337*16467b97STreehugger Robot            r"""
1338*16467b97STreehugger Robot            tree grammar TP;
1339*16467b97STreehugger Robot            options {language=Python; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;}
1340*16467b97STreehugger Robot            s : ^(ID label+=a) -> a ;
1341*16467b97STreehugger Robot            a : ^(INT INT) ;
1342*16467b97STreehugger Robot            """)
1343*16467b97STreehugger Robot
1344*16467b97STreehugger Robot        found = self.execTreeParser(
1345*16467b97STreehugger Robot            grammar, 'a',
1346*16467b97STreehugger Robot            treeGrammar, 's',
1347*16467b97STreehugger Robot            "abc 34")
1348*16467b97STreehugger Robot        self.failUnlessEqual("(34 34)", found)
1349*16467b97STreehugger Robot
1350*16467b97STreehugger Robot
1351*16467b97STreehugger Robot
1352*16467b97STreehugger Robot    def testRewriteModeWithPredicatedRewrites(self):
1353*16467b97STreehugger Robot        grammar = textwrap.dedent(
1354*16467b97STreehugger Robot            r'''
1355*16467b97STreehugger Robot            grammar T19;
1356*16467b97STreehugger Robot            options {
1357*16467b97STreehugger Robot              language=Python;
1358*16467b97STreehugger Robot              output=AST;
1359*16467b97STreehugger Robot            }
1360*16467b97STreehugger Robot            a : ID INT -> ^(ID["root"] ^(ID INT)) | INT -> ^(ID["root"] INT) ;
1361*16467b97STreehugger Robot            ID : 'a'..'z'+ ;
1362*16467b97STreehugger Robot            INT : '0'..'9'+;
1363*16467b97STreehugger Robot            WS : (' '|'\n') {$channel=HIDDEN;} ;
1364*16467b97STreehugger Robot            ''')
1365*16467b97STreehugger Robot
1366*16467b97STreehugger Robot        treeGrammar = textwrap.dedent(
1367*16467b97STreehugger Robot            r'''
1368*16467b97STreehugger Robot            tree grammar TP19;
1369*16467b97STreehugger Robot            options {
1370*16467b97STreehugger Robot              language=Python;
1371*16467b97STreehugger Robot              output=AST;
1372*16467b97STreehugger Robot              ASTLabelType=CommonTree;
1373*16467b97STreehugger Robot              tokenVocab=T19;
1374*16467b97STreehugger Robot              rewrite=true;
1375*16467b97STreehugger Robot            }
1376*16467b97STreehugger Robot            s : ^(ID a) { self.buf += $s.start.toStringTree() };
1377*16467b97STreehugger Robot            a : ^(ID INT) -> {True}? ^(ID["ick"] INT)
1378*16467b97STreehugger Robot                          -> INT
1379*16467b97STreehugger Robot              ;
1380*16467b97STreehugger Robot            ''')
1381*16467b97STreehugger Robot
1382*16467b97STreehugger Robot        found = self.execTreeParser(
1383*16467b97STreehugger Robot            grammar, 'a',
1384*16467b97STreehugger Robot            treeGrammar, 's',
1385*16467b97STreehugger Robot            "abc 34"
1386*16467b97STreehugger Robot            )
1387*16467b97STreehugger Robot
1388*16467b97STreehugger Robot        self.failUnlessEqual("(root (ick 34))", found)
1389*16467b97STreehugger Robot
1390*16467b97STreehugger Robot
1391*16467b97STreehugger Robot    def testWildcardSingleNode(self):
1392*16467b97STreehugger Robot        grammar = textwrap.dedent(
1393*16467b97STreehugger Robot            r'''
1394*16467b97STreehugger Robot            grammar T;
1395*16467b97STreehugger Robot            options {
1396*16467b97STreehugger Robot                language=Python;
1397*16467b97STreehugger Robot                output=AST;
1398*16467b97STreehugger Robot            }
1399*16467b97STreehugger Robot            a : ID INT -> ^(ID["root"] INT);
1400*16467b97STreehugger Robot            ID : 'a'..'z'+ ;
1401*16467b97STreehugger Robot            INT : '0'..'9'+;
1402*16467b97STreehugger Robot            WS : (' '|'\n') {$channel=HIDDEN;} ;
1403*16467b97STreehugger Robot            ''')
1404*16467b97STreehugger Robot
1405*16467b97STreehugger Robot        treeGrammar = textwrap.dedent(
1406*16467b97STreehugger Robot            r'''
1407*16467b97STreehugger Robot            tree grammar TP;
1408*16467b97STreehugger Robot            options {
1409*16467b97STreehugger Robot                language=Python;
1410*16467b97STreehugger Robot                output=AST;
1411*16467b97STreehugger Robot                ASTLabelType=CommonTree;
1412*16467b97STreehugger Robot                tokenVocab=T;
1413*16467b97STreehugger Robot            }
1414*16467b97STreehugger Robot            s : ^(ID c=.) -> $c
1415*16467b97STreehugger Robot            ;
1416*16467b97STreehugger Robot            ''')
1417*16467b97STreehugger Robot
1418*16467b97STreehugger Robot        found = self.execTreeParser(
1419*16467b97STreehugger Robot            grammar, 'a',
1420*16467b97STreehugger Robot            treeGrammar, 's',
1421*16467b97STreehugger Robot            "abc 34"
1422*16467b97STreehugger Robot            )
1423*16467b97STreehugger Robot
1424*16467b97STreehugger Robot        self.failUnlessEqual("34", found)
1425*16467b97STreehugger Robot
1426*16467b97STreehugger Robot    def testWildcardUnlabeledSingleNode(self):
1427*16467b97STreehugger Robot        grammar = textwrap.dedent(
1428*16467b97STreehugger Robot            r'''
1429*16467b97STreehugger Robot            grammar T;
1430*16467b97STreehugger Robot            options {language=Python; output=AST;}
1431*16467b97STreehugger Robot            a : ID INT -> ^(ID INT);
1432*16467b97STreehugger Robot            ID : 'a'..'z'+ ;
1433*16467b97STreehugger Robot            INT : '0'..'9'+;
1434*16467b97STreehugger Robot            WS : (' '|'\n') {$channel=HIDDEN;} ;
1435*16467b97STreehugger Robot            ''')
1436*16467b97STreehugger Robot
1437*16467b97STreehugger Robot        treeGrammar = textwrap.dedent(
1438*16467b97STreehugger Robot            r'''
1439*16467b97STreehugger Robot            tree grammar TP;
1440*16467b97STreehugger Robot            options {language=Python; output=AST; ASTLabelType=CommonTree; tokenVocab=T;}
1441*16467b97STreehugger Robot            s : ^(ID .) -> ID
1442*16467b97STreehugger Robot              ;
1443*16467b97STreehugger Robot            ''')
1444*16467b97STreehugger Robot
1445*16467b97STreehugger Robot        found = self.execTreeParser(
1446*16467b97STreehugger Robot            grammar, 'a',
1447*16467b97STreehugger Robot            treeGrammar, 's',
1448*16467b97STreehugger Robot            "abc 34")
1449*16467b97STreehugger Robot        self.assertEquals("abc", found)
1450*16467b97STreehugger Robot
1451*16467b97STreehugger Robot
1452*16467b97STreehugger Robot    def testWildcardGrabsSubtree(self):
1453*16467b97STreehugger Robot        grammar = textwrap.dedent(
1454*16467b97STreehugger Robot            r'''
1455*16467b97STreehugger Robot            grammar T;
1456*16467b97STreehugger Robot            options {language=Python; output=AST;}
1457*16467b97STreehugger Robot            a : ID x=INT y=INT z=INT -> ^(ID[\"root\"] ^($x $y $z));
1458*16467b97STreehugger Robot            ID : 'a'..'z'+ ;
1459*16467b97STreehugger Robot            INT : '0'..'9'+;
1460*16467b97STreehugger Robot            WS : (' '|'\n') {$channel=HIDDEN;} ;
1461*16467b97STreehugger Robot            ''')
1462*16467b97STreehugger Robot
1463*16467b97STreehugger Robot        treeGrammar = textwrap.dedent(
1464*16467b97STreehugger Robot            r'''
1465*16467b97STreehugger Robot            tree grammar TP;
1466*16467b97STreehugger Robot            options {language=Python; output=AST; ASTLabelType=CommonTree; tokenVocab=T;}
1467*16467b97STreehugger Robot            s : ^(ID c=.) -> $c
1468*16467b97STreehugger Robot              ;
1469*16467b97STreehugger Robot            ''')
1470*16467b97STreehugger Robot
1471*16467b97STreehugger Robot        found = self.execTreeParser(
1472*16467b97STreehugger Robot            grammar, 'a',
1473*16467b97STreehugger Robot            treeGrammar, 's',
1474*16467b97STreehugger Robot            "abc 1 2 3")
1475*16467b97STreehugger Robot        self.assertEquals("(1 2 3)", found)
1476*16467b97STreehugger Robot
1477*16467b97STreehugger Robot
1478*16467b97STreehugger Robot    def testWildcardGrabsSubtree2(self):
1479*16467b97STreehugger Robot        grammar = textwrap.dedent(
1480*16467b97STreehugger Robot            r'''
1481*16467b97STreehugger Robot            grammar T;
1482*16467b97STreehugger Robot            options {language=Python; output=AST;}
1483*16467b97STreehugger Robot            a : ID x=INT y=INT z=INT -> ID ^($x $y $z);
1484*16467b97STreehugger Robot            ID : 'a'..'z'+ ;
1485*16467b97STreehugger Robot            INT : '0'..'9'+;
1486*16467b97STreehugger Robot            WS : (' '|'\n') {$channel=HIDDEN;} ;
1487*16467b97STreehugger Robot            ''')
1488*16467b97STreehugger Robot
1489*16467b97STreehugger Robot        treeGrammar = textwrap.dedent(
1490*16467b97STreehugger Robot            r'''
1491*16467b97STreehugger Robot            tree grammar TP;
1492*16467b97STreehugger Robot            options {language=Python; output=AST; ASTLabelType=CommonTree; tokenVocab=T;}
1493*16467b97STreehugger Robot            s : ID c=. -> $c
1494*16467b97STreehugger Robot              ;
1495*16467b97STreehugger Robot            ''')
1496*16467b97STreehugger Robot
1497*16467b97STreehugger Robot        found = self.execTreeParser(
1498*16467b97STreehugger Robot            grammar, 'a',
1499*16467b97STreehugger Robot            treeGrammar, 's',
1500*16467b97STreehugger Robot            "abc 1 2 3")
1501*16467b97STreehugger Robot        self.assertEquals("(1 2 3)", found)
1502*16467b97STreehugger Robot
1503*16467b97STreehugger Robot
1504*16467b97STreehugger Robot    def testWildcardListLabel(self):
1505*16467b97STreehugger Robot        grammar = textwrap.dedent(
1506*16467b97STreehugger Robot            r'''
1507*16467b97STreehugger Robot            grammar T;
1508*16467b97STreehugger Robot            options {language=Python; output=AST;}
1509*16467b97STreehugger Robot            a : INT INT INT ;
1510*16467b97STreehugger Robot            ID : 'a'..'z'+ ;
1511*16467b97STreehugger Robot            INT : '0'..'9'+;
1512*16467b97STreehugger Robot            WS : (' '|'\n') {$channel=HIDDEN;} ;
1513*16467b97STreehugger Robot            ''')
1514*16467b97STreehugger Robot
1515*16467b97STreehugger Robot        treeGrammar = textwrap.dedent(
1516*16467b97STreehugger Robot            r'''
1517*16467b97STreehugger Robot            tree grammar TP;
1518*16467b97STreehugger Robot            options {language=Python; output=AST; ASTLabelType=CommonTree; tokenVocab=T;}
1519*16467b97STreehugger Robot            s : (c+=.)+ -> $c+
1520*16467b97STreehugger Robot              ;
1521*16467b97STreehugger Robot            ''')
1522*16467b97STreehugger Robot
1523*16467b97STreehugger Robot        found = self.execTreeParser(
1524*16467b97STreehugger Robot            grammar, 'a',
1525*16467b97STreehugger Robot            treeGrammar, 's',
1526*16467b97STreehugger Robot            "1 2 3")
1527*16467b97STreehugger Robot        self.assertEquals("1 2 3", found)
1528*16467b97STreehugger Robot
1529*16467b97STreehugger Robot
1530*16467b97STreehugger Robot    def testWildcardListLabel2(self):
1531*16467b97STreehugger Robot        grammar = textwrap.dedent(
1532*16467b97STreehugger Robot            r'''
1533*16467b97STreehugger Robot            grammar T;
1534*16467b97STreehugger Robot            options {language=Python; output=AST; ASTLabelType=CommonTree;}
1535*16467b97STreehugger Robot            a  : x=INT y=INT z=INT -> ^($x ^($y $z) ^($y $z));
1536*16467b97STreehugger Robot            ID : 'a'..'z'+ ;
1537*16467b97STreehugger Robot            INT : '0'..'9'+;
1538*16467b97STreehugger Robot            WS : (' '|'\n') {$channel=HIDDEN;} ;
1539*16467b97STreehugger Robot            ''')
1540*16467b97STreehugger Robot
1541*16467b97STreehugger Robot        treeGrammar = textwrap.dedent(
1542*16467b97STreehugger Robot            r'''
1543*16467b97STreehugger Robot            tree grammar TP;
1544*16467b97STreehugger Robot            options {language=Python; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;}
1545*16467b97STreehugger Robot            s : ^(INT (c+=.)+) -> $c+
1546*16467b97STreehugger Robot              ;
1547*16467b97STreehugger Robot            ''')
1548*16467b97STreehugger Robot
1549*16467b97STreehugger Robot        found = self.execTreeParser(
1550*16467b97STreehugger Robot            grammar, 'a',
1551*16467b97STreehugger Robot            treeGrammar, 's',
1552*16467b97STreehugger Robot            "1 2 3")
1553*16467b97STreehugger Robot        self.assertEquals("(2 3) (2 3)", found)
1554*16467b97STreehugger Robot
1555*16467b97STreehugger Robot
1556*16467b97STreehugger Robot    def testRuleResultAsRoot(self):
1557*16467b97STreehugger Robot        grammar = textwrap.dedent(
1558*16467b97STreehugger Robot            r'''
1559*16467b97STreehugger Robot            grammar T;
1560*16467b97STreehugger Robot            options {
1561*16467b97STreehugger Robot                language=Python;
1562*16467b97STreehugger Robot                output=AST;
1563*16467b97STreehugger Robot            }
1564*16467b97STreehugger Robot            a : ID '=' INT -> ^('=' ID INT);
1565*16467b97STreehugger Robot            ID : 'a'..'z'+ ;
1566*16467b97STreehugger Robot            INT : '0'..'9'+;
1567*16467b97STreehugger Robot            COLON : ':' ;
1568*16467b97STreehugger Robot            WS : (' '|'\n') {$channel=HIDDEN;} ;
1569*16467b97STreehugger Robot            ''')
1570*16467b97STreehugger Robot
1571*16467b97STreehugger Robot        treeGrammar = textwrap.dedent(
1572*16467b97STreehugger Robot            r'''
1573*16467b97STreehugger Robot            tree grammar TP;
1574*16467b97STreehugger Robot            options {
1575*16467b97STreehugger Robot                language=Python;
1576*16467b97STreehugger Robot                output=AST;
1577*16467b97STreehugger Robot                rewrite=true;
1578*16467b97STreehugger Robot                ASTLabelType=CommonTree;
1579*16467b97STreehugger Robot                tokenVocab=T;
1580*16467b97STreehugger Robot            }
1581*16467b97STreehugger Robot            a : ^(eq e1=ID e2=.) -> ^(eq $e2 $e1) ;
1582*16467b97STreehugger Robot            eq : '=' | ':' {pass} ;  // bug in set match, doesn't add to tree!! booh. force nonset.
1583*16467b97STreehugger Robot            ''')
1584*16467b97STreehugger Robot
1585*16467b97STreehugger Robot        found = self.execTreeParser(
1586*16467b97STreehugger Robot            grammar, 'a',
1587*16467b97STreehugger Robot            treeGrammar, 'a',
1588*16467b97STreehugger Robot            "abc = 34")
1589*16467b97STreehugger Robot        self.assertEquals("(= 34 abc)", found)
1590*16467b97STreehugger Robot
1591*16467b97STreehugger Robot
1592*16467b97STreehugger Robotif __name__ == '__main__':
1593*16467b97STreehugger Robot    unittest.main()
1594