1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport unittest
2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport textwrap
3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport antlr3
4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport antlr3.tree
5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport testbase
6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport sys
7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass TestAutoAST(testbase.ANTLRTest):
9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def parserClass(self, base):
10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        class TParser(base):
11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            def __init__(self, *args, **kwargs):
12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                base.__init__(self, *args, **kwargs)
13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                self._errors = []
15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                self._output = ""
16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            def capture(self, t):
19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                self._output += t
20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            def traceIn(self, ruleName, ruleIndex):
23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                self.traces.append('>'+ruleName)
24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            def traceOut(self, ruleName, ruleIndex):
27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                self.traces.append('<'+ruleName)
28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            def emitErrorMessage(self, msg):
31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                self._errors.append(msg)
32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return TParser
35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def lexerClass(self, base):
38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        class TLexer(base):
39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            def __init__(self, *args, **kwargs):
40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                base.__init__(self, *args, **kwargs)
41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                self._output = ""
43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            def capture(self, t):
46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                self._output += t
47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            def traceIn(self, ruleName, ruleIndex):
50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                self.traces.append('>'+ruleName)
51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            def traceOut(self, ruleName, ruleIndex):
54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                self.traces.append('<'+ruleName)
55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            def recover(self, input, re):
58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                # no error recovery yet, just crash!
59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                raise
60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return TLexer
62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def execParser(self, grammar, grammarEntry, input, expectErrors=False):
65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        lexerCls, parserCls = self.compileInlineGrammar(grammar)
66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        cStream = antlr3.StringStream(input)
68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        lexer = lexerCls(cStream)
69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tStream = antlr3.CommonTokenStream(lexer)
70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        parser = parserCls(tStream)
71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r = getattr(parser, grammarEntry)()
72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if not expectErrors:
74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            self.assertEquals(len(parser._errors), 0, parser._errors)
75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        result = ""
77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if r is not None:
79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            if hasattr(r, 'result'):
80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                result += r.result
81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            if r.tree is not None:
83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                result += r.tree.toStringTree()
84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if not expectErrors:
86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            return result
87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        else:
89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            return result, parser._errors
90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def execTreeParser(self, grammar, grammarEntry, treeGrammar, treeEntry, input):
93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        lexerCls, parserCls = self.compileInlineGrammar(grammar)
94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        walkerCls = self.compileInlineGrammar(treeGrammar)
95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        cStream = antlr3.StringStream(input)
97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        lexer = lexerCls(cStream)
98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tStream = antlr3.CommonTokenStream(lexer)
99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        parser = parserCls(tStream)
100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r = getattr(parser, grammarEntry)()
101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        nodes = antlr3.tree.CommonTreeNodeStream(r.tree)
102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        nodes.setTokenStream(tStream)
103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        walker = walkerCls(nodes)
104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r = getattr(walker, treeEntry)()
105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if r is not None:
107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            return r.tree.toStringTree()
108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return ""
110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testTokenList(self):
113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar = textwrap.dedent(
114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            r'''
115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar foo;
116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            options {language=Python;output=AST;}
117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            a : ID INT ;
118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ID : 'a'..'z'+ ;
119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            INT : '0'..'9'+;
120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            WS : (' '|'\n') {$channel=HIDDEN;};
121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ''')
122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.execParser(grammar, "a", "abc 34")
124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals("abc 34", found);
125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testTokenListInSingleAltBlock(self):
128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar = textwrap.dedent(
129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            r'''
130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar foo;
131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            options {language=Python;output=AST;}
132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            a : (ID INT) ;
133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ID : 'a'..'z'+ ;
134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            INT : '0'..'9'+;
135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            WS : (' '|'\n') {$channel=HIDDEN;} ;
136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ''')
137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.execParser(grammar,"a", "abc 34")
139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals("abc 34", found)
140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testSimpleRootAtOuterLevel(self):
143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar = textwrap.dedent(
144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            r'''
145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar foo;
146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            options {language=Python;output=AST;}
147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            a : ID^ INT ;
148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ID : 'a'..'z'+ ;
149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            INT : '0'..'9'+;
150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            WS : (' '|'\n') {$channel=HIDDEN;} ;
151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ''')
152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.execParser(grammar, "a", "abc 34")
154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals("(abc 34)", found)
155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testSimpleRootAtOuterLevelReverse(self):
158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar = textwrap.dedent(
159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            r'''
160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar T;
161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            options {language=Python;output=AST;}
162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            a : INT ID^ ;
163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ID : 'a'..'z'+ ;
164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            INT : '0'..'9'+;
165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            WS : (' '|'\n') {$channel=HIDDEN;} ;
166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ''')
167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.execParser(grammar, "a", "34 abc")
169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals("(abc 34)", found)
170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testBang(self):
173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar = textwrap.dedent(
174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            r'''
175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar T;
176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            options {language=Python;output=AST;}
177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            a : ID INT! ID! INT ;
178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ID : 'a'..'z'+ ;
179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            INT : '0'..'9'+;
180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            WS : (' '|'\n') {$channel=HIDDEN;} ;
181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ''')
182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.execParser(grammar, "a", "abc 34 dag 4532")
184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals("abc 4532", found)
185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testOptionalThenRoot(self):
188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar = textwrap.dedent(
189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            r'''
190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar T;
191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            options {language=Python;output=AST;}
192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            a : ( ID INT )? ID^ ;
193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ID : 'a'..'z'+ ;
194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            INT : '0'..'9'+;
195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            WS : (' '|'\n') {$channel=HIDDEN;} ;
196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ''')
197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.execParser(grammar, "a", "a 1 b")
199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals("(b a 1)", found)
200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testLabeledStringRoot(self):
203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar = textwrap.dedent(
204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            r'''
205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar T;
206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            options {language=Python;output=AST;}
207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            a : v='void'^ ID ';' ;
208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ID : 'a'..'z'+ ;
209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            INT : '0'..'9'+;
210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            WS : (' '|'\n') {$channel=HIDDEN;} ;
211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ''')
212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.execParser(grammar, "a", "void foo;")
214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals("(void foo ;)", found)
215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testWildcard(self):
218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar = textwrap.dedent(
219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            r'''
220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar T;
221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            options {language=Python;output=AST;}
222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            a : v='void'^ . ';' ;
223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ID : 'a'..'z'+ ;
224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            INT : '0'..'9'+;
225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            WS : (' '|'\n') {$channel=HIDDEN;} ;
226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ''')
227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.execParser(grammar, "a", "void foo;")
229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals("(void foo ;)", found)
230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testWildcardRoot(self):
233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar = textwrap.dedent(
234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            r'''
235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar T;
236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            options {language=Python;output=AST;}
237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            a : v='void' .^ ';' ;
238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ID : 'a'..'z'+ ;
239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            INT : '0'..'9'+;
240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            WS : (' '|'\n') {$channel=HIDDEN;} ;
241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ''')
242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.execParser(grammar, "a", "void foo;")
244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals("(foo void ;)", found)
245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testWildcardRootWithLabel(self):
248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar = textwrap.dedent(
249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            r'''
250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar T;
251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            options {language=Python;output=AST;}
252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            a : v='void' x=.^ ';' ;
253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ID : 'a'..'z'+ ;
254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            INT : '0'..'9'+;
255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            WS : (' '|'\n') {$channel=HIDDEN;} ;
256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ''')
257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.execParser(grammar, "a", "void foo;")
259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals("(foo void ;)", found)
260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testWildcardRootWithListLabel(self):
263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar = textwrap.dedent(
264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            r'''
265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar T;
266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            options {language=Python;output=AST;}
267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            a : v='void' x=.^ ';' ;
268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ID : 'a'..'z'+ ;
269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            INT : '0'..'9'+;
270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            WS : (' '|'\n') {$channel=HIDDEN;} ;
271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ''')
272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.execParser(grammar, "a", "void foo;")
274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals("(foo void ;)", found)
275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testWildcardBangWithListLabel(self):
278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar = textwrap.dedent(
279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            r'''
280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar T;
281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            options {language=Python;output=AST;}
282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            a : v='void' x=.! ';' ;
283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ID : 'a'..'z'+ ;
284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            INT : '0'..'9'+;
285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            WS : (' '|'\n') {$channel=HIDDEN;} ;
286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ''')
287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.execParser(grammar, "a", "void foo;")
289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals("void ;", found)
290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testRootRoot(self):
293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar = textwrap.dedent(
294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            r'''
295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar T;
296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            options {language=Python;output=AST;}
297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            a : ID^ INT^ ID ;
298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ID : 'a'..'z'+ ;
299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            INT : '0'..'9'+;
300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            WS : (' '|'\n') {$channel=HIDDEN;} ;
301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ''')
302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.execParser(grammar, "a", "a 34 c")
304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals("(34 a c)", found)
305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testRootRoot2(self):
308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar = textwrap.dedent(
309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            r'''
310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar T;
311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            options {language=Python;output=AST;}
312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            a : ID INT^ ID^ ;
313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ID : 'a'..'z'+ ;
314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            INT : '0'..'9'+;
315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            WS : (' '|'\n') {$channel=HIDDEN;} ;
316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ''')
317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.execParser(grammar, "a", "a 34 c")
319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals("(c (34 a))", found)
320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testRootThenRootInLoop(self):
323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar = textwrap.dedent(
324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            r'''
325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar T;
326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            options {language=Python;output=AST;}
327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            a : ID^ (INT '*'^ ID)+ ;
328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ID  : 'a'..'z'+ ;
329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            INT : '0'..'9'+;
330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            WS : (' '|'\n') {$channel=HIDDEN;} ;
331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ''')
332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.execParser(grammar, "a", "a 34 * b 9 * c")
334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals("(* (* (a 34) b 9) c)", found)
335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
336324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testNestedSubrule(self):
338324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar = textwrap.dedent(
339324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            r'''
340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar T;
341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            options {language=Python;output=AST;}
342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            a : 'void' (({pass}ID|INT) ID | 'null' ) ';' ;
343324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ID : 'a'..'z'+ ;
344324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            INT : '0'..'9'+;
345324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            WS : (' '|'\n') {$channel=HIDDEN;} ;
346324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ''')
347324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
348324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.execParser(grammar, "a", "void a b;")
349324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals("void a b ;", found)
350324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
351324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
352324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testInvokeRule(self):
353324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar = textwrap.dedent(
354324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            r'''
355324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar T;
356324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            options {language=Python;output=AST;}
357324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            a  : type ID ;
358324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            type : {pass}'int' | 'float' ;
359324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ID : 'a'..'z'+ ;
360324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            INT : '0'..'9'+;
361324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            WS : (' '|'\n') {$channel=HIDDEN;} ;
362324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ''')
363324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
364324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.execParser(grammar, "a", "int a")
365324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals("int a", found)
366324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
367324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
368324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testInvokeRuleAsRoot(self):
369324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar = textwrap.dedent(
370324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            r'''
371324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar T;
372324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            options {language=Python;output=AST;}
373324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            a  : type^ ID ;
374324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            type : {pass}'int' | 'float' ;
375324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ID : 'a'..'z'+ ;
376324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            INT : '0'..'9'+;
377324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            WS : (' '|'\n') {$channel=HIDDEN;} ;
378324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ''')
379324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
380324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.execParser(grammar, "a", "int a")
381324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals("(int a)", found)
382324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
383324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
384324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testInvokeRuleAsRootWithLabel(self):
385324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar = textwrap.dedent(
386324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            r'''
387324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar T;
388324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            options {language=Python;output=AST;}
389324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            a  : x=type^ ID ;
390324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            type : {pass}'int' | 'float' ;
391324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ID : 'a'..'z'+ ;
392324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            INT : '0'..'9'+;
393324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            WS : (' '|'\n') {$channel=HIDDEN;} ;
394324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ''')
395324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
396324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.execParser(grammar, "a", "int a")
397324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals("(int a)", found)
398324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
399324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
400324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testInvokeRuleAsRootWithListLabel(self):
401324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar = textwrap.dedent(
402324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            r'''
403324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar T;
404324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            options {language=Python;output=AST;}
405324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            a  : x+=type^ ID ;
406324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            type : {pass}'int' | 'float' ;
407324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ID : 'a'..'z'+ ;
408324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            INT : '0'..'9'+;
409324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            WS : (' '|'\n') {$channel=HIDDEN;} ;
410324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ''')
411324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
412324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.execParser(grammar, "a", "int a")
413324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals("(int a)", found)
414324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
415324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
416324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testRuleRootInLoop(self):
417324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar = textwrap.dedent(
418324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            r'''
419324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar T;
420324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            options {language=Python;output=AST;}
421324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            a : ID ('+'^ ID)* ;
422324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ID : 'a'..'z'+ ;
423324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            INT : '0'..'9'+;
424324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            WS : (' '|'\n') {$channel=HIDDEN;} ;
425324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ''')
426324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
427324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.execParser(grammar, "a", "a+b+c+d")
428324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals("(+ (+ (+ a b) c) d)", found)
429324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
430324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
431324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testRuleInvocationRuleRootInLoop(self):
432324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar = textwrap.dedent(
433324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            r'''
434324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar T;
435324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            options {language=Python;output=AST;}
436324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            a : ID (op^ ID)* ;
437324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            op : {pass}'+' | '-' ;
438324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ID : 'a'..'z'+ ;
439324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            INT : '0'..'9'+;
440324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            WS : (' '|'\n') {$channel=HIDDEN;} ;
441324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ''')
442324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
443324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.execParser(grammar, "a", "a+b+c-d")
444324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals("(- (+ (+ a b) c) d)", found)
445324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
446324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
447324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testTailRecursion(self):
448324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar = textwrap.dedent(
449324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            r'''
450324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar T;
451324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            options {language=Python;output=AST;}
452324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            s : a ;
453324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            a : atom ('exp'^ a)? ;
454324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            atom : INT ;
455324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ID : 'a'..'z'+ ;
456324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            INT : '0'..'9'+;
457324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            WS : (' '|'\n') {$channel=HIDDEN;} ;
458324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ''')
459324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
460324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.execParser(grammar, "s", "3 exp 4 exp 5")
461324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals("(exp 3 (exp 4 5))", found)
462324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
463324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
464324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testSet(self):
465324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar = textwrap.dedent(
466324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            r'''
467324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar T;
468324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            options {language=Python;output=AST;}
469324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            a : ID|INT ;
470324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ID : 'a'..'z'+ ;
471324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            INT : '0'..'9'+;
472324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            WS : (' '|'\n') {$channel=HIDDEN;} ;
473324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ''')
474324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
475324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.execParser(grammar, "a", "abc")
476324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals("abc", found)
477324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
478324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
479324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testSetRoot(self):
480324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar = textwrap.dedent(
481324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        r'''
482324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar T;
483324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            options {language=Python;output=AST;}
484324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            a : ('+' | '-')^ ID ;
485324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ID : 'a'..'z'+ ;
486324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            INT : '0'..'9'+;
487324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            WS : (' '|'\n') {$channel=HIDDEN;} ;
488324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ''')
489324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
490324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.execParser(grammar, "a", "+abc")
491324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals("(+ abc)", found)
492324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
493324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
494324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @testbase.broken(
495324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        "FAILS until antlr.g rebuilt in v3", testbase.GrammarCompileError)
496324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testSetRootWithLabel(self):
497324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar = textwrap.dedent(
498324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            r'''
499324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar T;
500324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            options {language=Python;output=AST;}
501324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            a : x=('+' | '-')^ ID ;
502324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ID : 'a'..'z'+ ;
503324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            INT : '0'..'9'+;
504324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            WS : (' '|'\n') {$channel=HIDDEN;} ;
505324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ''')
506324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
507324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.execParser(grammar, "a", "+abc")
508324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals("(+ abc)", found)
509324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
510324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
511324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testSetAsRuleRootInLoop(self):
512324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar = textwrap.dedent(
513324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            r'''
514324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar T;
515324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            options {language=Python;output=AST;}
516324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            a : ID (('+'|'-')^ ID)* ;
517324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ID : 'a'..'z'+ ;
518324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            INT : '0'..'9'+;
519324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            WS : (' '|'\n') {$channel=HIDDEN;} ;
520324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ''')
521324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
522324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.execParser(grammar, "a", "a+b-c")
523324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals("(- (+ a b) c)", found)
524324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
525324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
526324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testNotSet(self):
527324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar = textwrap.dedent(
528324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            r'''
529324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar T;
530324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            options {language=Python;output=AST;}
531324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            a : ~ID '+' INT ;
532324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ID : 'a'..'z'+ ;
533324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            INT : '0'..'9'+;
534324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            WS : (' '|'\n') {$channel=HIDDEN;} ;
535324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ''')
536324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
537324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.execParser(grammar, "a", "34+2")
538324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals("34 + 2", found)
539324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
540324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
541324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testNotSetWithLabel(self):
542324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar = textwrap.dedent(
543324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            r'''
544324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar T;
545324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            options {language=Python;output=AST;}
546324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            a : x=~ID '+' INT ;
547324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ID : 'a'..'z'+ ;
548324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            INT : '0'..'9'+;
549324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            WS : (' '|'\n') {$channel=HIDDEN;} ;
550324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ''')
551324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
552324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.execParser(grammar, "a", "34+2")
553324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals("34 + 2", found)
554324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
555324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
556324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testNotSetWithListLabel(self):
557324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar = textwrap.dedent(
558324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            r'''
559324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar T;
560324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            options {language=Python;output=AST;}
561324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            a : x=~ID '+' INT ;
562324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ID : 'a'..'z'+ ;
563324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            INT : '0'..'9'+;
564324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            WS : (' '|'\n') {$channel=HIDDEN;} ;
565324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ''')
566324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
567324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.execParser(grammar, "a", "34+2")
568324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals("34 + 2", found)
569324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
570324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
571324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testNotSetRoot(self):
572324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar = textwrap.dedent(
573324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            r'''
574324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar T;
575324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            options {language=Python;output=AST;}
576324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            a : ~'+'^ INT ;
577324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ID : 'a'..'z'+ ;
578324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            INT : '0'..'9'+;
579324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            WS : (' '|'\n') {$channel=HIDDEN;} ;
580324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ''')
581324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
582324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.execParser(grammar, "a", "34 55")
583324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals("(34 55)", found)
584324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
585324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
586324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testNotSetRootWithLabel(self):
587324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar = textwrap.dedent(
588324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            r'''
589324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar T;
590324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            options {language=Python;output=AST;}
591324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            a : ~'+'^ INT ;
592324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ID : 'a'..'z'+ ;
593324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            INT : '0'..'9'+;
594324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            WS : (' '|'\n') {$channel=HIDDEN;} ;
595324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ''')
596324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
597324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.execParser(grammar, "a", "34 55")
598324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals("(34 55)", found)
599324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
600324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
601324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testNotSetRootWithListLabel(self):
602324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar = textwrap.dedent(
603324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            r'''
604324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar T;
605324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            options {language=Python;output=AST;}
606324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            a : ~'+'^ INT ;
607324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ID : 'a'..'z'+ ;
608324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            INT : '0'..'9'+;
609324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            WS : (' '|'\n') {$channel=HIDDEN;} ;
610324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ''')
611324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
612324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.execParser(grammar, "a", "34 55")
613324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals("(34 55)", found)
614324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
615324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
616324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testNotSetRuleRootInLoop(self):
617324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar = textwrap.dedent(
618324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            r'''
619324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar T;
620324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            options {language=Python;output=AST;}
621324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            a : INT (~INT^ INT)* ;
622324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            blort : '+' ;
623324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ID : 'a'..'z'+ ;
624324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            INT : '0'..'9'+;
625324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            WS : (' '|'\n') {$channel=HIDDEN;} ;
626324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ''')
627324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
628324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.execParser(grammar, "a", "3+4+5")
629324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals("(+ (+ 3 4) 5)", found)
630324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
631324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
632324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @testbase.broken("FIXME: What happened to the semicolon?", AssertionError)
633324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testTokenLabelReuse(self):
634324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # check for compilation problem due to multiple defines
635324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar = textwrap.dedent(
636324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            r'''
637324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar T;
638324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            options {language=Python;output=AST;}
639324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            a returns [result] : id=ID id=ID {$result = "2nd id="+$id.text+";";} ;
640324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ID : 'a'..'z'+ ;
641324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            INT : '0'..'9'+;
642324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            WS : (' '|'\n') {$channel=HIDDEN;} ;
643324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ''')
644324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
645324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.execParser(grammar, "a", "a b")
646324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals("2nd id=b;a b", found)
647324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
648324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
649324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testTokenLabelReuse2(self):
650324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # check for compilation problem due to multiple defines
651324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar = textwrap.dedent(
652324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            r'''
653324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar T;
654324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            options {language=Python;output=AST;}
655324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            a returns [result]: id=ID id=ID^ {$result = "2nd id="+$id.text+',';} ;
656324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ID : 'a'..'z'+ ;
657324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            INT : '0'..'9'+;
658324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            WS : (' '|'\n') {$channel=HIDDEN;} ;
659324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ''')
660324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
661324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.execParser(grammar, "a", "a b")
662324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals("2nd id=b,(b a)", found)
663324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
664324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
665324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testTokenListLabelReuse(self):
666324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # check for compilation problem due to multiple defines
667324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # make sure ids has both ID tokens
668324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar = textwrap.dedent(
669324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            r'''
670324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar T;
671324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            options {language=Python;output=AST;}
672324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            a returns [result] : ids+=ID ids+=ID {$result = "id list=["+",".join([t.text for t in $ids])+'],';} ;
673324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ID : 'a'..'z'+ ;
674324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            INT : '0'..'9'+;
675324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            WS : (' '|'\n') {$channel=HIDDEN;} ;
676324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ''')
677324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
678324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.execParser(grammar, "a", "a b")
679324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = "id list=[a,b],a b"
680324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals(expecting, found)
681324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
682324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
683324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testTokenListLabelReuse2(self):
684324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # check for compilation problem due to multiple defines
685324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # make sure ids has both ID tokens
686324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar = textwrap.dedent(
687324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            r'''
688324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar T;
689324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            options {language=Python;output=AST;}
690324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            a returns [result] : ids+=ID^ ids+=ID {$result = "id list=["+",".join([t.text for t in $ids])+'],';} ;
691324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ID : 'a'..'z'+ ;
692324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            INT : '0'..'9'+;
693324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            WS : (' '|'\n') {$channel=HIDDEN;} ;
694324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ''')
695324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
696324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.execParser(grammar, "a", "a b")
697324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        expecting = "id list=[a,b],(a b)"
698324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals(expecting, found)
699324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
700324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
701324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testTokenListLabelRuleRoot(self):
702324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar = textwrap.dedent(
703324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            r'''
704324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar T;
705324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            options {language=Python;output=AST;}
706324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            a : id+=ID^ ;
707324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ID : 'a'..'z'+ ;
708324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            INT : '0'..'9'+;
709324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            WS : (' '|'\n') {$channel=HIDDEN;} ;
710324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ''')
711324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
712324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.execParser(grammar, "a", "a")
713324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals("a", found)
714324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
715324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
716324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testTokenListLabelBang(self):
717324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar = textwrap.dedent(
718324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            r'''
719324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar T;
720324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            options {language=Python;output=AST;}
721324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            a : id+=ID! ;
722324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ID : 'a'..'z'+ ;
723324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            INT : '0'..'9'+;
724324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            WS : (' '|'\n') {$channel=HIDDEN;} ;
725324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ''')
726324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
727324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.execParser(grammar, "a", "a")
728324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals("", found)
729324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
730324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
731324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testRuleListLabel(self):
732324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar = textwrap.dedent(
733324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            r'''
734324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar T;
735324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            options {language=Python;output=AST;}
736324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            a returns [result]: x+=b x+=b {
737324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            t=$x[1]
738324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            $result = "2nd x="+t.toStringTree()+',';
739324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            };
740324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            b : ID;
741324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ID : 'a'..'z'+ ;
742324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            INT : '0'..'9'+;
743324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            WS : (' '|'\n') {$channel=HIDDEN;} ;
744324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ''')
745324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
746324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.execParser(grammar, "a", "a b")
747324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals("2nd x=b,a b", found)
748324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
749324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
750324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testRuleListLabelRuleRoot(self):
751324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar = textwrap.dedent(
752324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            r'''
753324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar T;
754324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            options {language=Python;output=AST;}
755324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            a returns [result] : ( x+=b^ )+ {
756324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            $result = "x="+$x[1].toStringTree()+',';
757324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            } ;
758324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            b : ID;
759324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ID : 'a'..'z'+ ;
760324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            INT : '0'..'9'+;
761324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            WS : (' '|'\n') {$channel=HIDDEN;} ;
762324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ''')
763324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
764324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.execParser(grammar, "a", "a b")
765324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals("x=(b a),(b a)", found)
766324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
767324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
768324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testRuleListLabelBang(self):
769324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar = textwrap.dedent(
770324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            r'''
771324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar T;
772324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            options {language=Python;output=AST;}
773324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            a returns [result] : x+=b! x+=b {
774324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            $result = "1st x="+$x[0].toStringTree()+',';
775324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            } ;
776324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            b : ID;
777324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ID : 'a'..'z'+ ;
778324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            INT : '0'..'9'+;
779324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            WS : (' '|'\n') {$channel=HIDDEN;} ;
780324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ''')
781324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
782324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.execParser(grammar, "a", "a b")
783324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals("1st x=a,b", found)
784324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
785324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
786324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testComplicatedMelange(self):
787324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # check for compilation problem
788324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar = textwrap.dedent(
789324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            r'''
790324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar T;
791324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            options {language=Python;output=AST;}
792324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            a : A b=B b=B c+=C c+=C D {s = $D.text} ;
793324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            A : 'a' ;
794324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            B : 'b' ;
795324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            C : 'c' ;
796324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            D : 'd' ;
797324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            WS : (' '|'\n') {$channel=HIDDEN;} ;
798324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ''')
799324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
800324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.execParser(grammar, "a", "a b b c c d")
801324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals("a b b c c d", found)
802324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
803324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
804324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testReturnValueWithAST(self):
805324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar = textwrap.dedent(
806324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            r'''
807324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar foo;
808324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            options {language=Python;output=AST;}
809324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            a returns [result] : ID b { $result = str($b.i) + '\n';} ;
810324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            b returns [i] : INT {$i=int($INT.text);} ;
811324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ID : 'a'..'z'+ ;
812324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            INT : '0'..'9'+;
813324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            WS : (' '|'\n') {$channel=HIDDEN;} ;
814324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ''')
815324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
816324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.execParser(grammar, "a", "abc 34")
817324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals("34\nabc 34", found)
818324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
819324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
820324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testSetLoop(self):
821324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar = textwrap.dedent(
822324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            r'''
823324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar T;
824324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            options { language=Python;output=AST; }
825324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            r : (INT|ID)+ ;
826324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ID : 'a'..'z' + ;
827324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            INT : '0'..'9' +;
828324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            WS: (' ' | '\n' | '\\t')+ {$channel = HIDDEN;};
829324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ''')
830324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
831324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found = self.execParser(grammar, "r", "abc 34 d")
832324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals("abc 34 d", found)
833324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
834324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
835324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testExtraTokenInSimpleDecl(self):
836324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar = textwrap.dedent(
837324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            r'''
838324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar foo;
839324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            options {language=Python;output=AST;}
840324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            decl : type^ ID '='! INT ';'! ;
841324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            type : 'int' | 'float' ;
842324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ID : 'a'..'z'+ ;
843324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            INT : '0'..'9'+;
844324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            WS : (' '|'\n') {$channel=HIDDEN;} ;
845324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ''')
846324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
847324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found, errors = self.execParser(grammar, "decl", "int 34 x=1;",
848324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                                        expectErrors=True)
849324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals(["line 1:4 extraneous input u'34' expecting ID"],
850324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                          errors)
851324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals("(int x 1)", found) # tree gets correct x and 1 tokens
852324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
853324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
854324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testMissingIDInSimpleDecl(self):
855324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar = textwrap.dedent(
856324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            r'''
857324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar foo;
858324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            options {language=Python;output=AST;}
859324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            tokens {EXPR;}
860324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            decl : type^ ID '='! INT ';'! ;
861324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            type : 'int' | 'float' ;
862324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ID : 'a'..'z'+ ;
863324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            INT : '0'..'9'+;
864324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            WS : (' '|'\n') {$channel=HIDDEN;} ;
865324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ''')
866324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
867324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found, errors = self.execParser(grammar, "decl", "int =1;",
868324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                                        expectErrors=True)
869324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals(["line 1:4 missing ID at u'='"], errors)
870324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals("(int <missing ID> 1)", found) # tree gets invented ID token
871324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
872324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
873324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testMissingSetInSimpleDecl(self):
874324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar = textwrap.dedent(
875324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            r'''
876324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar foo;
877324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            options {language=Python;output=AST;}
878324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            tokens {EXPR;}
879324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            decl : type^ ID '='! INT ';'! ;
880324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            type : 'int' | 'float' ;
881324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ID : 'a'..'z'+ ;
882324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            INT : '0'..'9'+;
883324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            WS : (' '|'\n') {$channel=HIDDEN;} ;
884324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ''')
885324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
886324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found, errors = self.execParser(grammar, "decl", "x=1;",
887324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                                        expectErrors=True)
888324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals(["line 1:0 mismatched input u'x' expecting set None"], errors)
889324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals("(<error: x> x 1)", found) # tree gets invented ID token
890324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
891324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
892324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testMissingTokenGivesErrorNode(self):
893324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar = textwrap.dedent(
894324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            r'''
895324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar foo;
896324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            options {language=Python;output=AST;}
897324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            a : ID INT ; // follow is EOF
898324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ID : 'a'..'z'+ ;
899324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            INT : '0'..'9'+;
900324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            WS : (' '|'\n') {$channel=HIDDEN;} ;
901324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ''')
902324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
903324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found, errors = self.execParser(grammar, "a", "abc", expectErrors=True)
904324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals(["line 1:3 missing INT at '<EOF>'"], errors)
905324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals("abc <missing INT>", found)
906324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
907324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
908324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testMissingTokenGivesErrorNodeInInvokedRule(self):
909324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar = textwrap.dedent(
910324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            r'''
911324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar foo;
912324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            options {language=Python;output=AST;}
913324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            a : b ;
914324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            b : ID INT ; // follow should see EOF
915324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ID : 'a'..'z'+ ;
916324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            INT : '0'..'9'+;
917324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            WS : (' '|'\n') {$channel=HIDDEN;} ;
918324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ''')
919324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
920324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found, errors = self.execParser(grammar, "a", "abc", expectErrors=True)
921324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals(["line 1:3 mismatched input '<EOF>' expecting INT"], errors)
922324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals("<mismatched token: <EOF>, resync=abc>", found)
923324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
924324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
925324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testExtraTokenGivesErrorNode(self):
926324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar = textwrap.dedent(
927324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            r'''
928324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar foo;
929324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            options {language=Python;output=AST;}
930324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            a : b c ;
931324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            b : ID ;
932324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            c : INT ;
933324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ID : 'a'..'z'+ ;
934324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            INT : '0'..'9'+;
935324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            WS : (' '|'\n') {$channel=HIDDEN;} ;
936324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ''')
937324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
938324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found, errors = self.execParser(grammar, "a", "abc ick 34",
939324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                                        expectErrors=True)
940324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals(["line 1:4 extraneous input u'ick' expecting INT"],
941324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                          errors)
942324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals("abc 34", found)
943324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
944324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
945324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testMissingFirstTokenGivesErrorNode(self):
946324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar = textwrap.dedent(
947324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            r'''
948324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar foo;
949324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            options {language=Python;output=AST;}
950324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            a : ID INT ;
951324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ID : 'a'..'z'+ ;
952324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            INT : '0'..'9'+;
953324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            WS : (' '|'\n') {$channel=HIDDEN;} ;
954324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ''')
955324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
956324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found, errors = self.execParser(grammar, "a", "34", expectErrors=True)
957324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals(["line 1:0 missing ID at u'34'"], errors)
958324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals("<missing ID> 34", found)
959324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
960324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
961324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testMissingFirstTokenGivesErrorNode2(self):
962324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar = textwrap.dedent(
963324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            r'''
964324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar foo;
965324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            options {language=Python;output=AST;}
966324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            a : b c ;
967324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            b : ID ;
968324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            c : INT ;
969324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ID : 'a'..'z'+ ;
970324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            INT : '0'..'9'+;
971324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            WS : (' '|'\n') {$channel=HIDDEN;} ;
972324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ''')
973324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
974324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found, errors = self.execParser(grammar, "a", "34", expectErrors=True)
975324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
976324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # finds an error at the first token, 34, and re-syncs.
977324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # re-synchronizing does not consume a token because 34 follows
978324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        # ref to rule b (start of c). It then matches 34 in c.
979324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals(["line 1:0 missing ID at u'34'"], errors)
980324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals("<missing ID> 34", found)
981324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
982324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
983324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    def testNoViableAltGivesErrorNode(self):
984324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        grammar = textwrap.dedent(
985324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            r'''
986324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            grammar foo;
987324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            options {language=Python;output=AST;}
988324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            a : b | c ;
989324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            b : ID ;
990324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            c : INT ;
991324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ID : 'a'..'z'+ ;
992324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            S : '*' ;
993324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            INT : '0'..'9'+;
994324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            WS : (' '|'\n') {$channel=HIDDEN;} ;
995324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ''')
996324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
997324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        found, errors = self.execParser(grammar, "a", "*", expectErrors=True)
998324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals(["line 1:0 no viable alternative at input u'*'"],
999324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                          errors)
1000324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        self.assertEquals("<unexpected: [@0,0:0=u'*',<6>,1:0], resync=*>",
1001324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                          found)
1002324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1003324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1004324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif __name__ == '__main__':
1005324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    unittest.main()
1006