comparison truffle/com.oracle.truffle.sl/src/com/oracle/truffle/sl/parser/Parser.java @ 21951:9c8c0937da41

Moving all sources into truffle subdirectory
author Jaroslav Tulach <jaroslav.tulach@oracle.com>
date Wed, 17 Jun 2015 10:58:08 +0200
parents graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/parser/Parser.java@cfb85e1f4ca5
children c07e64ecb528
comparison
equal deleted inserted replaced
21950:2a5011c7e641 21951:9c8c0937da41
1 /*
2 * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23
24 // The content of this file is automatically generated. DO NOT EDIT.
25
26 package com.oracle.truffle.sl.parser;
27
28 import java.util.*;
29
30 import com.oracle.truffle.api.source.*;
31 import com.oracle.truffle.sl.*;
32 import com.oracle.truffle.sl.nodes.*;
33 import com.oracle.truffle.sl.runtime.*;
34
35 // Checkstyle: stop
36 // @formatter:off
37 public class Parser {
38 public static final int _EOF = 0;
39 public static final int _identifier = 1;
40 public static final int _stringLiteral = 2;
41 public static final int _numericLiteral = 3;
42 public static final int maxT = 31;
43
44 static final boolean _T = true;
45 static final boolean _x = false;
46 static final int minErrDist = 2;
47
48 public Token t; // last recognized token
49 public Token la; // lookahead token
50 int errDist = minErrDist;
51
52 public final Scanner scanner;
53 public final Errors errors;
54 private final SLNodeFactory factory;
55
56 public Parser(SLContext context, Source source) {
57 this.scanner = new Scanner(source.getInputStream());
58 this.factory = new SLNodeFactory(context, source);
59 errors = new Errors();
60 }
61
62 void SynErr(int n) {
63 if (errDist >= minErrDist)
64 errors.SynErr(la.line, la.col, n);
65 errDist = 0;
66 }
67
68 public void SemErr(String msg) {
69 if (errDist >= minErrDist)
70 errors.SemErr(t.line, t.col, msg);
71 errDist = 0;
72 }
73
74 void Get() {
75 for (;;) {
76 t = la;
77 la = scanner.Scan();
78 if (la.kind <= maxT) {
79 ++errDist;
80 break;
81 }
82
83 la = t;
84 }
85 }
86
87 void Expect(int n) {
88 if (la.kind == n)
89 Get();
90 else {
91 SynErr(n);
92 }
93 }
94
95 boolean StartOf(int s) {
96 return set[s][la.kind];
97 }
98
99 void ExpectWeak(int n, int follow) {
100 if (la.kind == n)
101 Get();
102 else {
103 SynErr(n);
104 while (!StartOf(follow))
105 Get();
106 }
107 }
108
109 boolean WeakSeparator(int n, int syFol, int repFol) {
110 int kind = la.kind;
111 if (kind == n) {
112 Get();
113 return true;
114 } else if (StartOf(repFol))
115 return false;
116 else {
117 SynErr(n);
118 while (!(set[syFol][kind] || set[repFol][kind] || set[0][kind])) {
119 Get();
120 kind = la.kind;
121 }
122 return StartOf(syFol);
123 }
124 }
125
126 void SimpleLanguage() {
127 Function();
128 while (la.kind == 4) {
129 Function();
130 }
131 }
132
133 void Function() {
134 Expect(4);
135 Expect(1);
136 Token identifierToken = t;
137 Expect(5);
138 int bodyStartPos = t.charPos;
139 factory.startFunction(identifierToken, bodyStartPos);
140 if (la.kind == 1) {
141 Get();
142 factory.addFormalParameter(t);
143 while (la.kind == 6) {
144 Get();
145 Expect(1);
146 factory.addFormalParameter(t);
147 }
148 }
149 Expect(7);
150 SLStatementNode body = Block(false);
151 factory.finishFunction(body);
152 }
153
154 SLStatementNode Block(boolean inLoop) {
155 SLStatementNode result;
156 factory.startBlock();
157 List<SLStatementNode> body = new ArrayList<>();
158 Expect(8);
159 int start = t.charPos;
160 while (StartOf(1)) {
161 SLStatementNode s = Statement(inLoop);
162 body.add(s);
163 }
164 Expect(9);
165 int length = (t.charPos + t.val.length()) - start;
166 result = factory.finishBlock(body, start, length);
167 return result;
168 }
169
170 SLStatementNode Statement(boolean inLoop) {
171 SLStatementNode result;
172 result = null;
173 switch (la.kind) {
174 case 13: {
175 result = WhileStatement();
176 break;
177 }
178 case 10: {
179 Get();
180 if (inLoop) { result = factory.createBreak(t); } else { SemErr("break used outside of loop"); }
181 Expect(11);
182 break;
183 }
184 case 12: {
185 Get();
186 if (inLoop) { result = factory.createContinue(t); } else { SemErr("continue used outside of loop"); }
187 Expect(11);
188 break;
189 }
190 case 14: {
191 result = IfStatement(inLoop);
192 break;
193 }
194 case 16: {
195 result = ReturnStatement();
196 break;
197 }
198 case 1: case 2: case 3: case 5: {
199 result = Expression();
200 Expect(11);
201 break;
202 }
203 default: SynErr(32); break;
204 }
205 return result;
206 }
207
208 SLStatementNode WhileStatement() {
209 SLStatementNode result;
210 Expect(13);
211 Token whileToken = t;
212 Expect(5);
213 SLExpressionNode condition = Expression();
214 Expect(7);
215 SLStatementNode body = Block(true);
216 result = factory.createWhile(whileToken, condition, body);
217 return result;
218 }
219
220 SLStatementNode IfStatement(boolean inLoop) {
221 SLStatementNode result;
222 Expect(14);
223 Token ifToken = t;
224 Expect(5);
225 SLExpressionNode condition = Expression();
226 Expect(7);
227 SLStatementNode thenPart = Block(inLoop);
228 SLStatementNode elsePart = null;
229 if (la.kind == 15) {
230 Get();
231 elsePart = Block(inLoop);
232 }
233 result = factory.createIf(ifToken, condition, thenPart, elsePart);
234 return result;
235 }
236
237 SLStatementNode ReturnStatement() {
238 SLStatementNode result;
239 Expect(16);
240 Token returnToken = t;
241 SLExpressionNode value = null;
242 if (StartOf(2)) {
243 value = Expression();
244 }
245 result = factory.createReturn(returnToken, value);
246 Expect(11);
247 return result;
248 }
249
250 SLExpressionNode Expression() {
251 SLExpressionNode result;
252 result = LogicTerm();
253 while (la.kind == 17) {
254 Get();
255 Token op = t;
256 SLExpressionNode right = LogicTerm();
257 result = factory.createBinary(op, result, right);
258 }
259 return result;
260 }
261
262 SLExpressionNode LogicTerm() {
263 SLExpressionNode result;
264 result = LogicFactor();
265 while (la.kind == 18) {
266 Get();
267 Token op = t;
268 SLExpressionNode right = LogicFactor();
269 result = factory.createBinary(op, result, right);
270 }
271 return result;
272 }
273
274 SLExpressionNode LogicFactor() {
275 SLExpressionNode result;
276 result = Arithmetic();
277 if (StartOf(3)) {
278 switch (la.kind) {
279 case 19: {
280 Get();
281 break;
282 }
283 case 20: {
284 Get();
285 break;
286 }
287 case 21: {
288 Get();
289 break;
290 }
291 case 22: {
292 Get();
293 break;
294 }
295 case 23: {
296 Get();
297 break;
298 }
299 case 24: {
300 Get();
301 break;
302 }
303 }
304 Token op = t;
305 SLExpressionNode right = Arithmetic();
306 result = factory.createBinary(op, result, right);
307 }
308 return result;
309 }
310
311 SLExpressionNode Arithmetic() {
312 SLExpressionNode result;
313 result = Term();
314 while (la.kind == 25 || la.kind == 26) {
315 if (la.kind == 25) {
316 Get();
317 } else {
318 Get();
319 }
320 Token op = t;
321 SLExpressionNode right = Term();
322 result = factory.createBinary(op, result, right);
323 }
324 return result;
325 }
326
327 SLExpressionNode Term() {
328 SLExpressionNode result;
329 result = Factor();
330 while (la.kind == 27 || la.kind == 28) {
331 if (la.kind == 27) {
332 Get();
333 } else {
334 Get();
335 }
336 Token op = t;
337 SLExpressionNode right = Factor();
338 result = factory.createBinary(op, result, right);
339 }
340 return result;
341 }
342
343 SLExpressionNode Factor() {
344 SLExpressionNode result;
345 result = null;
346 if (la.kind == 1) {
347 Get();
348 if (la.kind == 5 || la.kind == 29 || la.kind == 30) {
349 result = MemberExpression(null, null, t);
350 } else if (StartOf(4)) {
351 result = factory.createRead(t);
352 } else SynErr(33);
353 } else if (la.kind == 2) {
354 Get();
355 result = factory.createStringLiteral(t);
356 } else if (la.kind == 3) {
357 Get();
358 result = factory.createNumericLiteral(t);
359 } else if (la.kind == 5) {
360 Get();
361 int start = t.charPos;
362 result = Expression();
363 SLExpressionNode expr = result;
364 Expect(7);
365 int length = (t.charPos + t.val.length()) - start;
366 result = factory.createParenExpression(expr, start, length);
367 } else SynErr(34);
368 return result;
369 }
370
371 SLExpressionNode MemberExpression(SLExpressionNode r, SLExpressionNode assignmentReceiver, Token assignmentName) {
372 SLExpressionNode result;
373 result = null;
374 SLExpressionNode receiver = r;
375 Token nestedAssignmentName = null;
376 if (la.kind == 5) {
377 Get();
378 List<SLExpressionNode> parameters = new ArrayList<>();
379 SLExpressionNode parameter;
380 if (receiver == null) {
381 receiver = factory.createRead(assignmentName);
382 }
383 if (StartOf(2)) {
384 parameter = Expression();
385 parameters.add(parameter);
386 while (la.kind == 6) {
387 Get();
388 parameter = Expression();
389 parameters.add(parameter);
390 }
391 }
392 Expect(7);
393 Token finalToken = t;
394 result = factory.createCall(receiver, parameters, finalToken);
395 } else if (la.kind == 29) {
396 Get();
397 SLExpressionNode value = Expression();
398 if (assignmentName == null) {
399 SemErr("invalid assignment target");
400 } else if (assignmentReceiver == null) {
401 result = factory.createAssignment(assignmentName, value);
402 } else {
403 result = factory.createWriteProperty(assignmentReceiver, assignmentName, value);
404 }
405 } else if (la.kind == 30) {
406 Get();
407 if (receiver == null) {
408 receiver = factory.createRead(assignmentName);
409 }
410 Expect(1);
411 result = factory.createReadProperty(receiver, t);
412 nestedAssignmentName = t;
413 } else SynErr(35);
414 if (la.kind == 5 || la.kind == 29 || la.kind == 30) {
415 result = MemberExpression(result, receiver, nestedAssignmentName);
416 }
417 return result;
418 }
419
420
421
422 public void Parse() {
423 la = new Token();
424 la.val = "";
425 Get();
426 SimpleLanguage();
427 Expect(0);
428
429 }
430
431 private static final boolean[][] set = {
432 {_T,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x},
433 {_x,_T,_T,_T, _x,_T,_x,_x, _x,_x,_T,_x, _T,_T,_T,_x, _T,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x},
434 {_x,_T,_T,_T, _x,_T,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x},
435 {_x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_T, _T,_T,_T,_T, _T,_x,_x,_x, _x,_x,_x,_x, _x},
436 {_x,_x,_x,_x, _x,_T,_T,_T, _x,_x,_x,_T, _x,_x,_x,_x, _x,_T,_T,_T, _T,_T,_T,_T, _T,_T,_T,_T, _T,_T,_T,_x, _x}
437
438 };
439
440 public static void parseSL(SLContext context, Source source) {
441 Parser parser = new Parser(context, source);
442 parser.Parse();
443 if (parser.errors.errors.size() > 0) {
444 StringBuilder msg = new StringBuilder("Error(s) parsing script:\n");
445 for (String error : parser.errors.errors) {
446 msg.append(error).append("\n");
447 }
448 throw new SLException(msg.toString());
449 }
450 }
451 } // end Parser
452
453 class Errors {
454
455 protected final List<String> errors = new ArrayList<>();
456 public String errMsgFormat = "-- line {0} col {1}: {2}"; // 0=line, 1=column, 2=text
457
458 protected void printMsg(int line, int column, String msg) {
459 StringBuffer b = new StringBuffer(errMsgFormat);
460 int pos = b.indexOf("{0}");
461 if (pos >= 0) {
462 b.delete(pos, pos + 3);
463 b.insert(pos, line);
464 }
465 pos = b.indexOf("{1}");
466 if (pos >= 0) {
467 b.delete(pos, pos + 3);
468 b.insert(pos, column);
469 }
470 pos = b.indexOf("{2}");
471 if (pos >= 0)
472 b.replace(pos, pos + 3, msg);
473 errors.add(b.toString());
474 }
475
476 public void SynErr(int line, int col, int n) {
477 String s;
478 switch (n) {
479 case 0: s = "EOF expected"; break;
480 case 1: s = "identifier expected"; break;
481 case 2: s = "stringLiteral expected"; break;
482 case 3: s = "numericLiteral expected"; break;
483 case 4: s = "\"function\" expected"; break;
484 case 5: s = "\"(\" expected"; break;
485 case 6: s = "\",\" expected"; break;
486 case 7: s = "\")\" expected"; break;
487 case 8: s = "\"{\" expected"; break;
488 case 9: s = "\"}\" expected"; break;
489 case 10: s = "\"break\" expected"; break;
490 case 11: s = "\";\" expected"; break;
491 case 12: s = "\"continue\" expected"; break;
492 case 13: s = "\"while\" expected"; break;
493 case 14: s = "\"if\" expected"; break;
494 case 15: s = "\"else\" expected"; break;
495 case 16: s = "\"return\" expected"; break;
496 case 17: s = "\"||\" expected"; break;
497 case 18: s = "\"&&\" expected"; break;
498 case 19: s = "\"<\" expected"; break;
499 case 20: s = "\"<=\" expected"; break;
500 case 21: s = "\">\" expected"; break;
501 case 22: s = "\">=\" expected"; break;
502 case 23: s = "\"==\" expected"; break;
503 case 24: s = "\"!=\" expected"; break;
504 case 25: s = "\"+\" expected"; break;
505 case 26: s = "\"-\" expected"; break;
506 case 27: s = "\"*\" expected"; break;
507 case 28: s = "\"/\" expected"; break;
508 case 29: s = "\"=\" expected"; break;
509 case 30: s = "\".\" expected"; break;
510 case 31: s = "??? expected"; break;
511 case 32: s = "invalid Statement"; break;
512 case 33: s = "invalid Factor"; break;
513 case 34: s = "invalid Factor"; break;
514 case 35: s = "invalid MemberExpression"; break;
515 default:
516 s = "error " + n;
517 break;
518 }
519 printMsg(line, col, s);
520 }
521
522 public void SemErr(int line, int col, String s) {
523 printMsg(line, col, s);
524 }
525
526 public void SemErr(String s) {
527 errors.add(s);
528 }
529
530 public void Warning(int line, int col, String s) {
531 printMsg(line, col, s);
532 }
533
534 public void Warning(String s) {
535 errors.add(s);
536 }
537 } // Errors
538
539 class FatalError extends RuntimeException {
540
541 public static final long serialVersionUID = 1L;
542
543 public FatalError(String s) {
544 super(s);
545 }
546 }