1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport unittest
2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport textwrap
3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport antlr3
4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport antlr3.tree
5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport testbase
6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass T(testbase.ANTLRTest):
8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def walkerClass(self, base):
9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        class TWalker(base):
10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            def __init__(self, *args, **kwargs):
11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                base.__init__(self, *args, **kwargs)
12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                self._output = ""
14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            def capture(self, t):
17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                self._output += t
18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            def traceIn(self, ruleName, ruleIndex):
21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                self.traces.append('>'+ruleName)
22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            def traceOut(self, ruleName, ruleIndex):
25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                self.traces.append('<'+ruleName)
26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            def recover(self, input, re):
29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                # no error recovery yet, just crash!
30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                raise
31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return TWalker
33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def execTreeParser(self, grammar, grammarEntry, treeGrammar, treeEntry, input):
36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        lexerCls, parserCls = self.compileInlineGrammar(grammar)
37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        walkerCls = self.compileInlineGrammar(treeGrammar)
38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        cStream = antlr3.StringStream(input)
40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        lexer = lexerCls(cStream)
41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tStream = antlr3.CommonTokenStream(lexer)
42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        parser = parserCls(tStream)
43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r = getattr(parser, grammarEntry)()
44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        nodes = antlr3.tree.CommonTreeNodeStream(r.tree)
45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        nodes.setTokenStream(tStream)
46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        walker = walkerCls(nodes)
47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        getattr(walker, treeEntry)()
48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return walker._output
50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testFlatList(self):
53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar = textwrap.dedent(
54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r'''grammar T;
55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        options {
56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            language=Python;
57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            output=AST;
58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        a : ID INT;
60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ID : 'a'..'z'+ ;
61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        INT : '0'..'9'+;
62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        WS : (' '|'\n') {$channel=HIDDEN;} ;
63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ''')
64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        treeGrammar = textwrap.dedent(
66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r'''tree grammar TP;
67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        options {
68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            language=Python;
69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ASTLabelType=CommonTree;
70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        a : ID INT
72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            {self.capture("\%s, \%s" \% ($ID, $INT))}
73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          ;
74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ''')
75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.execTreeParser(
77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar, 'a',
78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            treeGrammar, 'a',
79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "abc 34"
80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            )
81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual("abc, 34", found)
83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testSimpleTree(self):
87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar = textwrap.dedent(
88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            r'''grammar T;
89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            options {
90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                language=Python;
91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                output=AST;
92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            a : ID INT -> ^(ID INT);
94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ID : 'a'..'z'+ ;
95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            INT : '0'..'9'+;
96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            WS : (' '|'\\n') {$channel=HIDDEN;} ;
97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ''')
98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        treeGrammar = textwrap.dedent(
100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            r'''tree grammar TP;
101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            options {
102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                language=Python;
103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                ASTLabelType=CommonTree;
104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            a : ^(ID INT)
106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                {self.capture(str($ID)+", "+str($INT))}
107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver              ;
108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ''')
109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.execTreeParser(
111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar, 'a',
112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            treeGrammar, 'a',
113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "abc 34"
114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            )
115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual("abc, 34", found)
117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testFlatVsTreeDecision(self):
120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar = textwrap.dedent(
121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            r'''grammar T;
122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            options {
123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                language=Python;
124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                output=AST;
125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            a : b c ;
127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            b : ID INT -> ^(ID INT);
128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            c : ID INT;
129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ID : 'a'..'z'+ ;
130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            INT : '0'..'9'+;
131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            WS : (' '|'\\n') {$channel=HIDDEN;} ;
132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ''')
133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        treeGrammar = textwrap.dedent(
135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            r'''tree grammar TP;
136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            options {
137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                language=Python;
138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                ASTLabelType=CommonTree;
139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            a : b b ;
141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            b : ID INT    {self.capture(str($ID)+" "+str($INT)+'\n')}
142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver              | ^(ID INT) {self.capture("^("+str($ID)+" "+str($INT)+')');}
143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver              ;
144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ''')
145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.execTreeParser(
147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar, 'a',
148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            treeGrammar, 'a',
149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "a 1 b 2"
150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            )
151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual("^(a 1)b 2\n", found)
152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testFlatVsTreeDecision2(self):
155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar = textwrap.dedent(
156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            r"""grammar T;
157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            options {
158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                language=Python;
159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                output=AST;
160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            a : b c ;
162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            b : ID INT+ -> ^(ID INT+);
163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            c : ID INT+;
164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ID : 'a'..'z'+ ;
165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            INT : '0'..'9'+;
166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            WS : (' '|'\n') {$channel=HIDDEN;} ;
167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            """)
168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        treeGrammar = textwrap.dedent(
170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            r'''tree grammar TP;
171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            options {
172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                language=Python;
173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                ASTLabelType=CommonTree;
174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            a : b b ;
176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            b : ID INT+    {self.capture(str($ID)+" "+str($INT)+"\n")}
177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver              | ^(x=ID (y=INT)+) {self.capture("^("+str($x)+' '+str($y)+')')}
178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver              ;
179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ''')
180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.execTreeParser(
182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar, 'a',
183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            treeGrammar, 'a',
184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "a 1 2 3 b 4 5"
185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            )
186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual("^(a 3)b 5\n", found)
187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testCyclicDFALookahead(self):
190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar = textwrap.dedent(
191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            r'''grammar T;
192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            options {
193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                language=Python;
194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                output=AST;
195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            a : ID INT+ PERIOD;
197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ID : 'a'..'z'+ ;
198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            INT : '0'..'9'+;
199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            SEMI : ';' ;
200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            PERIOD : '.' ;
201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            WS : (' '|'\n') {$channel=HIDDEN;} ;
202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ''')
203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        treeGrammar = textwrap.dedent(
205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            r'''tree grammar TP;
206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            options {
207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                language=Python;
208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                ASTLabelType=CommonTree;
209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            a : ID INT+ PERIOD {self.capture("alt 1")}
211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver              | ID INT+ SEMI   {self.capture("alt 2")}
212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver              ;
213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ''')
214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.execTreeParser(
216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar, 'a',
217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            treeGrammar, 'a',
218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "a 1 2 3."
219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            )
220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual("alt 1", found)
221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver##     def testTemplateOutput(self):
224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver## 		String grammar =
225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver## 			"grammar T;\n" +
226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver## 			"options {output=AST;}\n" +
227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver## 			"a : ID INT;\n" +
228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver## 			"ID : 'a'..'z'+ ;\n" +
229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver## 			"INT : '0'..'9'+;\n" +
230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver## 			"WS : (' '|'\\n') {$channel=HIDDEN;} ;\n";
231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver## 		String treeGrammar =
233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver## 			"tree grammar TP;\n" +
234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver## 			"options {output=template; ASTLabelType=CommonTree;}\n" +
235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver## 			"s : a {System.out.println($a.st);};\n" +
236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver## 			"a : ID INT -> {new StringTemplate($INT.text)}\n" +
237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver## 			"  ;\n";
238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver## 		String found = execTreeParser("T.g", grammar, "TParser", "TP.g",
240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver## 				    treeGrammar, "TP", "TLexer", "a", "s", "abc 34");
241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver## 		assertEquals("34\n", found);
242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver## 	}
243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testNullableChildList(self):
246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar = textwrap.dedent(
247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            r'''grammar T;
248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            options {
249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                language=Python;
250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                output=AST;
251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            a : ID INT? -> ^(ID INT?);
253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ID : 'a'..'z'+ ;
254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            INT : '0'..'9'+;
255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            WS : (' '|'\\n') {$channel=HIDDEN;} ;
256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ''')
257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        treeGrammar = textwrap.dedent(
259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            r'''tree grammar TP;
260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            options {
261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                language=Python;
262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                ASTLabelType=CommonTree;
263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            a : ^(ID INT?)
265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                {self.capture(str($ID))}
266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver              ;
267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ''')
268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.execTreeParser(
270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar, 'a',
271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            treeGrammar, 'a',
272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "abc"
273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            )
274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual("abc", found)
275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testNullableChildList2(self):
278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar = textwrap.dedent(
279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            r'''grammar T;
280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            options {
281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                language=Python;
282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                output=AST;
283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            a : ID INT? SEMI -> ^(ID INT?) SEMI ;
285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ID : 'a'..'z'+ ;
286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            INT : '0'..'9'+;
287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            SEMI : ';' ;
288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            WS : (' '|'\n') {$channel=HIDDEN;} ;
289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ''')
290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        treeGrammar = textwrap.dedent(
292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            r'''tree grammar TP;
293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            options {
294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                language=Python;
295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                ASTLabelType=CommonTree;
296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            a : ^(ID INT?) SEMI
298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                {self.capture(str($ID))}
299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver              ;
300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ''')
301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.execTreeParser(
303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar, 'a',
304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            treeGrammar, 'a',
305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "abc;"
306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            )
307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual("abc", found)
308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testNullableChildList3(self):
311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar = textwrap.dedent(
312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            r'''grammar T;
313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            options {
314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                language=Python;
315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                output=AST;
316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            a : x=ID INT? (y=ID)? SEMI -> ^($x INT? $y?) SEMI ;
318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ID : 'a'..'z'+ ;
319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            INT : '0'..'9'+;
320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            SEMI : ';' ;
321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            WS : (' '|'\\n') {$channel=HIDDEN;} ;
322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ''')
323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        treeGrammar = textwrap.dedent(
325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            r'''tree grammar TP;
326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            options {
327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                language=Python;
328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                ASTLabelType=CommonTree;
329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            a : ^(ID INT? b) SEMI
331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                {self.capture(str($ID)+", "+str($b.text))}
332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver              ;
333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            b : ID? ;
334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ''')
335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
336324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.execTreeParser(
337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar, 'a',
338324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            treeGrammar, 'a',
339324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "abc def;"
340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            )
341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnlessEqual("abc, def", found)
342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
343324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
344324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testActionsAfterRoot(self):
345324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar = textwrap.dedent(
346324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            r'''grammar T;
347324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            options {
348324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                language=Python;
349324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                output=AST;
350324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
351324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            a : x=ID INT? SEMI -> ^($x INT?) ;
352324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ID : 'a'..'z'+ ;
353324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            INT : '0'..'9'+;
354324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            SEMI : ';' ;
355324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            WS : (' '|'\n') {$channel=HIDDEN;} ;
356324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ''')
357324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
358324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        treeGrammar = textwrap.dedent(
359324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            r'''tree grammar TP;
360324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            options {
361324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                language=Python;
362324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                ASTLabelType=CommonTree;
363324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
364324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            a @init {x=0} : ^(ID {x=1} {x=2} INT?)
365324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                {self.capture(str($ID)+", "+str(x))}
366324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver              ;
367324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ''')
368324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
369324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.execTreeParser(
370324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar, 'a',
371324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            treeGrammar, 'a',
372324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "abc;"
373324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            )
374324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.failUnless("abc, 2\n", found)
375324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
376324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
377324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testWildcardLookahead(self):
378324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar = textwrap.dedent(
379324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            r'''
380324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar T;
381324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            options {language=Python; output=AST;}
382324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            a : ID '+'^ INT;
383324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ID : 'a'..'z'+ ;
384324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            INT : '0'..'9'+;
385324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            SEMI : ';' ;
386324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            PERIOD : '.' ;
387324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            WS : (' '|'\n') {$channel=HIDDEN;} ;
388324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ''')
389324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
390324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        treeGrammar = textwrap.dedent(
391324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            r'''
392324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            tree grammar TP;
393324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            options {language=Python; tokenVocab=T; ASTLabelType=CommonTree;}
394324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            a : ^('+' . INT) { self.capture("alt 1") }
395324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver              ;
396324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ''')
397324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
398324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.execTreeParser(
399324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar, 'a',
400324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            treeGrammar, 'a',
401324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "a + 2")
402324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals("alt 1", found)
403324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
404324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
405324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testWildcardLookahead2(self):
406324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar = textwrap.dedent(
407324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            r'''
408324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar T;
409324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            options {language=Python; output=AST;}
410324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            a : ID '+'^ INT;
411324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ID : 'a'..'z'+ ;
412324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            INT : '0'..'9'+;
413324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            SEMI : ';' ;
414324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            PERIOD : '.' ;
415324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            WS : (' '|'\n') {$channel=HIDDEN;} ;
416324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ''')
417324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
418324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        treeGrammar = textwrap.dedent(
419324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            r'''
420324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            tree grammar TP;
421324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            options {language=Python; tokenVocab=T; ASTLabelType=CommonTree;}
422324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            a : ^('+' . INT) { self.capture("alt 1") }
423324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver              | ^('+' . .)   { self.capture("alt 2") }
424324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver              ;
425324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ''')
426324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
427324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # AMBIG upon '+' DOWN INT UP etc.. but so what.
428324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
429324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.execTreeParser(
430324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar, 'a',
431324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            treeGrammar, 'a',
432324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "a + 2")
433324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals("alt 1", found)
434324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
435324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
436324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testWildcardLookahead3(self):
437324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar = textwrap.dedent(
438324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            r'''
439324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar T;
440324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            options {language=Python; output=AST;}
441324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            a : ID '+'^ INT;
442324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ID : 'a'..'z'+ ;
443324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            INT : '0'..'9'+;
444324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            SEMI : ';' ;
445324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            PERIOD : '.' ;
446324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            WS : (' '|'\n') {$channel=HIDDEN;} ;
447324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ''')
448324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
449324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        treeGrammar = textwrap.dedent(
450324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            r'''
451324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            tree grammar TP;
452324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            options {language=Python; tokenVocab=T; ASTLabelType=CommonTree;}
453324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            a : ^('+' ID INT) { self.capture("alt 1") }
454324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver              | ^('+' . .)   { self.capture("alt 2") }
455324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver              ;
456324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ''')
457324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
458324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # AMBIG upon '+' DOWN INT UP etc.. but so what.
459324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
460324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.execTreeParser(
461324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar, 'a',
462324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            treeGrammar, 'a',
463324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "a + 2")
464324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals("alt 1", found)
465324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
466324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
467324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testWildcardPlusLookahead(self):
468324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar = textwrap.dedent(
469324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            r'''
470324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar T;
471324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            options {language=Python; output=AST;}
472324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            a : ID '+'^ INT;
473324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ID : 'a'..'z'+ ;
474324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            INT : '0'..'9'+;
475324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            SEMI : ';' ;
476324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            PERIOD : '.' ;
477324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            WS : (' '|'\n') {$channel=HIDDEN;} ;
478324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ''')
479324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
480324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        treeGrammar = textwrap.dedent(
481324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            r'''
482324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            tree grammar TP;
483324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            options {language=Python; tokenVocab=T; ASTLabelType=CommonTree;}
484324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            a : ^('+' INT INT ) { self.capture("alt 1") }
485324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver              | ^('+' .+)   { self.capture("alt 2") }
486324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver              ;
487324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ''')
488324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
489324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # AMBIG upon '+' DOWN INT UP etc.. but so what.
490324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
491324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.execTreeParser(
492324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar, 'a',
493324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            treeGrammar, 'a',
494324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "a + 2")
495324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals("alt 2", found)
496324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
497324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
498324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif __name__ == '__main__':
499324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    unittest.main()
500