xref: /aosp_15_r20/external/antlr/runtime/JavaScript/tests/functional/t058rewriteAST.html (revision 16467b971bd3e2009fad32dd79016f2c7e421deb)
1*16467b97STreehugger Robot<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
2*16467b97STreehugger Robot<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
3*16467b97STreehugger Robot<head>
4*16467b97STreehugger Robot<meta http-equiv="content-type" content="text/html;charset=utf-8" />
5*16467b97STreehugger Robot<title>t058rewriteAST</title>
6*16467b97STreehugger Robot
7*16467b97STreehugger Robot<!-- ANTLR includes -->
8*16467b97STreehugger Robot<script type="text/javascript" src="../../lib/antlr3-all.js"></script>
9*16467b97STreehugger Robot
10*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST1Lexer.js"></script>
11*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST1Parser.js"></script>
12*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST2Lexer.js"></script>
13*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST2Parser.js"></script>
14*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST3Lexer.js"></script>
15*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST3Parser.js"></script>
16*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST4Lexer.js"></script>
17*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST4Parser.js"></script>
18*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST5Lexer.js"></script>
19*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST5Parser.js"></script>
20*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST6Lexer.js"></script>
21*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST6Parser.js"></script>
22*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST7Lexer.js"></script>
23*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST7Parser.js"></script>
24*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST8Lexer.js"></script>
25*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST8Parser.js"></script>
26*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST9Lexer.js"></script>
27*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST9Parser.js"></script>
28*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST10Lexer.js"></script>
29*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST10Parser.js"></script>
30*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST11Lexer.js"></script>
31*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST11Parser.js"></script>
32*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST12Lexer.js"></script>
33*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST12Parser.js"></script>
34*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST13Lexer.js"></script>
35*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST13Parser.js"></script>
36*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST14Lexer.js"></script>
37*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST14Parser.js"></script>
38*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST15Lexer.js"></script>
39*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST15Parser.js"></script>
40*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST16Lexer.js"></script>
41*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST16Parser.js"></script>
42*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST17Lexer.js"></script>
43*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST17Parser.js"></script>
44*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST18Lexer.js"></script>
45*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST18Parser.js"></script>
46*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST19Lexer.js"></script>
47*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST19Parser.js"></script>
48*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST20Lexer.js"></script>
49*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST20Parser.js"></script>
50*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST21Lexer.js"></script>
51*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST21Parser.js"></script>
52*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST22Lexer.js"></script>
53*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST22Parser.js"></script>
54*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST23Lexer.js"></script>
55*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST23Parser.js"></script>
56*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST24Lexer.js"></script>
57*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST24Parser.js"></script>
58*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST25Lexer.js"></script>
59*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST25Parser.js"></script>
60*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST26Lexer.js"></script>
61*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST26Parser.js"></script>
62*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST27Lexer.js"></script>
63*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST27Parser.js"></script>
64*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST28Lexer.js"></script>
65*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST28Parser.js"></script>
66*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST29Lexer.js"></script>
67*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST29Parser.js"></script>
68*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST30Lexer.js"></script>
69*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST30Parser.js"></script>
70*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST31Lexer.js"></script>
71*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST31Parser.js"></script>
72*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST32Lexer.js"></script>
73*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST32Parser.js"></script>
74*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST33Lexer.js"></script>
75*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST33Parser.js"></script>
76*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST34Lexer.js"></script>
77*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST34Parser.js"></script>
78*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST35Lexer.js"></script>
79*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST35Parser.js"></script>
80*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST36Lexer.js"></script>
81*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST36Parser.js"></script>
82*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST37Lexer.js"></script>
83*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST37Parser.js"></script>
84*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST38Lexer.js"></script>
85*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST38Parser.js"></script>
86*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST39Lexer.js"></script>
87*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST39Parser.js"></script>
88*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST40Lexer.js"></script>
89*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST40Parser.js"></script>
90*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST41Lexer.js"></script>
91*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST41Parser.js"></script>
92*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST42Lexer.js"></script>
93*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST42Parser.js"></script>
94*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST43Lexer.js"></script>
95*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST43Parser.js"></script>
96*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST44Lexer.js"></script>
97*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST44Parser.js"></script>
98*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST45Lexer.js"></script>
99*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST45Parser.js"></script>
100*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST46Lexer.js"></script>
101*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST46Parser.js"></script>
102*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST47Lexer.js"></script>
103*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST47Parser.js"></script>
104*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST48Lexer.js"></script>
105*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST48Parser.js"></script>
106*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST49Lexer.js"></script>
107*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST49Parser.js"></script>
108*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST50Lexer.js"></script>
109*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST50Parser.js"></script>
110*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST51Lexer.js"></script>
111*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST51Parser.js"></script>
112*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST52Lexer.js"></script>
113*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST52Parser.js"></script>
114*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST53Lexer.js"></script>
115*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST53Parser.js"></script>
116*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST54Lexer.js"></script>
117*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST54Parser.js"></script>
118*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST55Lexer.js"></script>
119*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST55Parser.js"></script>
120*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST56Lexer.js"></script>
121*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST56Parser.js"></script>
122*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST57Lexer.js"></script>
123*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST57Parser.js"></script>
124*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST58Lexer.js"></script>
125*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST58Parser.js"></script>
126*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST59Lexer.js"></script>
127*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST59Parser.js"></script>
128*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST60Lexer.js"></script>
129*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST60Parser.js"></script>
130*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST61Lexer.js"></script>
131*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST61Parser.js"></script>
132*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST62Lexer.js"></script>
133*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST62Parser.js"></script>
134*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST63Lexer.js"></script>
135*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST63Parser.js"></script>
136*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST64Lexer.js"></script>
137*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST64Parser.js"></script>
138*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST65Lexer.js"></script>
139*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST65Parser.js"></script>
140*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST66Lexer.js"></script>
141*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST66Parser.js"></script>
142*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST67Lexer.js"></script>
143*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST67Parser.js"></script>
144*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST68Lexer.js"></script>
145*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST68Parser.js"></script>
146*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST69Lexer.js"></script>
147*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST69Parser.js"></script>
148*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST70Lexer.js"></script>
149*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST70Parser.js"></script>
150*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST71Lexer.js"></script>
151*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST71Parser.js"></script>
152*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST72Lexer.js"></script>
153*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST72Parser.js"></script>
154*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST73Lexer.js"></script>
155*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST73Parser.js"></script>
156*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST74Lexer.js"></script>
157*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST74Parser.js"></script>
158*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST75Lexer.js"></script>
159*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST75Parser.js"></script>
160*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST76Lexer.js"></script>
161*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST76Parser.js"></script>
162*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST77Lexer.js"></script>
163*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST77Parser.js"></script>
164*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST78Lexer.js"></script>
165*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST78Parser.js"></script>
166*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST79Lexer.js"></script>
167*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST79Parser.js"></script>
168*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST80Lexer.js"></script>
169*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST80Parser.js"></script>
170*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST81Lexer.js"></script>
171*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST81Parser.js"></script>
172*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST82Lexer.js"></script>
173*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST82Parser.js"></script>
174*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST83Lexer.js"></script>
175*16467b97STreehugger Robot<script type="text/javascript" src="t058rewriteAST83Parser.js"></script>
176*16467b97STreehugger Robot
177*16467b97STreehugger Robot<!-- JsUnit include -->
178*16467b97STreehugger Robot<script type="text/javascript" src="../jsunit/app/jsUnitCore.js"></script>
179*16467b97STreehugger Robot
180*16467b97STreehugger Robot<!-- Test Code -->
181*16467b97STreehugger Robot<script type="text/javascript">
182*16467b97STreehugger Robot    // Parser Tests
183*16467b97STreehugger Robot
184*16467b97STreehugger Robot    function execParser(lexerCls, parserCls, grammarEntry, xinput, expectErrors) {
185*16467b97STreehugger Robot        var cstream = new org.antlr.runtime.ANTLRStringStream(xinput),
186*16467b97STreehugger Robot            lexer = new (EnhancedParser(lexerCls))(cstream),
187*16467b97STreehugger Robot            tstream = new org.antlr.runtime.CommonTokenStream(lexer),
188*16467b97STreehugger Robot            parser = new (EnhancedParser(parserCls))(tstream);
189*16467b97STreehugger Robot        var r = parser[grammarEntry]();
190*16467b97STreehugger Robot
191*16467b97STreehugger Robot        if (!expectErrors) {
192*16467b97STreehugger Robot            throw parser._errors[0];
193*16467b97STreehugger Robot            assertEquals(parser._errors.length, 0);
194*16467b97STreehugger Robot        }
195*16467b97STreehugger Robot
196*16467b97STreehugger Robot        var result = "";
197*16467b97STreehugger Robot        if (r) {
198*16467b97STreehugger Robot            if (r.result) {
199*16467b97STreehugger Robot                result += r.result
200*16467b97STreehugger Robot            }
201*16467b97STreehugger Robot            if (r.getTree()) {
202*16467b97STreehugger Robot                result += r.getTree().toStringTree();
203*16467b97STreehugger Robot            }
204*16467b97STreehugger Robot        }
205*16467b97STreehugger Robot
206*16467b97STreehugger Robot        if (!expectErrors) {
207*16467b97STreehugger Robot            return result;
208*16467b97STreehugger Robot        } else {
209*16467b97STreehugger Robot            return [result, parser._errors];
210*16467b97STreehugger Robot        }
211*16467b97STreehugger Robot    }
212*16467b97STreehugger Robot
213*16467b97STreehugger Robot    function EnhancedParser(base) {
214*16467b97STreehugger Robot        var T = function() {
215*16467b97STreehugger Robot            T.superclass.constructor.apply(this, arguments);
216*16467b97STreehugger Robot            this.traces = [];
217*16467b97STreehugger Robot            this.buf = "";
218*16467b97STreehugger Robot            this._errors = [];
219*16467b97STreehugger Robot        };
220*16467b97STreehugger Robot
221*16467b97STreehugger Robot        org.antlr.lang.extend(T, base, {
222*16467b97STreehugger Robot            capture: function(t) {
223*16467b97STreehugger Robot                this.buf += t;
224*16467b97STreehugger Robot            },
225*16467b97STreehugger Robot            traceIn: function(ruleName, ruleIndex) {
226*16467b97STreehugger Robot                this.traces.push(">"+ruleName);
227*16467b97STreehugger Robot            },
228*16467b97STreehugger Robot            traceOut: function(ruleName, ruleIndex) {
229*16467b97STreehugger Robot                this.traces.push("<"+ruleName);
230*16467b97STreehugger Robot            },
231*16467b97STreehugger Robot            emitErrorMessage: function(msg) {
232*16467b97STreehugger Robot                this._errors.push(msg);
233*16467b97STreehugger Robot            }
234*16467b97STreehugger Robot        });
235*16467b97STreehugger Robot
236*16467b97STreehugger Robot        return T;
237*16467b97STreehugger Robot    }
238*16467b97STreehugger Robot
239*16467b97STreehugger Robotfunction testDelete() {
240*16467b97STreehugger Robot    var found = execParser(t058rewriteAST1Lexer, t058rewriteAST1Parser, "a", "abc 34");
241*16467b97STreehugger Robot    assertEquals("", found);
242*16467b97STreehugger Robot}
243*16467b97STreehugger Robot
244*16467b97STreehugger Robotfunction testSingleToken() {
245*16467b97STreehugger Robot    var found = execParser(t058rewriteAST2Lexer, t058rewriteAST2Parser, "a", "abc");
246*16467b97STreehugger Robot    assertEquals("abc", found);
247*16467b97STreehugger Robot}
248*16467b97STreehugger Robot
249*16467b97STreehugger Robotfunction testSingleTokenToNewNode() {
250*16467b97STreehugger Robot    var found = execParser(t058rewriteAST3Lexer, t058rewriteAST3Parser, "a", "abc");
251*16467b97STreehugger Robot    assertEquals("x", found);
252*16467b97STreehugger Robot}
253*16467b97STreehugger Robot
254*16467b97STreehugger Robotfunction testSingleTokenToNewNodeRoot() {
255*16467b97STreehugger Robot    var found = execParser(t058rewriteAST4Lexer, t058rewriteAST4Parser, "a", "abc");
256*16467b97STreehugger Robot    assertEquals("(x INT)", found);
257*16467b97STreehugger Robot}
258*16467b97STreehugger Robot
259*16467b97STreehugger Robotfunction testSingleTokenToNewNode2() {
260*16467b97STreehugger Robot    // Allow creation of new nodes w/o args.
261*16467b97STreehugger Robot    var found = execParser(t058rewriteAST5Lexer, t058rewriteAST5Parser, "a", "abc");
262*16467b97STreehugger Robot    assertEquals("ID", found);
263*16467b97STreehugger Robot}
264*16467b97STreehugger Robot
265*16467b97STreehugger Robotfunction testSingleCharLiteral() {
266*16467b97STreehugger Robot    var found = execParser(t058rewriteAST6Lexer, t058rewriteAST6Parser, "a", "c");
267*16467b97STreehugger Robot    assertEquals("c", found);
268*16467b97STreehugger Robot}
269*16467b97STreehugger Robot
270*16467b97STreehugger Robotfunction testSingleStringLiteral() {
271*16467b97STreehugger Robot    var found = execParser(t058rewriteAST7Lexer, t058rewriteAST7Parser, "a", "ick");
272*16467b97STreehugger Robot    assertEquals("ick", found);
273*16467b97STreehugger Robot}
274*16467b97STreehugger Robot
275*16467b97STreehugger Robotfunction testSingleRule() {
276*16467b97STreehugger Robot    var found = execParser(t058rewriteAST8Lexer, t058rewriteAST8Parser, "a", "abc");
277*16467b97STreehugger Robot    assertEquals("abc", found);
278*16467b97STreehugger Robot}
279*16467b97STreehugger Robot
280*16467b97STreehugger Robotfunction testReorderTokens() {
281*16467b97STreehugger Robot    var found = execParser(t058rewriteAST9Lexer, t058rewriteAST9Parser, "a", "abc 34");
282*16467b97STreehugger Robot    assertEquals("34 abc", found);
283*16467b97STreehugger Robot}
284*16467b97STreehugger Robot
285*16467b97STreehugger Robotfunction testReorderTokenAndRule() {
286*16467b97STreehugger Robot    var found = execParser(t058rewriteAST10Lexer, t058rewriteAST10Parser, "a", "abc 34");
287*16467b97STreehugger Robot    assertEquals("34 abc", found);
288*16467b97STreehugger Robot}
289*16467b97STreehugger Robot
290*16467b97STreehugger Robotfunction testTokenTree() {
291*16467b97STreehugger Robot    var found = execParser(t058rewriteAST11Lexer, t058rewriteAST11Parser, "a", "abc 34");
292*16467b97STreehugger Robot    assertEquals("(34 abc)", found);
293*16467b97STreehugger Robot}
294*16467b97STreehugger Robot
295*16467b97STreehugger Robotfunction testTokenTreeAfterOtherStuff() {
296*16467b97STreehugger Robot    var found = execParser(t058rewriteAST12Lexer, t058rewriteAST12Parser, "a", "void abc 34");
297*16467b97STreehugger Robot    assertEquals("void (34 abc)", found);
298*16467b97STreehugger Robot}
299*16467b97STreehugger Robot
300*16467b97STreehugger Robotfunction testNestedTokenTreeWithOuterLoop() {
301*16467b97STreehugger Robot    // verify that ID and INT both iterate over outer index variable
302*16467b97STreehugger Robot    var found = execParser(t058rewriteAST13Lexer, t058rewriteAST13Parser, "a", "a 1 b 2");
303*16467b97STreehugger Robot    assertEquals("(DUH a (DUH 1)) (DUH b (DUH 2))", found);
304*16467b97STreehugger Robot}
305*16467b97STreehugger Robot
306*16467b97STreehugger Robotfunction testOptionalSingleToken() {
307*16467b97STreehugger Robot    var found = execParser(t058rewriteAST14Lexer, t058rewriteAST14Parser, "a", "abc");
308*16467b97STreehugger Robot    assertEquals("abc", found);
309*16467b97STreehugger Robot}
310*16467b97STreehugger Robot
311*16467b97STreehugger Robotfunction testClosureSingleToken() {
312*16467b97STreehugger Robot    var found = execParser(t058rewriteAST15Lexer, t058rewriteAST15Parser, "a", "a b");
313*16467b97STreehugger Robot    assertEquals("a b", found);
314*16467b97STreehugger Robot}
315*16467b97STreehugger Robot
316*16467b97STreehugger Robotfunction testPositiveClosureSingleToken() {
317*16467b97STreehugger Robot    var found = execParser(t058rewriteAST16Lexer, t058rewriteAST16Parser, "a", "a b");
318*16467b97STreehugger Robot    assertEquals("a b", found);
319*16467b97STreehugger Robot}
320*16467b97STreehugger Robot
321*16467b97STreehugger Robotfunction testOptionalSingleRule() {
322*16467b97STreehugger Robot    var found = execParser(t058rewriteAST17Lexer, t058rewriteAST17Parser, "a", "abc");
323*16467b97STreehugger Robot    assertEquals("abc", found);
324*16467b97STreehugger Robot}
325*16467b97STreehugger Robot
326*16467b97STreehugger Robotfunction testClosureSingleRule() {
327*16467b97STreehugger Robot    var found = execParser(t058rewriteAST18Lexer, t058rewriteAST18Parser, "a", "a b");
328*16467b97STreehugger Robot    assertEquals("a b", found);
329*16467b97STreehugger Robot}
330*16467b97STreehugger Robot
331*16467b97STreehugger Robotfunction testClosureOfLabel() {
332*16467b97STreehugger Robot    var found = execParser(t058rewriteAST19Lexer, t058rewriteAST19Parser, "a", "a b");
333*16467b97STreehugger Robot    assertEquals("a b", found);
334*16467b97STreehugger Robot}
335*16467b97STreehugger Robot
336*16467b97STreehugger Robotfunction testOptionalLabelNoListLabel() {
337*16467b97STreehugger Robot    var found = execParser(t058rewriteAST20Lexer, t058rewriteAST20Parser, "a", "a");
338*16467b97STreehugger Robot    assertEquals("a", found);
339*16467b97STreehugger Robot}
340*16467b97STreehugger Robot
341*16467b97STreehugger Robotfunction testPositiveClosureSingleRule() {
342*16467b97STreehugger Robot    var found = execParser(t058rewriteAST21Lexer, t058rewriteAST21Parser, "a", "a b");
343*16467b97STreehugger Robot    assertEquals("a b", found);
344*16467b97STreehugger Robot}
345*16467b97STreehugger Robot
346*16467b97STreehugger Robotfunction testSinglePredicateT() {
347*16467b97STreehugger Robot    var found = execParser(t058rewriteAST22Lexer, t058rewriteAST22Parser, "a", "abc");
348*16467b97STreehugger Robot    assertEquals("abc", found);
349*16467b97STreehugger Robot}
350*16467b97STreehugger Robot
351*16467b97STreehugger Robotfunction testSinglePredicateF() {
352*16467b97STreehugger Robot    var found = execParser(t058rewriteAST23Lexer, t058rewriteAST23Parser, "a", "abc");
353*16467b97STreehugger Robot    assertEquals("", found);
354*16467b97STreehugger Robot}
355*16467b97STreehugger Robot
356*16467b97STreehugger Robotfunction testMultiplePredicate() {
357*16467b97STreehugger Robot    var found = execParser(t058rewriteAST24Lexer, t058rewriteAST24Parser, "a", "a 2");
358*16467b97STreehugger Robot    assertEquals("2", found);
359*16467b97STreehugger Robot}
360*16467b97STreehugger Robot
361*16467b97STreehugger Robotfunction testMultiplePredicateTrees() {
362*16467b97STreehugger Robot    var found = execParser(t058rewriteAST25Lexer, t058rewriteAST25Parser, "a", "a 2");
363*16467b97STreehugger Robot    assertEquals("(2 a)", found);
364*16467b97STreehugger Robot}
365*16467b97STreehugger Robot
366*16467b97STreehugger Robotfunction testSimpleTree() {
367*16467b97STreehugger Robot    var found = execParser(t058rewriteAST26Lexer, t058rewriteAST26Parser, "a", "-34");
368*16467b97STreehugger Robot    assertEquals("(- 34)", found);
369*16467b97STreehugger Robot}
370*16467b97STreehugger Robot
371*16467b97STreehugger Robotfunction testSimpleTree2() {
372*16467b97STreehugger Robot    var found = execParser(t058rewriteAST27Lexer, t058rewriteAST27Parser, "a", "+ 34");
373*16467b97STreehugger Robot    assertEquals("(34 +)", found);
374*16467b97STreehugger Robot}
375*16467b97STreehugger Robot
376*16467b97STreehugger Robotfunction testNestedTrees() {
377*16467b97STreehugger Robot    var found = execParser(t058rewriteAST28Lexer, t058rewriteAST28Parser, "a", "var a:int; b:float;");
378*16467b97STreehugger Robot    assertEquals("(var (: a int) (: b float))", found);
379*16467b97STreehugger Robot}
380*16467b97STreehugger Robot
381*16467b97STreehugger Robotfunction testImaginaryTokenCopy() {
382*16467b97STreehugger Robot    var found = execParser(t058rewriteAST29Lexer, t058rewriteAST29Parser, "a", "a,b,c");
383*16467b97STreehugger Robot    assertEquals("(VAR a) (VAR b) (VAR c)", found);
384*16467b97STreehugger Robot}
385*16467b97STreehugger Robot
386*16467b97STreehugger Robotfunction testTokenUnreferencedOnLeftButDefined() {
387*16467b97STreehugger Robot    var found = execParser(t058rewriteAST30Lexer, t058rewriteAST30Parser, "a", "a");
388*16467b97STreehugger Robot    assertEquals("ID", found);
389*16467b97STreehugger Robot}
390*16467b97STreehugger Robot
391*16467b97STreehugger Robotfunction testImaginaryTokenCopySetText() {
392*16467b97STreehugger Robot    var found = execParser(t058rewriteAST31Lexer, t058rewriteAST31Parser, "a", "a,b,c");
393*16467b97STreehugger Robot    assertEquals("(var a) (var b) (var c)", found);
394*16467b97STreehugger Robot}
395*16467b97STreehugger Robot
396*16467b97STreehugger Robotfunction testImaginaryTokenNoCopyFromToken() {
397*16467b97STreehugger Robot    var found = execParser(t058rewriteAST32Lexer, t058rewriteAST32Parser, "a", "{a b c}");
398*16467b97STreehugger Robot    assertEquals("({ a b c)", found);
399*16467b97STreehugger Robot}
400*16467b97STreehugger Robot
401*16467b97STreehugger Robotfunction testImaginaryTokenNoCopyFromTokenSetText() {
402*16467b97STreehugger Robot    var found = execParser(t058rewriteAST33Lexer, t058rewriteAST33Parser, "a", "{a b c}");
403*16467b97STreehugger Robot    assertEquals("(block a b c)", found);
404*16467b97STreehugger Robot}
405*16467b97STreehugger Robot
406*16467b97STreehugger Robotfunction testMixedRewriteAndAutoAST() {
407*16467b97STreehugger Robot    var found = execParser(t058rewriteAST34Lexer, t058rewriteAST34Parser, "a", "a 1 2");
408*16467b97STreehugger Robot    assertEquals("(2 1 a)", found);
409*16467b97STreehugger Robot}
410*16467b97STreehugger Robot
411*16467b97STreehugger Robotfunction testSubruleWithRewrite() {
412*16467b97STreehugger Robot    var found = execParser(t058rewriteAST35Lexer, t058rewriteAST35Parser, "a", "a 1 2 3");
413*16467b97STreehugger Robot    assertEquals("1 a 2 3", found);
414*16467b97STreehugger Robot}
415*16467b97STreehugger Robot
416*16467b97STreehugger Robotfunction testSubruleWithRewrite2() {
417*16467b97STreehugger Robot    var found = execParser(t058rewriteAST36Lexer, t058rewriteAST36Parser, "a", "int a; int b=3;");
418*16467b97STreehugger Robot    assertEquals("(TYPE int a) (TYPE int b 3)", found);
419*16467b97STreehugger Robot}
420*16467b97STreehugger Robot
421*16467b97STreehugger Robotfunction testNestedRewriteShutsOffAutoAST() {
422*16467b97STreehugger Robot    var found = execParser(t058rewriteAST37Lexer, t058rewriteAST37Parser, "a", "a b c d; 42");
423*16467b97STreehugger Robot    assertEquals("d 42", found);
424*16467b97STreehugger Robot}
425*16467b97STreehugger Robot
426*16467b97STreehugger Robotfunction testRewriteActions() {
427*16467b97STreehugger Robot    var found = execParser(t058rewriteAST38Lexer, t058rewriteAST38Parser, "a", "3");
428*16467b97STreehugger Robot    assertEquals("(9 3)", found);
429*16467b97STreehugger Robot}
430*16467b97STreehugger Robot
431*16467b97STreehugger Robotfunction testRewriteActions2() {
432*16467b97STreehugger Robot    var found = execParser(t058rewriteAST39Lexer, t058rewriteAST39Parser, "a", "3");
433*16467b97STreehugger Robot    assertEquals("9 3", found);
434*16467b97STreehugger Robot}
435*16467b97STreehugger Robot
436*16467b97STreehugger Robotfunction testRefToOldValue() {
437*16467b97STreehugger Robot    var found = execParser(t058rewriteAST40Lexer, t058rewriteAST40Parser, "a", "3+4+5");
438*16467b97STreehugger Robot    assertEquals("(+ (+ 3 4) 5)", found);
439*16467b97STreehugger Robot}
440*16467b97STreehugger Robot
441*16467b97STreehugger Robotfunction testCopySemanticsForRules() {
442*16467b97STreehugger Robot    var found = execParser(t058rewriteAST41Lexer, t058rewriteAST41Parser, "a", "3");
443*16467b97STreehugger Robot    assertEquals("(3 3)", found);
444*16467b97STreehugger Robot}
445*16467b97STreehugger Robot
446*16467b97STreehugger Robotfunction testCopySemanticsForRules2() {
447*16467b97STreehugger Robot    // copy type as a root for each invocation of (...)+ in rewrite
448*16467b97STreehugger Robot    var found = execParser(t058rewriteAST42Lexer, t058rewriteAST42Parser, "a", "int a,b,c;");
449*16467b97STreehugger Robot    assertEquals("(int a) (int b) (int c)", found);
450*16467b97STreehugger Robot}
451*16467b97STreehugger Robot
452*16467b97STreehugger Robotfunction testCopySemanticsForRules3() {
453*16467b97STreehugger Robot    // copy type *and* modifier even though it's optional
454*16467b97STreehugger Robot    // for each invocation of (...)+ in rewrite
455*16467b97STreehugger Robot    var found = execParser(t058rewriteAST43Lexer, t058rewriteAST43Parser, "a", "public int a,b,c;");
456*16467b97STreehugger Robot    assertEquals("(int public a) (int public b) (int public c)", found);
457*16467b97STreehugger Robot}
458*16467b97STreehugger Robot
459*16467b97STreehugger Robotfunction testCopySemanticsForRules3Double() {
460*16467b97STreehugger Robot    // copy type *and* modifier even though it's optional
461*16467b97STreehugger Robot    // for each invocation of (...)+ in rewrite
462*16467b97STreehugger Robot    var found = execParser(t058rewriteAST44Lexer, t058rewriteAST44Parser, "a", "public int a,b,c;");
463*16467b97STreehugger Robot    assertEquals("(int public a) (int public b) (int public c) (int public a) (int public b) (int public c)", found);
464*16467b97STreehugger Robot}
465*16467b97STreehugger Robot
466*16467b97STreehugger Robotfunction testCopySemanticsForRules4() {
467*16467b97STreehugger Robot    // copy type *and* modifier even though it's optional
468*16467b97STreehugger Robot    // for each invocation of (...)+ in rewrite
469*16467b97STreehugger Robot    var found = execParser(t058rewriteAST45Lexer, t058rewriteAST45Parser, "a", "public int a,b,c;");
470*16467b97STreehugger Robot    assertEquals("(int (MOD public) a) (int (MOD public) b) (int (MOD public) c)", found);
471*16467b97STreehugger Robot}
472*16467b97STreehugger Robot
473*16467b97STreehugger Robotfunction testCopySemanticsLists() {
474*16467b97STreehugger Robot    var found = execParser(t058rewriteAST46Lexer, t058rewriteAST46Parser, "a", "a,b,c;");
475*16467b97STreehugger Robot    assertEquals("a b c a b c", found);
476*16467b97STreehugger Robot}
477*16467b97STreehugger Robot
478*16467b97STreehugger Robotfunction testCopyRuleLabel() {
479*16467b97STreehugger Robot    var found = execParser(t058rewriteAST47Lexer, t058rewriteAST47Parser, "a", "a");
480*16467b97STreehugger Robot    assertEquals("a a", found);
481*16467b97STreehugger Robot}
482*16467b97STreehugger Robot
483*16467b97STreehugger Robotfunction testCopyRuleLabel2() {
484*16467b97STreehugger Robot    var found = execParser(t058rewriteAST48Lexer, t058rewriteAST48Parser, "a", "a");
485*16467b97STreehugger Robot    assertEquals("(a a)", found);
486*16467b97STreehugger Robot}
487*16467b97STreehugger Robot
488*16467b97STreehugger Robotfunction testQueueingOfTokens() {
489*16467b97STreehugger Robot    var found = execParser(t058rewriteAST49Lexer, t058rewriteAST49Parser, "a", "int a,b,c;");
490*16467b97STreehugger Robot    assertEquals("(int a b c)", found);
491*16467b97STreehugger Robot}
492*16467b97STreehugger Robot
493*16467b97STreehugger Robotfunction testCopyOfTokens() {
494*16467b97STreehugger Robot    var found = execParser(t058rewriteAST50Lexer, t058rewriteAST50Parser, "a", "int a;");
495*16467b97STreehugger Robot    assertEquals("int a int a", found);
496*16467b97STreehugger Robot}
497*16467b97STreehugger Robot
498*16467b97STreehugger Robotfunction testTokenCopyInLoop() {
499*16467b97STreehugger Robot    var found = execParser(t058rewriteAST51Lexer, t058rewriteAST51Parser, "a", "int a,b,c;");
500*16467b97STreehugger Robot    assertEquals("(int a) (int b) (int c)", found);
501*16467b97STreehugger Robot}
502*16467b97STreehugger Robot
503*16467b97STreehugger Robotfunction testTokenCopyInLoopAgainstTwoOthers() {
504*16467b97STreehugger Robot    // must smear 'int' copies across as root of multiple trees
505*16467b97STreehugger Robot    var found = execParser(t058rewriteAST52Lexer, t058rewriteAST52Parser, "a", "int a:1,b:2,c:3;");
506*16467b97STreehugger Robot    assertEquals("(int a 1) (int b 2) (int c 3)", found);
507*16467b97STreehugger Robot}
508*16467b97STreehugger Robot
509*16467b97STreehugger Robotfunction testListRefdOneAtATime() {
510*16467b97STreehugger Robot    var found = execParser(t058rewriteAST53Lexer, t058rewriteAST53Parser, "a", "a b c");
511*16467b97STreehugger Robot    assertEquals("a b c", found);
512*16467b97STreehugger Robot}
513*16467b97STreehugger Robot
514*16467b97STreehugger Robotfunction testSplitListWithLabels() {
515*16467b97STreehugger Robot    var found = execParser(t058rewriteAST54Lexer, t058rewriteAST54Parser, "a", "a b c");
516*16467b97STreehugger Robot    assertEquals("a VAR b c", found);
517*16467b97STreehugger Robot}
518*16467b97STreehugger Robot
519*16467b97STreehugger Robotfunction testComplicatedMelange() {
520*16467b97STreehugger Robot    var found = execParser(t058rewriteAST55Lexer, t058rewriteAST55Parser, "a", "a a b b b c c c d");
521*16467b97STreehugger Robot    assertEquals("a a b b b c c c d", found);
522*16467b97STreehugger Robot}
523*16467b97STreehugger Robot
524*16467b97STreehugger Robotfunction testRuleLabel() {
525*16467b97STreehugger Robot    var found = execParser(t058rewriteAST56Lexer, t058rewriteAST56Parser, "a", "a");
526*16467b97STreehugger Robot    assertEquals("a", found);
527*16467b97STreehugger Robot}
528*16467b97STreehugger Robot
529*16467b97STreehugger Robotfunction testAmbiguousRule() {
530*16467b97STreehugger Robot    var found = execParser(t058rewriteAST57Lexer, t058rewriteAST57Parser,
531*16467b97STreehugger Robot            "a", "abc 34");
532*16467b97STreehugger Robot    assertEquals("34", found);
533*16467b97STreehugger Robot}
534*16467b97STreehugger Robot
535*16467b97STreehugger Robotfunction testRuleListLabel() {
536*16467b97STreehugger Robot    var found = execParser(t058rewriteAST58Lexer, t058rewriteAST58Parser, "a", "a b");
537*16467b97STreehugger Robot    assertEquals("a b", found);
538*16467b97STreehugger Robot}
539*16467b97STreehugger Robot
540*16467b97STreehugger Robotfunction testRuleListLabel2() {
541*16467b97STreehugger Robot    var found = execParser(t058rewriteAST59Lexer, t058rewriteAST59Parser, "a", "a b");
542*16467b97STreehugger Robot    assertEquals("a b", found);
543*16467b97STreehugger Robot}
544*16467b97STreehugger Robot
545*16467b97STreehugger Robotfunction testOptional() {
546*16467b97STreehugger Robot    var found = execParser(t058rewriteAST60Lexer, t058rewriteAST60Parser, "a", "a");
547*16467b97STreehugger Robot    assertEquals("a", found);
548*16467b97STreehugger Robot}
549*16467b97STreehugger Robot
550*16467b97STreehugger Robotfunction testOptional2() {
551*16467b97STreehugger Robot    var found = execParser(t058rewriteAST61Lexer, t058rewriteAST61Parser, "a", "a b");
552*16467b97STreehugger Robot    assertEquals("a b", found);
553*16467b97STreehugger Robot}
554*16467b97STreehugger Robot
555*16467b97STreehugger Robotfunction testOptional3() {
556*16467b97STreehugger Robot    var found = execParser(t058rewriteAST62Lexer, t058rewriteAST62Parser, "a", "a b");
557*16467b97STreehugger Robot    assertEquals("a b", found);
558*16467b97STreehugger Robot}
559*16467b97STreehugger Robot
560*16467b97STreehugger Robotfunction testOptional4() {
561*16467b97STreehugger Robot    var found = execParser(t058rewriteAST63Lexer, t058rewriteAST63Parser, "a", "a b");
562*16467b97STreehugger Robot    assertEquals("a b", found);
563*16467b97STreehugger Robot}
564*16467b97STreehugger Robot
565*16467b97STreehugger Robotfunction testOptional5() {
566*16467b97STreehugger Robot    var found = execParser(t058rewriteAST64Lexer, t058rewriteAST64Parser, "a", "a");
567*16467b97STreehugger Robot    assertEquals("a", found);
568*16467b97STreehugger Robot}
569*16467b97STreehugger Robot
570*16467b97STreehugger Robotfunction testArbitraryExprType() {
571*16467b97STreehugger Robot    var found = execParser(t058rewriteAST65Lexer, t058rewriteAST65Parser, "a", "a b");
572*16467b97STreehugger Robot    assertEquals("", found);
573*16467b97STreehugger Robot}
574*16467b97STreehugger Robot
575*16467b97STreehugger Robotfunction testSet() {
576*16467b97STreehugger Robot    var found = execParser(t058rewriteAST66Lexer, t058rewriteAST66Parser, "a", "2 a 34 de");
577*16467b97STreehugger Robot    assertEquals("2 34 a de", found);
578*16467b97STreehugger Robot}
579*16467b97STreehugger Robot
580*16467b97STreehugger Robotfunction testSet2() {
581*16467b97STreehugger Robot    var found = execParser(t058rewriteAST67Lexer, t058rewriteAST67Parser, "a", "2");
582*16467b97STreehugger Robot    assertEquals("2", found);
583*16467b97STreehugger Robot}
584*16467b97STreehugger Robot
585*16467b97STreehugger Robot/*
586*16467b97STreehugger Robot * @fails - the grammar shouldn't be valid, but is
587*16467b97STreehugger Robot *
588*16467b97STreehugger Robotfunction testSetWithLabel() {
589*16467b97STreehugger Robot    var found = execParser(t058rewriteAST68Lexer, t058rewriteAST68Parser, "a", "2");
590*16467b97STreehugger Robot    assertEquals("2", found);
591*16467b97STreehugger Robot}
592*16467b97STreehugger Robot*/
593*16467b97STreehugger Robot
594*16467b97STreehugger Robotfunction testRewriteAction() {
595*16467b97STreehugger Robot    var found = execParser(t058rewriteAST69Lexer, t058rewriteAST69Parser, "r", "25");
596*16467b97STreehugger Robot    assertEquals("25.0", found);
597*16467b97STreehugger Robot}
598*16467b97STreehugger Robot
599*16467b97STreehugger Robotfunction testOptionalSubruleWithoutRealElements() {
600*16467b97STreehugger Robot    // copy type *and* modifier even though it's optional
601*16467b97STreehugger Robot    // for each invocation of (...)+ in rewrite
602*16467b97STreehugger Robot    var found = execParser(t058rewriteAST70Lexer, t058rewriteAST70Parser, "modulo", "modulo abc (x y)");
603*16467b97STreehugger Robot    assertEquals("(modulo abc (PARMS x y))", found);
604*16467b97STreehugger Robot}
605*16467b97STreehugger Robot
606*16467b97STreehugger Robot//// C A R D I N A L I T Y  I S S U E S
607*16467b97STreehugger Robot
608*16467b97STreehugger Robotfunction testCardinality() {
609*16467b97STreehugger Robot    try {
610*16467b97STreehugger Robot        execParser(t058rewriteAST71Lexer, t058rewriteAST71Parser, "a", "a b 3 4 5");
611*16467b97STreehugger Robot        fail();
612*16467b97STreehugger Robot    } catch(e) {
613*16467b97STreehugger Robot        assertEquals(e.getMessage(), "token ID");
614*16467b97STreehugger Robot    }
615*16467b97STreehugger Robot}
616*16467b97STreehugger Robot
617*16467b97STreehugger Robot
618*16467b97STreehugger Robotfunction testCardinality2() {
619*16467b97STreehugger Robot    try {
620*16467b97STreehugger Robot        execParser(t058rewriteAST72Lexer, t058rewriteAST72Parser, "a", "a b");
621*16467b97STreehugger Robot        fail();
622*16467b97STreehugger Robot    } catch(e) {
623*16467b97STreehugger Robot        assertEquals(e.getMessage(), "token ID");
624*16467b97STreehugger Robot    }
625*16467b97STreehugger Robot}
626*16467b97STreehugger Robot
627*16467b97STreehugger Robotfunction testCardinality3() {
628*16467b97STreehugger Robot    try {
629*16467b97STreehugger Robot        execParser(t058rewriteAST73Lexer, t058rewriteAST73Parser, "a", "3");
630*16467b97STreehugger Robot        fail();
631*16467b97STreehugger Robot    } catch(e) {
632*16467b97STreehugger Robot        assertEquals(e.getMessage(), "token ID");
633*16467b97STreehugger Robot    }
634*16467b97STreehugger Robot}
635*16467b97STreehugger Robot
636*16467b97STreehugger Robotfunction testLoopCardinality() {
637*16467b97STreehugger Robot    try {
638*16467b97STreehugger Robot        execParser(t058rewriteAST74Lexer, t058rewriteAST74Parser, "a", "3");
639*16467b97STreehugger Robot        fail();
640*16467b97STreehugger Robot    } catch(e) {
641*16467b97STreehugger Robot        assert(e instanceof org.antlr.runtime.tree.RewriteEarlyExitException);
642*16467b97STreehugger Robot    }
643*16467b97STreehugger Robot}
644*16467b97STreehugger Robot
645*16467b97STreehugger Robotfunction testWildcard() {
646*16467b97STreehugger Robot    var found = execParser(t058rewriteAST75Lexer, t058rewriteAST75Parser, "a", "abc 34");
647*16467b97STreehugger Robot    assertEquals("34\n", found);
648*16467b97STreehugger Robot}
649*16467b97STreehugger Robot
650*16467b97STreehugger Robot// E R R O R S
651*16467b97STreehugger Robot
652*16467b97STreehugger Robotfunction testExtraTokenInSimpleDecl() {
653*16467b97STreehugger Robot    var retval = execParser(t058rewriteAST76Lexer, t058rewriteAST76Parser, "decl", "int 34 x=1;",
654*16467b97STreehugger Robot            true);
655*16467b97STreehugger Robot    var found = retval[0], errors = retval[1];
656*16467b97STreehugger Robot    assertArrayEquals(["line 1:4 extraneous input '34' expecting ID"],
657*16467b97STreehugger Robot            errors);
658*16467b97STreehugger Robot    assertEquals("(EXPR int x 1)", found) // tree gets correct x and 1 tokens
659*16467b97STreehugger Robot}
660*16467b97STreehugger Robot
661*16467b97STreehugger Robot
662*16467b97STreehugger Robotfunction testMissingIDInSimpleDecl() {
663*16467b97STreehugger Robot    var retval = execParser(t058rewriteAST77Lexer, t058rewriteAST77Parser, "decl", "int =1;",
664*16467b97STreehugger Robot            true);
665*16467b97STreehugger Robot    var found = retval[0], errors = retval[1];
666*16467b97STreehugger Robot    assertArrayEquals(["line 1:4 missing ID at '='"], errors);
667*16467b97STreehugger Robot    assertEquals("(EXPR int <missing ID> 1)", found) // tree gets invented ID token
668*16467b97STreehugger Robot}
669*16467b97STreehugger Robot
670*16467b97STreehugger Robotfunction testMissingSetInSimpleDecl() {
671*16467b97STreehugger Robot    var retval = execParser(t058rewriteAST78Lexer, t058rewriteAST78Parser, "decl", "x=1;",
672*16467b97STreehugger Robot            true);
673*16467b97STreehugger Robot    var found = retval[0], errors = retval[1];
674*16467b97STreehugger Robot    assertArrayEquals(["line 1:0 mismatched input 'x' expecting set null"],
675*16467b97STreehugger Robot            errors);
676*16467b97STreehugger Robot    assertEquals("(EXPR <error: x> x 1)", found) // tree gets invented ID token
677*16467b97STreehugger Robot}
678*16467b97STreehugger Robot
679*16467b97STreehugger Robotfunction testMissingTokenGivesErrorNode() {
680*16467b97STreehugger Robot    var retval = execParser(t058rewriteAST79Lexer, t058rewriteAST79Parser, "a", "abc",
681*16467b97STreehugger Robot            true);
682*16467b97STreehugger Robot    var found = retval[0], errors = retval[1];
683*16467b97STreehugger Robot    assertArrayEquals(["line 0:-1 missing INT at '<EOF>'"], errors);
684*16467b97STreehugger Robot    // doesn't do in-line recovery for sets (yet?);
685*16467b97STreehugger Robot    assertEquals("abc <missing INT>", found);
686*16467b97STreehugger Robot}
687*16467b97STreehugger Robot
688*16467b97STreehugger Robotfunction testExtraTokenGivesErrorNode() {
689*16467b97STreehugger Robot    var retval = execParser(t058rewriteAST80Lexer, t058rewriteAST80Parser, "a", "abc ick 34",
690*16467b97STreehugger Robot            true);
691*16467b97STreehugger Robot    var found = retval[0], errors = retval[1];
692*16467b97STreehugger Robot    assertArrayEquals(["line 1:4 extraneous input 'ick' expecting INT"],
693*16467b97STreehugger Robot            errors);
694*16467b97STreehugger Robot    assertEquals("abc 34", found);
695*16467b97STreehugger Robot}
696*16467b97STreehugger Robot
697*16467b97STreehugger Robotfunction testMissingFirstTokenGivesErrorNode() {
698*16467b97STreehugger Robot    var retval = execParser(t058rewriteAST81Lexer, t058rewriteAST81Parser, "a", "34", true);
699*16467b97STreehugger Robot    var found = retval[0], errors = retval[1];
700*16467b97STreehugger Robot    assertArrayEquals(["line 1:0 missing ID at '34'"], errors);
701*16467b97STreehugger Robot    assertEquals("<missing ID> 34", found);
702*16467b97STreehugger Robot}
703*16467b97STreehugger Robot
704*16467b97STreehugger Robotfunction testMissingFirstTokenGivesErrorNode2() {
705*16467b97STreehugger Robot    var retval = execParser(t058rewriteAST82Lexer, t058rewriteAST82Parser, "a", "34", true);
706*16467b97STreehugger Robot    var found = retval[0], errors = retval[1];
707*16467b97STreehugger Robot    // finds an error at the first token, 34, and re-syncs.
708*16467b97STreehugger Robot    // re-synchronizing does not consume a token because 34 follows
709*16467b97STreehugger Robot    // ref to rule b (start of c). It then matches 34 in c.
710*16467b97STreehugger Robot    assertArrayEquals(["line 1:0 mismatched input '34' expecting ID"], errors);
711*16467b97STreehugger Robot    assertEquals("<mismatched token: [@0,0:1='34',<5>,1:0], resync=34> 34", found);
712*16467b97STreehugger Robot}
713*16467b97STreehugger Robot
714*16467b97STreehugger Robotfunction testNoViableAltGivesErrorNode() {
715*16467b97STreehugger Robot    var retval = execParser(t058rewriteAST83Lexer, t058rewriteAST83Parser, "a", "*", true);
716*16467b97STreehugger Robot    var found = retval[0], errors = retval[1];
717*16467b97STreehugger Robot    // finds an error at the first token, 34, and re-syncs.
718*16467b97STreehugger Robot    // re-synchronizing does not consume a token because 34 follows
719*16467b97STreehugger Robot    // ref to rule b (start of c). It then matches 34 in c.
720*16467b97STreehugger Robot    assertArrayEquals(["line 1:0 no viable alternative at input '*'"],
721*16467b97STreehugger Robot            errors);
722*16467b97STreehugger Robot    assertEquals("<unexpected: [@0,0:0='*',<6>,1:0], resync=*>",
723*16467b97STreehugger Robot            found);
724*16467b97STreehugger Robot}
725*16467b97STreehugger Robot</script>
726*16467b97STreehugger Robot
727*16467b97STreehugger Robot</head>
728*16467b97STreehugger Robot<body>
729*16467b97STreehugger Robot    <h1>t058rewriteAST</h1>
730*16467b97STreehugger Robot</body>
731*16467b97STreehugger Robot</html>
732*16467b97STreehugger Robot
733