xref: /aosp_15_r20/external/antlr/runtime/Python3/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                super().__init__(*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:
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=Python3;
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=Python3;
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.assertEqual("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=Python3;
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=Python3;
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.assertEqual("(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=Python3;
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=Python3;
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.assertEqual("(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.assertEqual("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=Python3;
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=Python3;
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.assertEqual("(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=Python3;
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=Python3;
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.assertEqual("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=Python3;
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=Python3;
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.assertEqual("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=Python3;
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=Python3;
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.assertEqual("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=Python3;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=Python3;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.assertEqual("abc 34", found)
330*16467b97STreehugger Robot
331*16467b97STreehugger Robot
332*16467b97STreehugger Robot    def testAutoWildcard2(self):
333*16467b97STreehugger Robot        grammar = textwrap.dedent(
334*16467b97STreehugger Robot            r'''
335*16467b97STreehugger Robot            grammar T;
336*16467b97STreehugger Robot            options {language=Python3;output=AST;}
337*16467b97STreehugger Robot            a : ID INT -> ^(ID INT);
338*16467b97STreehugger Robot            ID : 'a'..'z'+ ;
339*16467b97STreehugger Robot            INT : '0'..'9'+;
340*16467b97STreehugger Robot            WS : (' '|'\n') {$channel=HIDDEN;} ;
341*16467b97STreehugger Robot            ''')
342*16467b97STreehugger Robot
343*16467b97STreehugger Robot        treeGrammar = textwrap.dedent(
344*16467b97STreehugger Robot            r'''
345*16467b97STreehugger Robot            tree grammar TP;
346*16467b97STreehugger Robot            options {language=Python3;output=AST; ASTLabelType=CommonTree; tokenVocab=T;}
347*16467b97STreehugger Robot            a : ^(ID .)
348*16467b97STreehugger Robot              ;
349*16467b97STreehugger Robot            ''')
350*16467b97STreehugger Robot
351*16467b97STreehugger Robot        found = self.execTreeParser(
352*16467b97STreehugger Robot            grammar, 'a',
353*16467b97STreehugger Robot            treeGrammar, 'a',
354*16467b97STreehugger Robot            "abc 34")
355*16467b97STreehugger Robot        self.assertEqual("(abc 34)", found)
356*16467b97STreehugger Robot
357*16467b97STreehugger Robot
358*16467b97STreehugger Robot    def testAutoWildcardWithLabel(self):
359*16467b97STreehugger Robot        grammar = textwrap.dedent(
360*16467b97STreehugger Robot            r'''
361*16467b97STreehugger Robot            grammar T;
362*16467b97STreehugger Robot            options {language=Python3;output=AST;}
363*16467b97STreehugger Robot            a : ID INT ;
364*16467b97STreehugger Robot            ID : 'a'..'z'+ ;
365*16467b97STreehugger Robot            INT : '0'..'9'+;
366*16467b97STreehugger Robot            WS : (' '|'\n') {$channel=HIDDEN;} ;
367*16467b97STreehugger Robot            ''')
368*16467b97STreehugger Robot
369*16467b97STreehugger Robot        treeGrammar = textwrap.dedent(
370*16467b97STreehugger Robot            r'''
371*16467b97STreehugger Robot            tree grammar TP;
372*16467b97STreehugger Robot            options {language=Python3;output=AST; ASTLabelType=CommonTree; tokenVocab=T;}
373*16467b97STreehugger Robot            a : ID c=.
374*16467b97STreehugger Robot              ;
375*16467b97STreehugger Robot            ''')
376*16467b97STreehugger Robot
377*16467b97STreehugger Robot        found = self.execTreeParser(
378*16467b97STreehugger Robot            grammar, 'a',
379*16467b97STreehugger Robot            treeGrammar, 'a',
380*16467b97STreehugger Robot            "abc 34")
381*16467b97STreehugger Robot        self.assertEqual("abc 34", found)
382*16467b97STreehugger Robot
383*16467b97STreehugger Robot
384*16467b97STreehugger Robot    def testAutoWildcardWithListLabel(self):
385*16467b97STreehugger Robot        grammar = textwrap.dedent(
386*16467b97STreehugger Robot            r'''
387*16467b97STreehugger Robot            grammar T;
388*16467b97STreehugger Robot            options {language=Python3;output=AST;}
389*16467b97STreehugger Robot            a : ID INT ;
390*16467b97STreehugger Robot            ID : 'a'..'z'+ ;
391*16467b97STreehugger Robot            INT : '0'..'9'+;
392*16467b97STreehugger Robot            WS : (' '|'\n') {$channel=HIDDEN;} ;
393*16467b97STreehugger Robot            ''')
394*16467b97STreehugger Robot
395*16467b97STreehugger Robot        treeGrammar = textwrap.dedent(
396*16467b97STreehugger Robot            r'''
397*16467b97STreehugger Robot            tree grammar TP;
398*16467b97STreehugger Robot            options {language=Python3;output=AST; ASTLabelType=CommonTree; tokenVocab=T;}
399*16467b97STreehugger Robot            a : ID c+=.
400*16467b97STreehugger Robot              ;
401*16467b97STreehugger Robot            ''')
402*16467b97STreehugger Robot
403*16467b97STreehugger Robot        found = self.execTreeParser(
404*16467b97STreehugger Robot            grammar, 'a',
405*16467b97STreehugger Robot            treeGrammar, 'a',
406*16467b97STreehugger Robot            "abc 34")
407*16467b97STreehugger Robot        self.assertEqual("abc 34", found)
408*16467b97STreehugger Robot
409*16467b97STreehugger Robot
410*16467b97STreehugger Robot    def testAutoDupMultiple(self):
411*16467b97STreehugger Robot        grammar = textwrap.dedent(
412*16467b97STreehugger Robot        r'''
413*16467b97STreehugger Robot        grammar T8;
414*16467b97STreehugger Robot        options {
415*16467b97STreehugger Robot            language=Python3;
416*16467b97STreehugger Robot            output=AST;
417*16467b97STreehugger Robot        }
418*16467b97STreehugger Robot        a : ID ID INT;
419*16467b97STreehugger Robot        ID : 'a'..'z'+ ;
420*16467b97STreehugger Robot        INT : '0'..'9'+;
421*16467b97STreehugger Robot        WS : (' '|'\\n') {$channel=HIDDEN;} ;
422*16467b97STreehugger Robot        ''')
423*16467b97STreehugger Robot
424*16467b97STreehugger Robot        treeGrammar = textwrap.dedent(
425*16467b97STreehugger Robot        r'''
426*16467b97STreehugger Robot        tree grammar TP8;
427*16467b97STreehugger Robot        options {
428*16467b97STreehugger Robot            language=Python3;
429*16467b97STreehugger Robot            output=AST;
430*16467b97STreehugger Robot            ASTLabelType=CommonTree;
431*16467b97STreehugger Robot            tokenVocab=T8;
432*16467b97STreehugger Robot        }
433*16467b97STreehugger Robot        a : ID ID INT
434*16467b97STreehugger Robot          ;
435*16467b97STreehugger Robot        ''')
436*16467b97STreehugger Robot
437*16467b97STreehugger Robot        found = self.execTreeParser(
438*16467b97STreehugger Robot            grammar, 'a',
439*16467b97STreehugger Robot            treeGrammar, 'a',
440*16467b97STreehugger Robot            "a b 3"
441*16467b97STreehugger Robot            )
442*16467b97STreehugger Robot
443*16467b97STreehugger Robot        self.assertEqual("a b 3", found)
444*16467b97STreehugger Robot
445*16467b97STreehugger Robot
446*16467b97STreehugger Robot    def testAutoDupTree(self):
447*16467b97STreehugger Robot        grammar = textwrap.dedent(
448*16467b97STreehugger Robot        r'''
449*16467b97STreehugger Robot        grammar T9;
450*16467b97STreehugger Robot        options {
451*16467b97STreehugger Robot            language=Python3;
452*16467b97STreehugger Robot            output=AST;
453*16467b97STreehugger Robot        }
454*16467b97STreehugger Robot        a : ID INT -> ^(ID INT);
455*16467b97STreehugger Robot        ID : 'a'..'z'+ ;
456*16467b97STreehugger Robot        INT : '0'..'9'+;
457*16467b97STreehugger Robot        WS : (' '|'\\n') {$channel=HIDDEN;} ;
458*16467b97STreehugger Robot        ''')
459*16467b97STreehugger Robot
460*16467b97STreehugger Robot        treeGrammar = textwrap.dedent(
461*16467b97STreehugger Robot        r'''
462*16467b97STreehugger Robot        tree grammar TP9;
463*16467b97STreehugger Robot        options {
464*16467b97STreehugger Robot            language=Python3;
465*16467b97STreehugger Robot            output=AST;
466*16467b97STreehugger Robot            ASTLabelType=CommonTree;
467*16467b97STreehugger Robot            tokenVocab=T9;
468*16467b97STreehugger Robot        }
469*16467b97STreehugger Robot        a : ^(ID INT)
470*16467b97STreehugger Robot          ;
471*16467b97STreehugger Robot        ''')
472*16467b97STreehugger Robot
473*16467b97STreehugger Robot        found = self.execTreeParser(
474*16467b97STreehugger Robot            grammar, 'a',
475*16467b97STreehugger Robot            treeGrammar, 'a',
476*16467b97STreehugger Robot            "a 3"
477*16467b97STreehugger Robot            )
478*16467b97STreehugger Robot
479*16467b97STreehugger Robot        self.assertEqual("(a 3)", found)
480*16467b97STreehugger Robot
481*16467b97STreehugger Robot
482*16467b97STreehugger Robot    def testAutoDupTreeWithLabels(self):
483*16467b97STreehugger Robot        grammar = textwrap.dedent(
484*16467b97STreehugger Robot        r'''
485*16467b97STreehugger Robot        grammar T10;
486*16467b97STreehugger Robot        options {
487*16467b97STreehugger Robot            language=Python3;
488*16467b97STreehugger Robot            output=AST;
489*16467b97STreehugger Robot        }
490*16467b97STreehugger Robot        a : ID INT -> ^(ID INT);
491*16467b97STreehugger Robot        ID : 'a'..'z'+ ;
492*16467b97STreehugger Robot        INT : '0'..'9'+;
493*16467b97STreehugger Robot        WS : (' '|'\\n') {$channel=HIDDEN;} ;
494*16467b97STreehugger Robot        ''')
495*16467b97STreehugger Robot
496*16467b97STreehugger Robot        treeGrammar = textwrap.dedent(
497*16467b97STreehugger Robot        r'''
498*16467b97STreehugger Robot        tree grammar TP10;
499*16467b97STreehugger Robot        options {
500*16467b97STreehugger Robot            language=Python3;
501*16467b97STreehugger Robot            output=AST;
502*16467b97STreehugger Robot            ASTLabelType=CommonTree;
503*16467b97STreehugger Robot            tokenVocab=T10;
504*16467b97STreehugger Robot        }
505*16467b97STreehugger Robot        a : ^(x=ID y=INT)
506*16467b97STreehugger Robot          ;
507*16467b97STreehugger Robot        ''')
508*16467b97STreehugger Robot
509*16467b97STreehugger Robot        found = self.execTreeParser(
510*16467b97STreehugger Robot            grammar, 'a',
511*16467b97STreehugger Robot            treeGrammar, 'a',
512*16467b97STreehugger Robot            "a 3"
513*16467b97STreehugger Robot            )
514*16467b97STreehugger Robot
515*16467b97STreehugger Robot        self.assertEqual("(a 3)", found)
516*16467b97STreehugger Robot
517*16467b97STreehugger Robot
518*16467b97STreehugger Robot    def testAutoDupTreeWithListLabels(self):
519*16467b97STreehugger Robot        grammar = textwrap.dedent(
520*16467b97STreehugger Robot        r'''
521*16467b97STreehugger Robot        grammar T11;
522*16467b97STreehugger Robot        options {
523*16467b97STreehugger Robot            language=Python3;
524*16467b97STreehugger Robot            output=AST;
525*16467b97STreehugger Robot        }
526*16467b97STreehugger Robot        a : ID INT -> ^(ID INT);
527*16467b97STreehugger Robot        ID : 'a'..'z'+ ;
528*16467b97STreehugger Robot        INT : '0'..'9'+;
529*16467b97STreehugger Robot        WS : (' '|'\\n') {$channel=HIDDEN;} ;
530*16467b97STreehugger Robot        ''')
531*16467b97STreehugger Robot
532*16467b97STreehugger Robot        treeGrammar = textwrap.dedent(
533*16467b97STreehugger Robot        r'''
534*16467b97STreehugger Robot        tree grammar TP11;
535*16467b97STreehugger Robot        options {
536*16467b97STreehugger Robot            language=Python3;
537*16467b97STreehugger Robot            output=AST;
538*16467b97STreehugger Robot            ASTLabelType=CommonTree;
539*16467b97STreehugger Robot            tokenVocab=T11;
540*16467b97STreehugger Robot        }
541*16467b97STreehugger Robot        a : ^(x+=ID y+=INT)
542*16467b97STreehugger Robot          ;
543*16467b97STreehugger Robot        ''')
544*16467b97STreehugger Robot
545*16467b97STreehugger Robot        found = self.execTreeParser(
546*16467b97STreehugger Robot            grammar, 'a',
547*16467b97STreehugger Robot            treeGrammar, 'a',
548*16467b97STreehugger Robot            "a 3"
549*16467b97STreehugger Robot            )
550*16467b97STreehugger Robot
551*16467b97STreehugger Robot        self.assertEqual("(a 3)", found)
552*16467b97STreehugger Robot
553*16467b97STreehugger Robot
554*16467b97STreehugger Robot    def testAutoDupTreeWithRuleRoot(self):
555*16467b97STreehugger Robot        grammar = textwrap.dedent(
556*16467b97STreehugger Robot        r'''
557*16467b97STreehugger Robot        grammar T12;
558*16467b97STreehugger Robot        options {
559*16467b97STreehugger Robot            language=Python3;
560*16467b97STreehugger Robot            output=AST;
561*16467b97STreehugger Robot        }
562*16467b97STreehugger Robot        a : ID INT -> ^(ID INT);
563*16467b97STreehugger Robot        ID : 'a'..'z'+ ;
564*16467b97STreehugger Robot        INT : '0'..'9'+;
565*16467b97STreehugger Robot        WS : (' '|'\\n') {$channel=HIDDEN;} ;
566*16467b97STreehugger Robot        ''')
567*16467b97STreehugger Robot
568*16467b97STreehugger Robot        treeGrammar = textwrap.dedent(
569*16467b97STreehugger Robot        r'''
570*16467b97STreehugger Robot        tree grammar TP12;
571*16467b97STreehugger Robot        options {
572*16467b97STreehugger Robot            language=Python3;
573*16467b97STreehugger Robot            output=AST;
574*16467b97STreehugger Robot            ASTLabelType=CommonTree;
575*16467b97STreehugger Robot            tokenVocab=T12;
576*16467b97STreehugger Robot        }
577*16467b97STreehugger Robot        a : ^(b INT) ;
578*16467b97STreehugger Robot        b : ID ;
579*16467b97STreehugger Robot        ''')
580*16467b97STreehugger Robot
581*16467b97STreehugger Robot        found = self.execTreeParser(
582*16467b97STreehugger Robot            grammar, 'a',
583*16467b97STreehugger Robot            treeGrammar, 'a',
584*16467b97STreehugger Robot            "a 3"
585*16467b97STreehugger Robot            )
586*16467b97STreehugger Robot
587*16467b97STreehugger Robot        self.assertEqual("(a 3)", found)
588*16467b97STreehugger Robot
589*16467b97STreehugger Robot
590*16467b97STreehugger Robot    def testAutoDupTreeWithRuleRootAndLabels(self):
591*16467b97STreehugger Robot        grammar = textwrap.dedent(
592*16467b97STreehugger Robot        r'''
593*16467b97STreehugger Robot        grammar T13;
594*16467b97STreehugger Robot        options {
595*16467b97STreehugger Robot            language=Python3;
596*16467b97STreehugger Robot            output=AST;
597*16467b97STreehugger Robot        }
598*16467b97STreehugger Robot        a : ID INT -> ^(ID INT);
599*16467b97STreehugger Robot        ID : 'a'..'z'+ ;
600*16467b97STreehugger Robot        INT : '0'..'9'+;
601*16467b97STreehugger Robot        WS : (' '|'\\n') {$channel=HIDDEN;} ;
602*16467b97STreehugger Robot        ''')
603*16467b97STreehugger Robot
604*16467b97STreehugger Robot        treeGrammar = textwrap.dedent(
605*16467b97STreehugger Robot        r'''
606*16467b97STreehugger Robot        tree grammar TP13;
607*16467b97STreehugger Robot        options {
608*16467b97STreehugger Robot            language=Python3;
609*16467b97STreehugger Robot            output=AST;
610*16467b97STreehugger Robot            ASTLabelType=CommonTree;
611*16467b97STreehugger Robot            tokenVocab=T13;
612*16467b97STreehugger Robot        }
613*16467b97STreehugger Robot        a : ^(x=b INT) ;
614*16467b97STreehugger Robot        b : ID ;
615*16467b97STreehugger Robot        ''')
616*16467b97STreehugger Robot
617*16467b97STreehugger Robot        found = self.execTreeParser(
618*16467b97STreehugger Robot            grammar, 'a',
619*16467b97STreehugger Robot            treeGrammar, 'a',
620*16467b97STreehugger Robot            "a 3"
621*16467b97STreehugger Robot            )
622*16467b97STreehugger Robot
623*16467b97STreehugger Robot        self.assertEqual("(a 3)", found)
624*16467b97STreehugger Robot
625*16467b97STreehugger Robot
626*16467b97STreehugger Robot    def testAutoDupTreeWithRuleRootAndListLabels(self):
627*16467b97STreehugger Robot        grammar = textwrap.dedent(
628*16467b97STreehugger Robot        r'''
629*16467b97STreehugger Robot        grammar T14;
630*16467b97STreehugger Robot        options {
631*16467b97STreehugger Robot            language=Python3;
632*16467b97STreehugger Robot            output=AST;
633*16467b97STreehugger Robot        }
634*16467b97STreehugger Robot        a : ID INT -> ^(ID INT);
635*16467b97STreehugger Robot        ID : 'a'..'z'+ ;
636*16467b97STreehugger Robot        INT : '0'..'9'+;
637*16467b97STreehugger Robot        WS : (' '|'\\n') {$channel=HIDDEN;} ;
638*16467b97STreehugger Robot        ''')
639*16467b97STreehugger Robot
640*16467b97STreehugger Robot        treeGrammar = textwrap.dedent(
641*16467b97STreehugger Robot        r'''
642*16467b97STreehugger Robot        tree grammar TP14;
643*16467b97STreehugger Robot        options {
644*16467b97STreehugger Robot            language=Python3;
645*16467b97STreehugger Robot            output=AST;
646*16467b97STreehugger Robot            ASTLabelType=CommonTree;
647*16467b97STreehugger Robot            tokenVocab=T14;
648*16467b97STreehugger Robot        }
649*16467b97STreehugger Robot        a : ^(x+=b y+=c) ;
650*16467b97STreehugger Robot        b : ID ;
651*16467b97STreehugger Robot        c : INT ;
652*16467b97STreehugger Robot        ''')
653*16467b97STreehugger Robot
654*16467b97STreehugger Robot        found = self.execTreeParser(
655*16467b97STreehugger Robot            grammar, 'a',
656*16467b97STreehugger Robot            treeGrammar, 'a',
657*16467b97STreehugger Robot            "a 3"
658*16467b97STreehugger Robot            )
659*16467b97STreehugger Robot
660*16467b97STreehugger Robot        self.assertEqual("(a 3)", found)
661*16467b97STreehugger Robot
662*16467b97STreehugger Robot
663*16467b97STreehugger Robot    def testAutoDupNestedTree(self):
664*16467b97STreehugger Robot        grammar = textwrap.dedent(
665*16467b97STreehugger Robot        r'''
666*16467b97STreehugger Robot        grammar T15;
667*16467b97STreehugger Robot        options {
668*16467b97STreehugger Robot            language=Python3;
669*16467b97STreehugger Robot            output=AST;
670*16467b97STreehugger Robot        }
671*16467b97STreehugger Robot        a : x=ID y=ID INT -> ^($x ^($y INT));
672*16467b97STreehugger Robot        ID : 'a'..'z'+ ;
673*16467b97STreehugger Robot        INT : '0'..'9'+;
674*16467b97STreehugger Robot        WS : (' '|'\\n') {$channel=HIDDEN;} ;
675*16467b97STreehugger Robot        ''')
676*16467b97STreehugger Robot
677*16467b97STreehugger Robot        treeGrammar = textwrap.dedent(
678*16467b97STreehugger Robot        r'''
679*16467b97STreehugger Robot        tree grammar TP15;
680*16467b97STreehugger Robot        options {
681*16467b97STreehugger Robot            language=Python3;
682*16467b97STreehugger Robot            output=AST;
683*16467b97STreehugger Robot            ASTLabelType=CommonTree;
684*16467b97STreehugger Robot            tokenVocab=T15;
685*16467b97STreehugger Robot        }
686*16467b97STreehugger Robot        a : ^(ID ^(ID INT))
687*16467b97STreehugger Robot          ;
688*16467b97STreehugger Robot        ''')
689*16467b97STreehugger Robot
690*16467b97STreehugger Robot        found = self.execTreeParser(
691*16467b97STreehugger Robot            grammar, 'a',
692*16467b97STreehugger Robot            treeGrammar, 'a',
693*16467b97STreehugger Robot            "a b 3"
694*16467b97STreehugger Robot            )
695*16467b97STreehugger Robot
696*16467b97STreehugger Robot        self.assertEqual("(a (b 3))", found)
697*16467b97STreehugger Robot
698*16467b97STreehugger Robot
699*16467b97STreehugger Robot    def testDelete(self):
700*16467b97STreehugger Robot        grammar = textwrap.dedent(
701*16467b97STreehugger Robot        r'''
702*16467b97STreehugger Robot        grammar T16;
703*16467b97STreehugger Robot        options {
704*16467b97STreehugger Robot            language=Python3;
705*16467b97STreehugger Robot            output=AST;
706*16467b97STreehugger Robot        }
707*16467b97STreehugger Robot        a : ID ;
708*16467b97STreehugger Robot        ID : 'a'..'z'+ ;
709*16467b97STreehugger Robot        INT : '0'..'9'+;
710*16467b97STreehugger Robot        WS : (' '|'\\n') {$channel=HIDDEN;} ;
711*16467b97STreehugger Robot        ''')
712*16467b97STreehugger Robot
713*16467b97STreehugger Robot        treeGrammar = textwrap.dedent(
714*16467b97STreehugger Robot        r'''
715*16467b97STreehugger Robot        tree grammar TP16;
716*16467b97STreehugger Robot        options {
717*16467b97STreehugger Robot            language=Python3;
718*16467b97STreehugger Robot            output=AST;
719*16467b97STreehugger Robot            ASTLabelType=CommonTree;
720*16467b97STreehugger Robot            tokenVocab=T16;
721*16467b97STreehugger Robot        }
722*16467b97STreehugger Robot        a : ID ->
723*16467b97STreehugger Robot          ;
724*16467b97STreehugger Robot        ''')
725*16467b97STreehugger Robot
726*16467b97STreehugger Robot        found = self.execTreeParser(
727*16467b97STreehugger Robot            grammar, 'a',
728*16467b97STreehugger Robot            treeGrammar, 'a',
729*16467b97STreehugger Robot            "abc"
730*16467b97STreehugger Robot            )
731*16467b97STreehugger Robot
732*16467b97STreehugger Robot        self.assertEqual("", found)
733*16467b97STreehugger Robot
734*16467b97STreehugger Robot    def testSetMatchNoRewrite(self):
735*16467b97STreehugger Robot        grammar = textwrap.dedent(
736*16467b97STreehugger Robot            r'''
737*16467b97STreehugger Robot            grammar T;
738*16467b97STreehugger Robot            options {
739*16467b97STreehugger Robot                language=Python3;
740*16467b97STreehugger Robot                output=AST;
741*16467b97STreehugger Robot            }
742*16467b97STreehugger Robot            a : ID INT ;
743*16467b97STreehugger Robot            ID : 'a'..'z'+ ;
744*16467b97STreehugger Robot            INT : '0'..'9'+;
745*16467b97STreehugger Robot            WS : (' '|'\n') {$channel=HIDDEN;} ;
746*16467b97STreehugger Robot            ''')
747*16467b97STreehugger Robot
748*16467b97STreehugger Robot        treeGrammar = textwrap.dedent(
749*16467b97STreehugger Robot            r'''
750*16467b97STreehugger Robot            tree grammar TP;
751*16467b97STreehugger Robot            options {
752*16467b97STreehugger Robot                language=Python3;
753*16467b97STreehugger Robot                output=AST;
754*16467b97STreehugger Robot                ASTLabelType=CommonTree;
755*16467b97STreehugger Robot                tokenVocab=T;
756*16467b97STreehugger Robot            }
757*16467b97STreehugger Robot            a : b INT;
758*16467b97STreehugger Robot            b : ID | INT;
759*16467b97STreehugger Robot            ''')
760*16467b97STreehugger Robot
761*16467b97STreehugger Robot        found = self.execTreeParser(
762*16467b97STreehugger Robot            grammar, 'a',
763*16467b97STreehugger Robot            treeGrammar, 'a',
764*16467b97STreehugger Robot            "abc 34"
765*16467b97STreehugger Robot            )
766*16467b97STreehugger Robot
767*16467b97STreehugger Robot        self.assertEqual("abc 34", found)
768*16467b97STreehugger Robot
769*16467b97STreehugger Robot
770*16467b97STreehugger Robot    def testSetOptionalMatchNoRewrite(self):
771*16467b97STreehugger Robot        grammar = textwrap.dedent(
772*16467b97STreehugger Robot            r'''
773*16467b97STreehugger Robot            grammar T;
774*16467b97STreehugger Robot            options {
775*16467b97STreehugger Robot                language=Python3;
776*16467b97STreehugger Robot                output=AST;
777*16467b97STreehugger Robot            }
778*16467b97STreehugger Robot            a : ID INT ;
779*16467b97STreehugger Robot            ID : 'a'..'z'+ ;
780*16467b97STreehugger Robot            INT : '0'..'9'+;
781*16467b97STreehugger Robot            WS : (' '|'\n') {$channel=HIDDEN;} ;
782*16467b97STreehugger Robot            ''')
783*16467b97STreehugger Robot
784*16467b97STreehugger Robot        treeGrammar = textwrap.dedent(
785*16467b97STreehugger Robot            r'''
786*16467b97STreehugger Robot            tree grammar TP;
787*16467b97STreehugger Robot            options {
788*16467b97STreehugger Robot                language=Python3;
789*16467b97STreehugger Robot                output=AST;
790*16467b97STreehugger Robot                ASTLabelType=CommonTree;
791*16467b97STreehugger Robot                tokenVocab=T;
792*16467b97STreehugger Robot            }
793*16467b97STreehugger Robot            a : (ID|INT)? INT ;
794*16467b97STreehugger Robot            ''')
795*16467b97STreehugger Robot
796*16467b97STreehugger Robot        found = self.execTreeParser(
797*16467b97STreehugger Robot            grammar, 'a',
798*16467b97STreehugger Robot            treeGrammar, 'a',
799*16467b97STreehugger Robot            "abc 34")
800*16467b97STreehugger Robot
801*16467b97STreehugger Robot        self.assertEqual("abc 34", found)
802*16467b97STreehugger Robot
803*16467b97STreehugger Robot
804*16467b97STreehugger Robot    def testSetMatchNoRewriteLevel2(self):
805*16467b97STreehugger Robot        grammar = textwrap.dedent(
806*16467b97STreehugger Robot            r'''
807*16467b97STreehugger Robot            grammar T;
808*16467b97STreehugger Robot            options {
809*16467b97STreehugger Robot                language=Python3;
810*16467b97STreehugger Robot                output=AST;
811*16467b97STreehugger Robot            }
812*16467b97STreehugger Robot            a : x=ID INT -> ^($x INT);
813*16467b97STreehugger Robot            ID : 'a'..'z'+ ;
814*16467b97STreehugger Robot            INT : '0'..'9'+;
815*16467b97STreehugger Robot            WS : (' '|'\n') {$channel=HIDDEN;} ;
816*16467b97STreehugger Robot            ''')
817*16467b97STreehugger Robot
818*16467b97STreehugger Robot        treeGrammar = textwrap.dedent(
819*16467b97STreehugger Robot            r'''
820*16467b97STreehugger Robot            tree grammar TP;
821*16467b97STreehugger Robot            options {
822*16467b97STreehugger Robot                language=Python3;
823*16467b97STreehugger Robot                output=AST;
824*16467b97STreehugger Robot                ASTLabelType=CommonTree;
825*16467b97STreehugger Robot                tokenVocab=T;
826*16467b97STreehugger Robot            }
827*16467b97STreehugger Robot            a : ^(ID (ID | INT) ) ;
828*16467b97STreehugger Robot            ''')
829*16467b97STreehugger Robot
830*16467b97STreehugger Robot        found = self.execTreeParser(
831*16467b97STreehugger Robot            grammar, 'a',
832*16467b97STreehugger Robot            treeGrammar, 'a',
833*16467b97STreehugger Robot            "abc 34"
834*16467b97STreehugger Robot            )
835*16467b97STreehugger Robot
836*16467b97STreehugger Robot        self.assertEqual("(abc 34)", found)
837*16467b97STreehugger Robot
838*16467b97STreehugger Robot
839*16467b97STreehugger Robot    def testSetMatchNoRewriteLevel2Root(self):
840*16467b97STreehugger Robot        grammar = textwrap.dedent(
841*16467b97STreehugger Robot            r'''
842*16467b97STreehugger Robot            grammar T;
843*16467b97STreehugger Robot            options {
844*16467b97STreehugger Robot                language=Python3;
845*16467b97STreehugger Robot                output=AST;
846*16467b97STreehugger Robot            }
847*16467b97STreehugger Robot            a : x=ID INT -> ^($x INT);
848*16467b97STreehugger Robot            ID : 'a'..'z'+ ;
849*16467b97STreehugger Robot            INT : '0'..'9'+;
850*16467b97STreehugger Robot            WS : (' '|'\n') {$channel=HIDDEN;} ;
851*16467b97STreehugger Robot            ''')
852*16467b97STreehugger Robot
853*16467b97STreehugger Robot        treeGrammar = textwrap.dedent(
854*16467b97STreehugger Robot            r'''
855*16467b97STreehugger Robot            tree grammar TP;
856*16467b97STreehugger Robot            options {
857*16467b97STreehugger Robot                language=Python3;
858*16467b97STreehugger Robot                output=AST;
859*16467b97STreehugger Robot                ASTLabelType=CommonTree;
860*16467b97STreehugger Robot                tokenVocab=T;
861*16467b97STreehugger Robot            }
862*16467b97STreehugger Robot            a : ^((ID | INT) INT) ;
863*16467b97STreehugger Robot            ''')
864*16467b97STreehugger Robot
865*16467b97STreehugger Robot        found = self.execTreeParser(
866*16467b97STreehugger Robot            grammar, 'a',
867*16467b97STreehugger Robot            treeGrammar, 'a',
868*16467b97STreehugger Robot            "abc 34"
869*16467b97STreehugger Robot            )
870*16467b97STreehugger Robot
871*16467b97STreehugger Robot        self.assertEqual("(abc 34)", found)
872*16467b97STreehugger Robot
873*16467b97STreehugger Robot
874*16467b97STreehugger Robot    ## REWRITE MODE
875*16467b97STreehugger Robot
876*16467b97STreehugger Robot    def testRewriteModeCombinedRewriteAndAuto(self):
877*16467b97STreehugger Robot        grammar = textwrap.dedent(
878*16467b97STreehugger Robot        r'''
879*16467b97STreehugger Robot        grammar T17;
880*16467b97STreehugger Robot        options {
881*16467b97STreehugger Robot            language=Python3;
882*16467b97STreehugger Robot            output=AST;
883*16467b97STreehugger Robot        }
884*16467b97STreehugger Robot        a : ID INT -> ^(ID INT) | INT ;
885*16467b97STreehugger Robot        ID : 'a'..'z'+ ;
886*16467b97STreehugger Robot        INT : '0'..'9'+;
887*16467b97STreehugger Robot        WS : (' '|'\\n') {$channel=HIDDEN;} ;
888*16467b97STreehugger Robot        ''')
889*16467b97STreehugger Robot
890*16467b97STreehugger Robot        treeGrammar = textwrap.dedent(
891*16467b97STreehugger Robot        r'''
892*16467b97STreehugger Robot        tree grammar TP17;
893*16467b97STreehugger Robot        options {
894*16467b97STreehugger Robot            language=Python3;
895*16467b97STreehugger Robot            output=AST;
896*16467b97STreehugger Robot            ASTLabelType=CommonTree;
897*16467b97STreehugger Robot            tokenVocab=T17;
898*16467b97STreehugger Robot            rewrite=true;
899*16467b97STreehugger Robot        }
900*16467b97STreehugger Robot        a : ^(ID INT) -> ^(ID["ick"] INT)
901*16467b97STreehugger Robot          | INT // leaves it alone, returning $a.start
902*16467b97STreehugger Robot          ;
903*16467b97STreehugger Robot        ''')
904*16467b97STreehugger Robot
905*16467b97STreehugger Robot        found = self.execTreeParser(
906*16467b97STreehugger Robot            grammar, 'a',
907*16467b97STreehugger Robot            treeGrammar, 'a',
908*16467b97STreehugger Robot            "abc 34"
909*16467b97STreehugger Robot            )
910*16467b97STreehugger Robot
911*16467b97STreehugger Robot        self.assertEqual("(ick 34)", found)
912*16467b97STreehugger Robot
913*16467b97STreehugger Robot
914*16467b97STreehugger Robot        found = self.execTreeParser(
915*16467b97STreehugger Robot            grammar, 'a',
916*16467b97STreehugger Robot            treeGrammar, 'a',
917*16467b97STreehugger Robot            "34"
918*16467b97STreehugger Robot            )
919*16467b97STreehugger Robot
920*16467b97STreehugger Robot        self.assertEqual("34", found)
921*16467b97STreehugger Robot
922*16467b97STreehugger Robot
923*16467b97STreehugger Robot    def testRewriteModeFlatTree(self):
924*16467b97STreehugger Robot        grammar = textwrap.dedent(
925*16467b97STreehugger Robot            r'''
926*16467b97STreehugger Robot            grammar T18;
927*16467b97STreehugger Robot            options {
928*16467b97STreehugger Robot              language=Python3;
929*16467b97STreehugger Robot              output=AST;
930*16467b97STreehugger Robot            }
931*16467b97STreehugger Robot            a : ID INT -> ID INT | INT ;
932*16467b97STreehugger Robot            ID : 'a'..'z'+ ;
933*16467b97STreehugger Robot            INT : '0'..'9'+;
934*16467b97STreehugger Robot            WS : (' '|'\n') {$channel=HIDDEN;} ;
935*16467b97STreehugger Robot            ''')
936*16467b97STreehugger Robot
937*16467b97STreehugger Robot        treeGrammar = textwrap.dedent(
938*16467b97STreehugger Robot            r'''
939*16467b97STreehugger Robot            tree grammar TP18;
940*16467b97STreehugger Robot            options {
941*16467b97STreehugger Robot              language=Python3;
942*16467b97STreehugger Robot              output=AST;
943*16467b97STreehugger Robot              ASTLabelType=CommonTree;
944*16467b97STreehugger Robot              tokenVocab=T18;
945*16467b97STreehugger Robot              rewrite=true;
946*16467b97STreehugger Robot            }
947*16467b97STreehugger Robot            s : ID a ;
948*16467b97STreehugger Robot            a : INT -> INT["1"]
949*16467b97STreehugger Robot              ;
950*16467b97STreehugger Robot            ''')
951*16467b97STreehugger Robot
952*16467b97STreehugger Robot        found = self.execTreeParser(
953*16467b97STreehugger Robot            grammar, 'a',
954*16467b97STreehugger Robot            treeGrammar, 's',
955*16467b97STreehugger Robot            "abc 34"
956*16467b97STreehugger Robot            )
957*16467b97STreehugger Robot        self.assertEqual("abc 1", found)
958*16467b97STreehugger Robot
959*16467b97STreehugger Robot
960*16467b97STreehugger Robot    def testRewriteModeChainRuleFlatTree(self):
961*16467b97STreehugger Robot        grammar = textwrap.dedent(
962*16467b97STreehugger Robot            r'''
963*16467b97STreehugger Robot            grammar T;
964*16467b97STreehugger Robot            options {language=Python3; output=AST;}
965*16467b97STreehugger Robot            a : ID INT -> ID INT | INT ;
966*16467b97STreehugger Robot            ID : 'a'..'z'+ ;
967*16467b97STreehugger Robot            INT : '0'..'9'+;
968*16467b97STreehugger Robot            WS : (' '|'\n') {$channel=HIDDEN;} ;
969*16467b97STreehugger Robot            ''')
970*16467b97STreehugger Robot
971*16467b97STreehugger Robot        treeGrammar = textwrap.dedent(
972*16467b97STreehugger Robot            r'''
973*16467b97STreehugger Robot            tree grammar TP;
974*16467b97STreehugger Robot            options {language=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;}
975*16467b97STreehugger Robot            s : a ;
976*16467b97STreehugger Robot            a : b ;
977*16467b97STreehugger Robot            b : ID INT -> INT ID
978*16467b97STreehugger Robot              ;
979*16467b97STreehugger Robot            ''')
980*16467b97STreehugger Robot
981*16467b97STreehugger Robot        found = self.execTreeParser(
982*16467b97STreehugger Robot            grammar, 'a',
983*16467b97STreehugger Robot            treeGrammar, 's',
984*16467b97STreehugger Robot            "abc 34")
985*16467b97STreehugger Robot        self.assertEqual("34 abc", found)
986*16467b97STreehugger Robot
987*16467b97STreehugger Robot
988*16467b97STreehugger Robot    def testRewriteModeChainRuleTree(self):
989*16467b97STreehugger Robot        grammar = textwrap.dedent(
990*16467b97STreehugger Robot            r'''
991*16467b97STreehugger Robot            grammar T;
992*16467b97STreehugger Robot            options {language=Python3; output=AST;}
993*16467b97STreehugger Robot            a : ID INT -> ^(ID 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=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;}
1003*16467b97STreehugger Robot            s : a ;
1004*16467b97STreehugger Robot            a : b ; // a.tree must become b.tree
1005*16467b97STreehugger Robot            b : ^(ID INT) -> INT
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.assertEqual("34", found)
1014*16467b97STreehugger Robot
1015*16467b97STreehugger Robot
1016*16467b97STreehugger Robot    def testRewriteModeChainRuleTree2(self):
1017*16467b97STreehugger Robot        grammar = textwrap.dedent(
1018*16467b97STreehugger Robot            r'''
1019*16467b97STreehugger Robot            grammar T;
1020*16467b97STreehugger Robot            options {language=Python3; 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=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;}
1031*16467b97STreehugger Robot            tokens { X; }
1032*16467b97STreehugger Robot            s : a* b ; // only b contributes to tree, but it's after a*; s.tree = b.tree
1033*16467b97STreehugger Robot            a : X ;
1034*16467b97STreehugger Robot            b : ^(ID INT) -> INT
1035*16467b97STreehugger Robot              ;
1036*16467b97STreehugger Robot            """)
1037*16467b97STreehugger Robot
1038*16467b97STreehugger Robot        found = self.execTreeParser(
1039*16467b97STreehugger Robot            grammar, 'a',
1040*16467b97STreehugger Robot            treeGrammar, 's',
1041*16467b97STreehugger Robot            "abc 34")
1042*16467b97STreehugger Robot        self.assertEqual("34", found)
1043*16467b97STreehugger Robot
1044*16467b97STreehugger Robot
1045*16467b97STreehugger Robot    def testRewriteModeChainRuleTree3(self):
1046*16467b97STreehugger Robot        grammar = textwrap.dedent(
1047*16467b97STreehugger Robot            r'''
1048*16467b97STreehugger Robot            grammar T;
1049*16467b97STreehugger Robot            options {language=Python3; output=AST;}
1050*16467b97STreehugger Robot            a : 'boo' ID INT -> 'boo' ^(ID INT) ;
1051*16467b97STreehugger Robot            ID : 'a'..'z'+ ;
1052*16467b97STreehugger Robot            INT : '0'..'9'+;
1053*16467b97STreehugger Robot            WS : (' '|'\n') {$channel=HIDDEN;} ;
1054*16467b97STreehugger Robot            ''')
1055*16467b97STreehugger Robot
1056*16467b97STreehugger Robot        treeGrammar = textwrap.dedent(
1057*16467b97STreehugger Robot            r"""
1058*16467b97STreehugger Robot            tree grammar TP;
1059*16467b97STreehugger Robot            options {language=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;}
1060*16467b97STreehugger Robot            tokens { X; }
1061*16467b97STreehugger Robot            s : 'boo' a* b ; // don't reset s.tree to b.tree due to 'boo'
1062*16467b97STreehugger Robot            a : X ;
1063*16467b97STreehugger Robot            b : ^(ID INT) -> INT
1064*16467b97STreehugger Robot              ;
1065*16467b97STreehugger Robot            """)
1066*16467b97STreehugger Robot
1067*16467b97STreehugger Robot        found = self.execTreeParser(
1068*16467b97STreehugger Robot            grammar, 'a',
1069*16467b97STreehugger Robot            treeGrammar, 's',
1070*16467b97STreehugger Robot            "boo abc 34")
1071*16467b97STreehugger Robot        self.assertEqual("boo 34", found)
1072*16467b97STreehugger Robot
1073*16467b97STreehugger Robot
1074*16467b97STreehugger Robot    def testRewriteModeChainRuleTree4(self):
1075*16467b97STreehugger Robot        grammar = textwrap.dedent(
1076*16467b97STreehugger Robot            r"""
1077*16467b97STreehugger Robot            grammar T;
1078*16467b97STreehugger Robot            options {language=Python3; output=AST;}
1079*16467b97STreehugger Robot            a : 'boo' ID INT -> ^('boo' ^(ID INT)) ;
1080*16467b97STreehugger Robot            ID : 'a'..'z'+ ;
1081*16467b97STreehugger Robot            INT : '0'..'9'+;
1082*16467b97STreehugger Robot            WS : (' '|'\n') {$channel=HIDDEN;} ;
1083*16467b97STreehugger Robot            """)
1084*16467b97STreehugger Robot
1085*16467b97STreehugger Robot        treeGrammar = textwrap.dedent(
1086*16467b97STreehugger Robot            r"""
1087*16467b97STreehugger Robot            tree grammar TP;
1088*16467b97STreehugger Robot            options {language=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;}
1089*16467b97STreehugger Robot            tokens { X; }
1090*16467b97STreehugger Robot            s : ^('boo' a* b) ; // don't reset s.tree to b.tree due to 'boo'
1091*16467b97STreehugger Robot            a : X ;
1092*16467b97STreehugger Robot            b : ^(ID INT) -> INT
1093*16467b97STreehugger Robot              ;
1094*16467b97STreehugger Robot            """)
1095*16467b97STreehugger Robot
1096*16467b97STreehugger Robot        found = self.execTreeParser(
1097*16467b97STreehugger Robot            grammar, 'a',
1098*16467b97STreehugger Robot            treeGrammar, 's',
1099*16467b97STreehugger Robot            "boo abc 34")
1100*16467b97STreehugger Robot        self.assertEqual("(boo 34)", found)
1101*16467b97STreehugger Robot
1102*16467b97STreehugger Robot
1103*16467b97STreehugger Robot    def testRewriteModeChainRuleTree5(self):
1104*16467b97STreehugger Robot        grammar = textwrap.dedent(
1105*16467b97STreehugger Robot            r"""
1106*16467b97STreehugger Robot            grammar T;
1107*16467b97STreehugger Robot            options {language=Python3; output=AST;}
1108*16467b97STreehugger Robot            a : 'boo' ID INT -> ^('boo' ^(ID INT)) ;
1109*16467b97STreehugger Robot            ID : 'a'..'z'+ ;
1110*16467b97STreehugger Robot            INT : '0'..'9'+;
1111*16467b97STreehugger Robot            WS : (' '|'\n') {$channel=HIDDEN;} ;
1112*16467b97STreehugger Robot            """)
1113*16467b97STreehugger Robot
1114*16467b97STreehugger Robot        treeGrammar = textwrap.dedent(
1115*16467b97STreehugger Robot            r"""
1116*16467b97STreehugger Robot            tree grammar TP;
1117*16467b97STreehugger Robot            options {language=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;}
1118*16467b97STreehugger Robot            tokens { X; }
1119*16467b97STreehugger Robot            s : ^(a b) ; // s.tree is a.tree
1120*16467b97STreehugger Robot            a : 'boo' ;
1121*16467b97STreehugger Robot            b : ^(ID INT) -> INT
1122*16467b97STreehugger Robot              ;
1123*16467b97STreehugger Robot            """)
1124*16467b97STreehugger Robot
1125*16467b97STreehugger Robot        found = self.execTreeParser(
1126*16467b97STreehugger Robot            grammar, 'a',
1127*16467b97STreehugger Robot            treeGrammar, 's',
1128*16467b97STreehugger Robot            "boo abc 34")
1129*16467b97STreehugger Robot        self.assertEqual("(boo 34)", found)
1130*16467b97STreehugger Robot
1131*16467b97STreehugger Robot
1132*16467b97STreehugger Robot    def testRewriteOfRuleRef(self):
1133*16467b97STreehugger Robot        grammar = textwrap.dedent(
1134*16467b97STreehugger Robot            r"""
1135*16467b97STreehugger Robot            grammar T;
1136*16467b97STreehugger Robot            options {language=Python3; output=AST;}
1137*16467b97STreehugger Robot            a : ID INT -> ID INT | INT ;
1138*16467b97STreehugger Robot            ID : 'a'..'z'+ ;
1139*16467b97STreehugger Robot            INT : '0'..'9'+;
1140*16467b97STreehugger Robot            WS : (' '|'\n') {$channel=HIDDEN;} ;
1141*16467b97STreehugger Robot            """)
1142*16467b97STreehugger Robot
1143*16467b97STreehugger Robot        treeGrammar = textwrap.dedent(
1144*16467b97STreehugger Robot            r"""
1145*16467b97STreehugger Robot            tree grammar TP;
1146*16467b97STreehugger Robot            options {language=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;}
1147*16467b97STreehugger Robot            s : a -> a ;
1148*16467b97STreehugger Robot            a : ID INT -> ID INT ;
1149*16467b97STreehugger Robot            """)
1150*16467b97STreehugger Robot
1151*16467b97STreehugger Robot        found = self.execTreeParser(
1152*16467b97STreehugger Robot            grammar, 'a',
1153*16467b97STreehugger Robot            treeGrammar, 's',
1154*16467b97STreehugger Robot            "abc 34")
1155*16467b97STreehugger Robot        self.assertEqual("abc 34", found)
1156*16467b97STreehugger Robot
1157*16467b97STreehugger Robot
1158*16467b97STreehugger Robot    def testRewriteOfRuleRefRoot(self):
1159*16467b97STreehugger Robot        grammar = textwrap.dedent(
1160*16467b97STreehugger Robot            r"""
1161*16467b97STreehugger Robot            grammar T;
1162*16467b97STreehugger Robot            options {language=Python3; output=AST;}
1163*16467b97STreehugger Robot            a : ID INT INT -> ^(INT ^(ID INT));
1164*16467b97STreehugger Robot            ID : 'a'..'z'+ ;
1165*16467b97STreehugger Robot            INT : '0'..'9'+;
1166*16467b97STreehugger Robot            WS : (' '|'\n') {$channel=HIDDEN;} ;
1167*16467b97STreehugger Robot            """)
1168*16467b97STreehugger Robot
1169*16467b97STreehugger Robot        treeGrammar = textwrap.dedent(
1170*16467b97STreehugger Robot            r"""
1171*16467b97STreehugger Robot            tree grammar TP;
1172*16467b97STreehugger Robot            options {language=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;}
1173*16467b97STreehugger Robot            s : ^(a ^(ID INT)) -> a ;
1174*16467b97STreehugger Robot            a : INT ;
1175*16467b97STreehugger Robot            """)
1176*16467b97STreehugger Robot
1177*16467b97STreehugger Robot        found = self.execTreeParser(
1178*16467b97STreehugger Robot            grammar, 'a',
1179*16467b97STreehugger Robot            treeGrammar, 's',
1180*16467b97STreehugger Robot            "abc 12 34")
1181*16467b97STreehugger Robot        # emits whole tree when you ref the root since I can't know whether
1182*16467b97STreehugger Robot        # you want the children or not.  You might be returning a whole new
1183*16467b97STreehugger Robot        # tree.  Hmm...still seems weird.  oh well.
1184*16467b97STreehugger Robot        self.assertEqual("(12 (abc 34))", found)
1185*16467b97STreehugger Robot
1186*16467b97STreehugger Robot
1187*16467b97STreehugger Robot    def testRewriteOfRuleRefRootLabeled(self):
1188*16467b97STreehugger Robot        grammar = textwrap.dedent(
1189*16467b97STreehugger Robot            r"""
1190*16467b97STreehugger Robot            grammar T;
1191*16467b97STreehugger Robot            options {language=Python3; output=AST;}
1192*16467b97STreehugger Robot            a : ID INT INT -> ^(INT ^(ID INT));
1193*16467b97STreehugger Robot            ID : 'a'..'z'+ ;
1194*16467b97STreehugger Robot            INT : '0'..'9'+;
1195*16467b97STreehugger Robot            WS : (' '|'\n') {$channel=HIDDEN;} ;
1196*16467b97STreehugger Robot            """)
1197*16467b97STreehugger Robot
1198*16467b97STreehugger Robot        treeGrammar = textwrap.dedent(
1199*16467b97STreehugger Robot            r"""
1200*16467b97STreehugger Robot            tree grammar TP;
1201*16467b97STreehugger Robot            options {language=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;}
1202*16467b97STreehugger Robot            s : ^(label=a ^(ID INT)) -> a ;
1203*16467b97STreehugger Robot            a : INT ;
1204*16467b97STreehugger Robot            """)
1205*16467b97STreehugger Robot
1206*16467b97STreehugger Robot        found = self.execTreeParser(
1207*16467b97STreehugger Robot            grammar, 'a',
1208*16467b97STreehugger Robot            treeGrammar, 's',
1209*16467b97STreehugger Robot            "abc 12 34")
1210*16467b97STreehugger Robot        # emits whole tree when you ref the root since I can't know whether
1211*16467b97STreehugger Robot        # you want the children or not.  You might be returning a whole new
1212*16467b97STreehugger Robot        # tree.  Hmm...still seems weird.  oh well.
1213*16467b97STreehugger Robot        self.assertEqual("(12 (abc 34))", found)
1214*16467b97STreehugger Robot
1215*16467b97STreehugger Robot
1216*16467b97STreehugger Robot    def testRewriteOfRuleRefRootListLabeled(self):
1217*16467b97STreehugger Robot        grammar = textwrap.dedent(
1218*16467b97STreehugger Robot            r"""
1219*16467b97STreehugger Robot            grammar T;
1220*16467b97STreehugger Robot            options {language=Python3; output=AST;}
1221*16467b97STreehugger Robot            a : ID INT INT -> ^(INT ^(ID INT));
1222*16467b97STreehugger Robot            ID : 'a'..'z'+ ;
1223*16467b97STreehugger Robot            INT : '0'..'9'+;
1224*16467b97STreehugger Robot            WS : (' '|'\n') {$channel=HIDDEN;} ;
1225*16467b97STreehugger Robot            """)
1226*16467b97STreehugger Robot
1227*16467b97STreehugger Robot        treeGrammar = textwrap.dedent(
1228*16467b97STreehugger Robot            r"""
1229*16467b97STreehugger Robot            tree grammar TP;
1230*16467b97STreehugger Robot            options {language=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;}
1231*16467b97STreehugger Robot            s : ^(label+=a ^(ID INT)) -> a ;
1232*16467b97STreehugger Robot            a : INT ;
1233*16467b97STreehugger Robot            """)
1234*16467b97STreehugger Robot
1235*16467b97STreehugger Robot        found = self.execTreeParser(
1236*16467b97STreehugger Robot            grammar, 'a',
1237*16467b97STreehugger Robot            treeGrammar, 's',
1238*16467b97STreehugger Robot            "abc 12 34")
1239*16467b97STreehugger Robot        # emits whole tree when you ref the root since I can't know whether
1240*16467b97STreehugger Robot        # you want the children or not.  You might be returning a whole new
1241*16467b97STreehugger Robot        # tree.  Hmm...still seems weird.  oh well.
1242*16467b97STreehugger Robot        self.assertEqual("(12 (abc 34))", found)
1243*16467b97STreehugger Robot
1244*16467b97STreehugger Robot
1245*16467b97STreehugger Robot    def testRewriteOfRuleRefChild(self):
1246*16467b97STreehugger Robot        grammar = textwrap.dedent(
1247*16467b97STreehugger Robot            r"""
1248*16467b97STreehugger Robot            grammar T;
1249*16467b97STreehugger Robot            options {language=Python3; output=AST;}
1250*16467b97STreehugger Robot            a : ID INT -> ^(ID ^(INT INT));
1251*16467b97STreehugger Robot            ID : 'a'..'z'+ ;
1252*16467b97STreehugger Robot            INT : '0'..'9'+;
1253*16467b97STreehugger Robot            WS : (' '|'\n') {$channel=HIDDEN;} ;
1254*16467b97STreehugger Robot            """)
1255*16467b97STreehugger Robot
1256*16467b97STreehugger Robot        treeGrammar = textwrap.dedent(
1257*16467b97STreehugger Robot            r"""
1258*16467b97STreehugger Robot            tree grammar TP;
1259*16467b97STreehugger Robot            options {language=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;}
1260*16467b97STreehugger Robot            s : ^(ID a) -> a ;
1261*16467b97STreehugger Robot            a : ^(INT INT) ;
1262*16467b97STreehugger Robot            """)
1263*16467b97STreehugger Robot
1264*16467b97STreehugger Robot        found = self.execTreeParser(
1265*16467b97STreehugger Robot            grammar, 'a',
1266*16467b97STreehugger Robot            treeGrammar, 's',
1267*16467b97STreehugger Robot            "abc 34")
1268*16467b97STreehugger Robot        self.assertEqual("(34 34)", found)
1269*16467b97STreehugger Robot
1270*16467b97STreehugger Robot
1271*16467b97STreehugger Robot    def testRewriteOfRuleRefLabel(self):
1272*16467b97STreehugger Robot        grammar = textwrap.dedent(
1273*16467b97STreehugger Robot            r"""
1274*16467b97STreehugger Robot            grammar T;
1275*16467b97STreehugger Robot            options {language=Python3; output=AST;}
1276*16467b97STreehugger Robot            a : ID INT -> ^(ID ^(INT INT));
1277*16467b97STreehugger Robot            ID : 'a'..'z'+ ;
1278*16467b97STreehugger Robot            INT : '0'..'9'+;
1279*16467b97STreehugger Robot            WS : (' '|'\n') {$channel=HIDDEN;} ;
1280*16467b97STreehugger Robot            """)
1281*16467b97STreehugger Robot
1282*16467b97STreehugger Robot        treeGrammar = textwrap.dedent(
1283*16467b97STreehugger Robot            r"""
1284*16467b97STreehugger Robot            tree grammar TP;
1285*16467b97STreehugger Robot            options {language=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;}
1286*16467b97STreehugger Robot            s : ^(ID label=a) -> a ;
1287*16467b97STreehugger Robot            a : ^(INT INT) ;
1288*16467b97STreehugger Robot            """)
1289*16467b97STreehugger Robot
1290*16467b97STreehugger Robot        found = self.execTreeParser(
1291*16467b97STreehugger Robot            grammar, 'a',
1292*16467b97STreehugger Robot            treeGrammar, 's',
1293*16467b97STreehugger Robot            "abc 34")
1294*16467b97STreehugger Robot        self.assertEqual("(34 34)", found)
1295*16467b97STreehugger Robot
1296*16467b97STreehugger Robot
1297*16467b97STreehugger Robot    def testRewriteOfRuleRefListLabel(self):
1298*16467b97STreehugger Robot        grammar = textwrap.dedent(
1299*16467b97STreehugger Robot            r"""
1300*16467b97STreehugger Robot            grammar T;
1301*16467b97STreehugger Robot            options {language=Python3; output=AST;}
1302*16467b97STreehugger Robot            a : ID INT -> ^(ID ^(INT INT));
1303*16467b97STreehugger Robot            ID : 'a'..'z'+ ;
1304*16467b97STreehugger Robot            INT : '0'..'9'+;
1305*16467b97STreehugger Robot            WS : (' '|'\n') {$channel=HIDDEN;} ;
1306*16467b97STreehugger Robot            """)
1307*16467b97STreehugger Robot
1308*16467b97STreehugger Robot        treeGrammar = textwrap.dedent(
1309*16467b97STreehugger Robot            r"""
1310*16467b97STreehugger Robot            tree grammar TP;
1311*16467b97STreehugger Robot            options {language=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;}
1312*16467b97STreehugger Robot            s : ^(ID label+=a) -> a ;
1313*16467b97STreehugger Robot            a : ^(INT INT) ;
1314*16467b97STreehugger Robot            """)
1315*16467b97STreehugger Robot
1316*16467b97STreehugger Robot        found = self.execTreeParser(
1317*16467b97STreehugger Robot            grammar, 'a',
1318*16467b97STreehugger Robot            treeGrammar, 's',
1319*16467b97STreehugger Robot            "abc 34")
1320*16467b97STreehugger Robot        self.assertEqual("(34 34)", found)
1321*16467b97STreehugger Robot
1322*16467b97STreehugger Robot
1323*16467b97STreehugger Robot
1324*16467b97STreehugger Robot    def testRewriteModeWithPredicatedRewrites(self):
1325*16467b97STreehugger Robot        grammar = textwrap.dedent(
1326*16467b97STreehugger Robot            r'''
1327*16467b97STreehugger Robot            grammar T19;
1328*16467b97STreehugger Robot            options {
1329*16467b97STreehugger Robot              language=Python3;
1330*16467b97STreehugger Robot              output=AST;
1331*16467b97STreehugger Robot            }
1332*16467b97STreehugger Robot            a : ID INT -> ^(ID["root"] ^(ID INT)) | INT -> ^(ID["root"] INT) ;
1333*16467b97STreehugger Robot            ID : 'a'..'z'+ ;
1334*16467b97STreehugger Robot            INT : '0'..'9'+;
1335*16467b97STreehugger Robot            WS : (' '|'\n') {$channel=HIDDEN;} ;
1336*16467b97STreehugger Robot            ''')
1337*16467b97STreehugger Robot
1338*16467b97STreehugger Robot        treeGrammar = textwrap.dedent(
1339*16467b97STreehugger Robot            r'''
1340*16467b97STreehugger Robot            tree grammar TP19;
1341*16467b97STreehugger Robot            options {
1342*16467b97STreehugger Robot              language=Python3;
1343*16467b97STreehugger Robot              output=AST;
1344*16467b97STreehugger Robot              ASTLabelType=CommonTree;
1345*16467b97STreehugger Robot              tokenVocab=T19;
1346*16467b97STreehugger Robot              rewrite=true;
1347*16467b97STreehugger Robot            }
1348*16467b97STreehugger Robot            s : ^(ID a) { self.buf += $s.start.toStringTree() };
1349*16467b97STreehugger Robot            a : ^(ID INT) -> {True}? ^(ID["ick"] INT)
1350*16467b97STreehugger Robot                          -> INT
1351*16467b97STreehugger Robot              ;
1352*16467b97STreehugger Robot            ''')
1353*16467b97STreehugger Robot
1354*16467b97STreehugger Robot        found = self.execTreeParser(
1355*16467b97STreehugger Robot            grammar, 'a',
1356*16467b97STreehugger Robot            treeGrammar, 's',
1357*16467b97STreehugger Robot            "abc 34"
1358*16467b97STreehugger Robot            )
1359*16467b97STreehugger Robot
1360*16467b97STreehugger Robot        self.assertEqual("(root (ick 34))", found)
1361*16467b97STreehugger Robot
1362*16467b97STreehugger Robot
1363*16467b97STreehugger Robot    def testWildcardSingleNode(self):
1364*16467b97STreehugger Robot        grammar = textwrap.dedent(
1365*16467b97STreehugger Robot            r'''
1366*16467b97STreehugger Robot            grammar T;
1367*16467b97STreehugger Robot            options {
1368*16467b97STreehugger Robot                language=Python3;
1369*16467b97STreehugger Robot                output=AST;
1370*16467b97STreehugger Robot            }
1371*16467b97STreehugger Robot            a : ID INT -> ^(ID["root"] INT);
1372*16467b97STreehugger Robot            ID : 'a'..'z'+ ;
1373*16467b97STreehugger Robot            INT : '0'..'9'+;
1374*16467b97STreehugger Robot            WS : (' '|'\n') {$channel=HIDDEN;} ;
1375*16467b97STreehugger Robot            ''')
1376*16467b97STreehugger Robot
1377*16467b97STreehugger Robot        treeGrammar = textwrap.dedent(
1378*16467b97STreehugger Robot            r'''
1379*16467b97STreehugger Robot            tree grammar TP;
1380*16467b97STreehugger Robot            options {
1381*16467b97STreehugger Robot                language=Python3;
1382*16467b97STreehugger Robot                output=AST;
1383*16467b97STreehugger Robot                ASTLabelType=CommonTree;
1384*16467b97STreehugger Robot                tokenVocab=T;
1385*16467b97STreehugger Robot            }
1386*16467b97STreehugger Robot            s : ^(ID c=.) -> $c
1387*16467b97STreehugger Robot            ;
1388*16467b97STreehugger Robot            ''')
1389*16467b97STreehugger Robot
1390*16467b97STreehugger Robot        found = self.execTreeParser(
1391*16467b97STreehugger Robot            grammar, 'a',
1392*16467b97STreehugger Robot            treeGrammar, 's',
1393*16467b97STreehugger Robot            "abc 34"
1394*16467b97STreehugger Robot            )
1395*16467b97STreehugger Robot
1396*16467b97STreehugger Robot        self.assertEqual("34", found)
1397*16467b97STreehugger Robot
1398*16467b97STreehugger Robot    def testWildcardUnlabeledSingleNode(self):
1399*16467b97STreehugger Robot        grammar = textwrap.dedent(
1400*16467b97STreehugger Robot            r'''
1401*16467b97STreehugger Robot            grammar T;
1402*16467b97STreehugger Robot            options {language=Python3; output=AST;}
1403*16467b97STreehugger Robot            a : ID INT -> ^(ID INT);
1404*16467b97STreehugger Robot            ID : 'a'..'z'+ ;
1405*16467b97STreehugger Robot            INT : '0'..'9'+;
1406*16467b97STreehugger Robot            WS : (' '|'\n') {$channel=HIDDEN;} ;
1407*16467b97STreehugger Robot            ''')
1408*16467b97STreehugger Robot
1409*16467b97STreehugger Robot        treeGrammar = textwrap.dedent(
1410*16467b97STreehugger Robot            r'''
1411*16467b97STreehugger Robot            tree grammar TP;
1412*16467b97STreehugger Robot            options {language=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T;}
1413*16467b97STreehugger Robot            s : ^(ID .) -> ID
1414*16467b97STreehugger Robot              ;
1415*16467b97STreehugger Robot            ''')
1416*16467b97STreehugger Robot
1417*16467b97STreehugger Robot        found = self.execTreeParser(
1418*16467b97STreehugger Robot            grammar, 'a',
1419*16467b97STreehugger Robot            treeGrammar, 's',
1420*16467b97STreehugger Robot            "abc 34")
1421*16467b97STreehugger Robot        self.assertEqual("abc", found)
1422*16467b97STreehugger Robot
1423*16467b97STreehugger Robot
1424*16467b97STreehugger Robot    def testWildcardGrabsSubtree(self):
1425*16467b97STreehugger Robot        grammar = textwrap.dedent(
1426*16467b97STreehugger Robot            r'''
1427*16467b97STreehugger Robot            grammar T;
1428*16467b97STreehugger Robot            options {language=Python3; output=AST;}
1429*16467b97STreehugger Robot            a : ID x=INT y=INT z=INT -> ^(ID[\"root\"] ^($x $y $z));
1430*16467b97STreehugger Robot            ID : 'a'..'z'+ ;
1431*16467b97STreehugger Robot            INT : '0'..'9'+;
1432*16467b97STreehugger Robot            WS : (' '|'\n') {$channel=HIDDEN;} ;
1433*16467b97STreehugger Robot            ''')
1434*16467b97STreehugger Robot
1435*16467b97STreehugger Robot        treeGrammar = textwrap.dedent(
1436*16467b97STreehugger Robot            r'''
1437*16467b97STreehugger Robot            tree grammar TP;
1438*16467b97STreehugger Robot            options {language=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T;}
1439*16467b97STreehugger Robot            s : ^(ID c=.) -> $c
1440*16467b97STreehugger Robot              ;
1441*16467b97STreehugger Robot            ''')
1442*16467b97STreehugger Robot
1443*16467b97STreehugger Robot        found = self.execTreeParser(
1444*16467b97STreehugger Robot            grammar, 'a',
1445*16467b97STreehugger Robot            treeGrammar, 's',
1446*16467b97STreehugger Robot            "abc 1 2 3")
1447*16467b97STreehugger Robot        self.assertEqual("(1 2 3)", found)
1448*16467b97STreehugger Robot
1449*16467b97STreehugger Robot
1450*16467b97STreehugger Robot    def testWildcardGrabsSubtree2(self):
1451*16467b97STreehugger Robot        grammar = textwrap.dedent(
1452*16467b97STreehugger Robot            r'''
1453*16467b97STreehugger Robot            grammar T;
1454*16467b97STreehugger Robot            options {language=Python3; output=AST;}
1455*16467b97STreehugger Robot            a : ID x=INT y=INT z=INT -> ID ^($x $y $z);
1456*16467b97STreehugger Robot            ID : 'a'..'z'+ ;
1457*16467b97STreehugger Robot            INT : '0'..'9'+;
1458*16467b97STreehugger Robot            WS : (' '|'\n') {$channel=HIDDEN;} ;
1459*16467b97STreehugger Robot            ''')
1460*16467b97STreehugger Robot
1461*16467b97STreehugger Robot        treeGrammar = textwrap.dedent(
1462*16467b97STreehugger Robot            r'''
1463*16467b97STreehugger Robot            tree grammar TP;
1464*16467b97STreehugger Robot            options {language=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T;}
1465*16467b97STreehugger Robot            s : ID c=. -> $c
1466*16467b97STreehugger Robot              ;
1467*16467b97STreehugger Robot            ''')
1468*16467b97STreehugger Robot
1469*16467b97STreehugger Robot        found = self.execTreeParser(
1470*16467b97STreehugger Robot            grammar, 'a',
1471*16467b97STreehugger Robot            treeGrammar, 's',
1472*16467b97STreehugger Robot            "abc 1 2 3")
1473*16467b97STreehugger Robot        self.assertEqual("(1 2 3)", found)
1474*16467b97STreehugger Robot
1475*16467b97STreehugger Robot
1476*16467b97STreehugger Robot    def testWildcardListLabel(self):
1477*16467b97STreehugger Robot        grammar = textwrap.dedent(
1478*16467b97STreehugger Robot            r'''
1479*16467b97STreehugger Robot            grammar T;
1480*16467b97STreehugger Robot            options {language=Python3; output=AST;}
1481*16467b97STreehugger Robot            a : INT INT INT ;
1482*16467b97STreehugger Robot            ID : 'a'..'z'+ ;
1483*16467b97STreehugger Robot            INT : '0'..'9'+;
1484*16467b97STreehugger Robot            WS : (' '|'\n') {$channel=HIDDEN;} ;
1485*16467b97STreehugger Robot            ''')
1486*16467b97STreehugger Robot
1487*16467b97STreehugger Robot        treeGrammar = textwrap.dedent(
1488*16467b97STreehugger Robot            r'''
1489*16467b97STreehugger Robot            tree grammar TP;
1490*16467b97STreehugger Robot            options {language=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T;}
1491*16467b97STreehugger Robot            s : (c+=.)+ -> $c+
1492*16467b97STreehugger Robot              ;
1493*16467b97STreehugger Robot            ''')
1494*16467b97STreehugger Robot
1495*16467b97STreehugger Robot        found = self.execTreeParser(
1496*16467b97STreehugger Robot            grammar, 'a',
1497*16467b97STreehugger Robot            treeGrammar, 's',
1498*16467b97STreehugger Robot            "1 2 3")
1499*16467b97STreehugger Robot        self.assertEqual("1 2 3", found)
1500*16467b97STreehugger Robot
1501*16467b97STreehugger Robot
1502*16467b97STreehugger Robot    def testWildcardListLabel2(self):
1503*16467b97STreehugger Robot        grammar = textwrap.dedent(
1504*16467b97STreehugger Robot            r'''
1505*16467b97STreehugger Robot            grammar T;
1506*16467b97STreehugger Robot            options {language=Python3; output=AST; ASTLabelType=CommonTree;}
1507*16467b97STreehugger Robot            a  : x=INT y=INT z=INT -> ^($x ^($y $z) ^($y $z));
1508*16467b97STreehugger Robot            ID : 'a'..'z'+ ;
1509*16467b97STreehugger Robot            INT : '0'..'9'+;
1510*16467b97STreehugger Robot            WS : (' '|'\n') {$channel=HIDDEN;} ;
1511*16467b97STreehugger Robot            ''')
1512*16467b97STreehugger Robot
1513*16467b97STreehugger Robot        treeGrammar = textwrap.dedent(
1514*16467b97STreehugger Robot            r'''
1515*16467b97STreehugger Robot            tree grammar TP;
1516*16467b97STreehugger Robot            options {language=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;}
1517*16467b97STreehugger Robot            s : ^(INT (c+=.)+) -> $c+
1518*16467b97STreehugger Robot              ;
1519*16467b97STreehugger Robot            ''')
1520*16467b97STreehugger Robot
1521*16467b97STreehugger Robot        found = self.execTreeParser(
1522*16467b97STreehugger Robot            grammar, 'a',
1523*16467b97STreehugger Robot            treeGrammar, 's',
1524*16467b97STreehugger Robot            "1 2 3")
1525*16467b97STreehugger Robot        self.assertEqual("(2 3) (2 3)", found)
1526*16467b97STreehugger Robot
1527*16467b97STreehugger Robot
1528*16467b97STreehugger Robot    def testRuleResultAsRoot(self):
1529*16467b97STreehugger Robot        grammar = textwrap.dedent(
1530*16467b97STreehugger Robot            r'''
1531*16467b97STreehugger Robot            grammar T;
1532*16467b97STreehugger Robot            options {
1533*16467b97STreehugger Robot                language=Python3;
1534*16467b97STreehugger Robot                output=AST;
1535*16467b97STreehugger Robot            }
1536*16467b97STreehugger Robot            a : ID '=' INT -> ^('=' ID INT);
1537*16467b97STreehugger Robot            ID : 'a'..'z'+ ;
1538*16467b97STreehugger Robot            INT : '0'..'9'+;
1539*16467b97STreehugger Robot            COLON : ':' ;
1540*16467b97STreehugger Robot            WS : (' '|'\n') {$channel=HIDDEN;} ;
1541*16467b97STreehugger Robot            ''')
1542*16467b97STreehugger Robot
1543*16467b97STreehugger Robot        treeGrammar = textwrap.dedent(
1544*16467b97STreehugger Robot            r'''
1545*16467b97STreehugger Robot            tree grammar TP;
1546*16467b97STreehugger Robot            options {
1547*16467b97STreehugger Robot                language=Python3;
1548*16467b97STreehugger Robot                output=AST;
1549*16467b97STreehugger Robot                rewrite=true;
1550*16467b97STreehugger Robot                ASTLabelType=CommonTree;
1551*16467b97STreehugger Robot                tokenVocab=T;
1552*16467b97STreehugger Robot            }
1553*16467b97STreehugger Robot            a : ^(eq e1=ID e2=.) -> ^(eq $e2 $e1) ;
1554*16467b97STreehugger Robot            eq : '=' | ':' {pass} ;  // bug in set match, doesn't add to tree!! booh. force nonset.
1555*16467b97STreehugger Robot            ''')
1556*16467b97STreehugger Robot
1557*16467b97STreehugger Robot        found = self.execTreeParser(
1558*16467b97STreehugger Robot            grammar, 'a',
1559*16467b97STreehugger Robot            treeGrammar, 'a',
1560*16467b97STreehugger Robot            "abc = 34")
1561*16467b97STreehugger Robot        self.assertEqual("(= 34 abc)", found)
1562*16467b97STreehugger Robot
1563*16467b97STreehugger Robot
1564*16467b97STreehugger Robotif __name__ == '__main__':
1565*16467b97STreehugger Robot    unittest.main()
1566