1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport unittest
2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport re
3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport textwrap
4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport antlr3
5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport testbase
6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# Left-recursion resolution is not yet enabled in the tool.
9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# class TestLeftRecursion(testbase.ANTLRTest):
11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#     def parserClass(self, base):
12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#         class TParser(base):
13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             def __init__(self, *args, **kwargs):
14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#                 base.__init__(self, *args, **kwargs)
15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#                 self._output = ""
17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             def capture(self, t):
20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#                 self._output += str(t)
21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             def recover(self, input, re):
24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#                 # no error recovery yet, just crash!
25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#                 raise
26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#         return TParser
28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#     def execParser(self, grammar, grammarEntry, input):
31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#         lexerCls, parserCls = self.compileInlineGrammar(grammar)
32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#         cStream = antlr3.StringStream(input)
34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#         lexer = lexerCls(cStream)
35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#         tStream = antlr3.CommonTokenStream(lexer)
36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#         parser = parserCls(tStream)
37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#         getattr(parser, grammarEntry)()
38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#         return parser._output
39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#     def runTests(self, grammar, tests, grammarEntry):
42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#         lexerCls, parserCls = self.compileInlineGrammar(grammar)
43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#         build_ast = re.search(r'output\s*=\s*AST', grammar)
45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#         for input, expecting in tests:
47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             cStream = antlr3.StringStream(input)
48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             lexer = lexerCls(cStream)
49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             tStream = antlr3.CommonTokenStream(lexer)
50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             parser = parserCls(tStream)
51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             r = getattr(parser, grammarEntry)()
52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             found = parser._output
53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             if build_ast:
54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#               found += r.tree.toStringTree()
55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             self.assertEquals(
57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#                 expecting, found,
58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#                 "%r != %r (for input %r)" % (expecting, found, input))
59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#     def testSimple(self):
62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#         grammar = textwrap.dedent(
63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             r"""
64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             grammar T;
65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             options {
66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#                 language=Python;
67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             }
68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             s : a { self.capture($a.text) } ;
69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             a : a ID
70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#               | ID
71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#               ;
72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             ID : 'a'..'z'+ ;
73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             WS : (' '|'\n') {self.skip()} ;
74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             """)
75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#         found = self.execParser(grammar, 's', 'a b c')
77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#         expecting = "abc"
78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#         self.assertEquals(expecting, found)
79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#     def testSemPred(self):
82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#         grammar = textwrap.dedent(
83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             r"""
84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             grammar T;
85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             options {
86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#                 language=Python;
87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             }
88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             s : a { self.capture($a.text) } ;
89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             a : a {True}? ID
90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#               | ID
91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#               ;
92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             ID : 'a'..'z'+ ;
93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             WS : (' '|'\n') {self.skip()} ;
94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             """)
95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#         found = self.execParser(grammar, "s", "a b c")
97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#         expecting = "abc"
98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#         self.assertEquals(expecting, found)
99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#     def testTernaryExpr(self):
101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#         grammar = textwrap.dedent(
102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             r"""
103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             grammar T;
104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             options {
105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#                 language=Python;
106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#                 output=AST;
107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             }
108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             e : e '*'^ e
109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#               | e '+'^ e
110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#               | e '?'<assoc=right>^ e ':'! e
111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#               | e '='<assoc=right>^ e
112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#               | ID
113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#               ;
114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             ID : 'a'..'z'+ ;
115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             WS : (' '|'\n') {self.skip()} ;
116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             """)
117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#         tests = [
119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             ("a", "a"),
120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             ("a+b", "(+ a b)"),
121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             ("a*b", "(* a b)"),
122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             ("a?b:c", "(? a b c)"),
123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             ("a=b=c", "(= a (= b c))"),
124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             ("a?b+c:d", "(? a (+ b c) d)"),
125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             ("a?b=c:d", "(? a (= b c) d)"),
126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             ("a? b?c:d : e", "(? a (? b c d) e)"),
127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             ("a?b: c?d:e", "(? a b (? c d e))"),
128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             ]
129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#         self.runTests(grammar, tests, "e")
130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#     def testDeclarationsUsingASTOperators(self):
133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#         grammar = textwrap.dedent(
134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             r"""
135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             grammar T;
136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             options {
137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#                 language=Python;
138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#                 output=AST;
139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             }
140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             declarator
141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#                     : declarator '['^ e ']'!
142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#                     | declarator '['^ ']'!
143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#                     | declarator '('^ ')'!
144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#                     | '*'^ declarator // binds less tight than suffixes
145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#                     | '('! declarator ')'!
146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#                     | ID
147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#                     ;
148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             e : INT ;
149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             ID : 'a'..'z'+ ;
150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             INT : '0'..'9'+ ;
151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             WS : (' '|'\n') {self.skip()} ;
152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             """)
153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#         tests = [
155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             ("a", "a"),
156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             ("*a", "(* a)"),
157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             ("**a", "(* (* a))"),
158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             ("a[3]", "([ a 3)"),
159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             ("b[]", "([ b)"),
160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             ("(a)", "a"),
161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             ("a[]()", "(( ([ a))"),
162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             ("a[][]", "([ ([ a))"),
163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             ("*a[]", "(* ([ a))"),
164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             ("(*a)[]", "([ (* a))"),
165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             ]
166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#         self.runTests(grammar, tests, "declarator")
167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#     def testDeclarationsUsingRewriteOperators(self):
170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#         grammar = textwrap.dedent(
171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             r"""
172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             grammar T;
173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             options {
174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#                 language=Python;
175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#                 output=AST;
176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             }
177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             declarator
178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#                     : declarator '[' e ']' -> ^('[' declarator e)
179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#                     | declarator '[' ']' -> ^('[' declarator)
180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#                     | declarator '(' ')' -> ^('(' declarator)
181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#                     | '*' declarator -> ^('*' declarator)  // binds less tight than suffixes
182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#                     | '(' declarator ')' -> declarator
183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#                     | ID -> ID
184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#                     ;
185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             e : INT ;
186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             ID : 'a'..'z'+ ;
187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             INT : '0'..'9'+ ;
188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             WS : (' '|'\n') {self.skip()} ;
189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             """)
190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#         tests = [
192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             ("a", "a"),
193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             ("*a", "(* a)"),
194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             ("**a", "(* (* a))"),
195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             ("a[3]", "([ a 3)"),
196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             ("b[]", "([ b)"),
197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             ("(a)", "a"),
198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             ("a[]()", "(( ([ a))"),
199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             ("a[][]", "([ ([ a))"),
200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             ("*a[]", "(* ([ a))"),
201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             ("(*a)[]", "([ (* a))"),
202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             ]
203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#         self.runTests(grammar, tests, "declarator")
204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#     def testExpressionsUsingASTOperators(self):
207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#         grammar = textwrap.dedent(
208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             r"""
209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             grammar T;
210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             options {
211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#                 language=Python;
212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#                 output=AST;
213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             }
214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             e : e '.'^ ID
215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#               | e '.'^ 'this'
216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#               | '-'^ e
217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#               | e '*'^ e
218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#               | e ('+'^|'-'^) e
219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#               | INT
220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#               | ID
221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#               ;
222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             ID : 'a'..'z'+ ;
223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             INT : '0'..'9'+ ;
224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             WS : (' '|'\n') {self.skip()} ;
225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             """)
226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#         tests = [
228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             ("a", "a"),
229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             ("1", "1"),
230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             ("a+1", "(+ a 1)"),
231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             ("a*1", "(* a 1)"),
232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             ("a.b", "(. a b)"),
233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             ("a.this", "(. a this)"),
234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             ("a-b+c", "(+ (- a b) c)"),
235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             ("a+b*c", "(+ a (* b c))"),
236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             ("a.b+1", "(+ (. a b) 1)"),
237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             ("-a", "(- a)"),
238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             ("-a+b", "(+ (- a) b)"),
239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             ("-a.b", "(- (. a b))"),
240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             ]
241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#         self.runTests(grammar, tests, "e")
242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#     @testbase.broken(
245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#         "Grammar compilation returns errors", testbase.GrammarCompileError)
246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#     def testExpressionsUsingRewriteOperators(self):
247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#         grammar = textwrap.dedent(
248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             r"""
249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             grammar T;
250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             options {
251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#                 language=Python;
252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#                 output=AST;
253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             }
254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             e : e '.' ID                   -> ^('.' e ID)
255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#               | e '.' 'this'               -> ^('.' e 'this')
256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#               | '-' e                      -> ^('-' e)
257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#               | e '*' b=e                  -> ^('*' e $b)
258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#               | e (op='+'|op='-') b=e      -> ^($op e $b)
259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#               | INT                        -> INT
260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#               | ID                         -> ID
261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#               ;
262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             ID : 'a'..'z'+ ;
263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             INT : '0'..'9'+ ;
264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             WS : (' '|'\n') {self.skip()} ;
265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             """)
266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#         tests = [
268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             ("a", "a"),
269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             ("1", "1"),
270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             ("a+1", "(+ a 1)"),
271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             ("a*1", "(* a 1)"),
272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             ("a.b", "(. a b)"),
273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             ("a.this", "(. a this)"),
274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             ("a+b*c", "(+ a (* b c))"),
275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             ("a.b+1", "(+ (. a b) 1)"),
276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             ("-a", "(- a)"),
277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             ("-a+b", "(+ (- a) b)"),
278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             ("-a.b", "(- (. a b))"),
279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             ]
280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#         self.runTests(grammar, tests, "e")
281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#     def testExpressionAssociativity(self):
284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#         grammar = textwrap.dedent(
285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             r"""
286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             grammar T;
287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             options {
288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#                 language=Python;
289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#                 output=AST;
290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             }
291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             e
292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#               : e '.'^ ID
293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#               | '-'^ e
294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#               | e '^'<assoc=right>^ e
295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#               | e '*'^ e
296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#               | e ('+'^|'-'^) e
297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#               | e ('='<assoc=right>^ |'+='<assoc=right>^) e
298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#               | INT
299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#               | ID
300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#               ;
301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             ID : 'a'..'z'+ ;
302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             INT : '0'..'9'+ ;
303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             WS : (' '|'\n') {self.skip()} ;
304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             """)
305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#         tests = [
307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             ("a", "a"),
308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             ("1", "1"),
309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             ("a+1", "(+ a 1)"),
310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             ("a*1", "(* a 1)"),
311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             ("a.b", "(. a b)"),
312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             ("a-b+c", "(+ (- a b) c)"),
313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             ("a+b*c", "(+ a (* b c))"),
314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             ("a.b+1", "(+ (. a b) 1)"),
315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             ("-a", "(- a)"),
316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             ("-a+b", "(+ (- a) b)"),
317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             ("-a.b", "(- (. a b))"),
318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             ("a^b^c", "(^ a (^ b c))"),
319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             ("a=b=c", "(= a (= b c))"),
320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             ("a=b=c+d.e", "(= a (= b (+ c (. d e))))"),
321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             ]
322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#         self.runTests(grammar, tests, "e")
323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#     def testJavaExpressions(self):
326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#       grammar = textwrap.dedent(
327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             r"""
328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             grammar T;
329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             options {
330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#                 language=Python;
331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#                 output=AST;
332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             }
333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             expressionList
334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#                 :   e (','! e)*
335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#                 ;
336324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             e   :   '('! e ')'!
337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#                 |   'this'
338324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#                 |   'super'
339324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#                 |   INT
340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#                 |   ID
341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#                 |   type '.'^ 'class'
342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#                 |   e '.'^ ID
343324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#                 |   e '.'^ 'this'
344324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#                 |   e '.'^ 'super' '('^ expressionList? ')'!
345324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#                 |   e '.'^ 'new'^ ID '('! expressionList? ')'!
346324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#                 |       'new'^ type ( '(' expressionList? ')'! | (options {k=1;}:'[' e ']'!)+) // ugly; simplified
347324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#                 |   e '['^ e ']'!
348324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#                 |   '('^ type ')'! e
349324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#                 |   e ('++'^ | '--'^)
350324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#                 |   e '('^ expressionList? ')'!
351324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#                 |   ('+'^|'-'^|'++'^|'--'^) e
352324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#                 |   ('~'^|'!'^) e
353324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#                 |   e ('*'^|'/'^|'%'^) e
354324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#                 |   e ('+'^|'-'^) e
355324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#                 |   e ('<'^ '<' | '>'^ '>' '>' | '>'^ '>') e
356324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#                 |   e ('<='^ | '>='^ | '>'^ | '<'^) e
357324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#                 |   e 'instanceof'^ e
358324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#                 |   e ('=='^ | '!='^) e
359324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#                 |   e '&'^ e
360324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#                 |   e '^'<assoc=right>^ e
361324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#                 |   e '|'^ e
362324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#                 |   e '&&'^ e
363324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#                 |   e '||'^ e
364324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#                 |   e '?' e ':' e
365324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#                 |   e ('='<assoc=right>^
366324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#                       |'+='<assoc=right>^
367324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#                       |'-='<assoc=right>^
368324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#                       |'*='<assoc=right>^
369324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#                       |'/='<assoc=right>^
370324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#                       |'&='<assoc=right>^
371324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#                       |'|='<assoc=right>^
372324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#                       |'^='<assoc=right>^
373324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#                       |'>>='<assoc=right>^
374324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#                       |'>>>='<assoc=right>^
375324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#                       |'<<='<assoc=right>^
376324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#                       |'%='<assoc=right>^) e
377324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#                 ;
378324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             type: ID
379324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#                 | ID '['^ ']'!
380324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#                 | 'int'
381324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#                 | 'int' '['^ ']'!
382324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#                 ;
383324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             ID : ('a'..'z'|'A'..'Z'|'_'|'$')+;
384324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             INT : '0'..'9'+ ;
385324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             WS : (' '|'\n') {self.skip()} ;
386324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             """)
387324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
388324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#       tests = [
389324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#           ("a", "a"),
390324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#           ("1", "1"),
391324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#           ("a+1", "(+ a 1)"),
392324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#           ("a*1", "(* a 1)"),
393324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#           ("a.b", "(. a b)"),
394324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#           ("a-b+c", "(+ (- a b) c)"),
395324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#           ("a+b*c", "(+ a (* b c))"),
396324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#           ("a.b+1", "(+ (. a b) 1)"),
397324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#           ("-a", "(- a)"),
398324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#           ("-a+b", "(+ (- a) b)"),
399324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#           ("-a.b", "(- (. a b))"),
400324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#           ("a^b^c", "(^ a (^ b c))"),
401324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#           ("a=b=c", "(= a (= b c))"),
402324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#           ("a=b=c+d.e", "(= a (= b (+ c (. d e))))"),
403324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#           ("a|b&c", "(| a (& b c))"),
404324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#           ("(a|b)&c", "(& (| a b) c)"),
405324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#           ("a > b", "(> a b)"),
406324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#           ("a >> b", "(> a b)"),  # text is from one token
407324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#           ("a < b", "(< a b)"),
408324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#           ("(T)x", "(( T x)"),
409324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#           ("new A().b", "(. (new A () b)"),
410324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#           ("(T)t.f()", "(( (( T (. t f)))"),
411324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#           ("a.f(x)==T.c", "(== (( (. a f) x) (. T c))"),
412324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#           ("a.f().g(x,1)", "(( (. (( (. a f)) g) x 1)"),
413324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#           ("new T[((n-1) * x) + 1]", "(new T [ (+ (* (- n 1) x) 1))"),
414324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#           ]
415324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#       self.runTests(grammar, tests, "e")
416324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
417324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
418324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#     def testReturnValueAndActions(self):
419324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#         grammar = textwrap.dedent(
420324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             r"""
421324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             grammar T;
422324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             options {
423324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#                 language=Python;
424324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             }
425324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             s : e { self.capture($e.v) } ;
426324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             e returns [v, ignored]
427324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#               : e '*' b=e {$v *= $b.v;}
428324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#               | e '+' b=e {$v += $b.v;}
429324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#               | INT {$v = int($INT.text);}
430324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#               ;
431324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             INT : '0'..'9'+ ;
432324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             WS : (' '|'\n') {self.skip()} ;
433324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             """)
434324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
435324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#         tests = [
436324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             ("4", "4"),
437324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             ("1+2", "3")
438324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             ]
439324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#         self.runTests(grammar, tests, "s")
440324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
441324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
442324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#     def testReturnValueAndActionsAndASTs(self):
443324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#         grammar = textwrap.dedent(
444324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             r"""
445324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             grammar T;
446324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             options {
447324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#                 language=Python;
448324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#                 output=AST;
449324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             }
450324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             s : e { self.capture("v=\%s, " \% $e.v) } ;
451324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             e returns [v, ignored]
452324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#               : e '*'^ b=e {$v *= $b.v;}
453324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#               | e '+'^ b=e {$v += $b.v;}
454324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#               | INT {$v = int($INT.text);}
455324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#               ;
456324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             INT : '0'..'9'+ ;
457324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             WS : (' '|'\n') {self.skip()} ;
458324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             """)
459324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
460324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#         tests = [
461324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             ("4", "v=4, 4"),
462324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             ("1+2", "v=3, (+ 1 2)"),
463324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#             ]
464324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#         self.runTests(grammar, tests, "s")
465324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
466324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
467324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif __name__ == '__main__':
468324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    unittest.main()
469