2 import MCC.IR.ParseNode;
3 import MCC.IR.ParseNodeVector;
8 public static boolean errors;
9 public static boolean debug;
11 // debugMessage: writes debug production message only if debug = true
13 void debugMessage (String production) {
15 System.out.println("Applying production: " + production);
19 String unescape (String str) {
20 StringBuffer sb = new StringBuffer();
22 // Note that we skip the first and last characters (they're "'s)
23 for (i = 1; i < str.length() - 1; i++) {
24 if (str.charAt(i) == '\\') {
26 switch (str.charAt(i)) {
43 System.err.print("Error in string literal: ");
44 System.err.println(str.charAt(i));
45 System.err.println("Aborting...");
49 sb.append(str.charAt(i));
60 public String filename;
62 public void syntax_error (java_cup.runtime.Symbol current) {
64 CUP$CDLParser$actions.errors = true;
65 Symbol symbol = (Symbol) current;
67 boolean isInteger = true;
69 Integer.parseInt(current.value.toString());
70 } catch(NumberFormatException e) { isInteger = false;}
72 report_error(filename+":"+(symbol.line+1)+": Syntax error at column "
73 + (LineCount.getColumn(symbol.left)+1) +": " + current.value, current);
76 if (current.value.equals("true") || isInteger)
77 System.out.println("Did you mean literal("+current.value+")?");
84 public void report_fatal_error (String message, Object info) {
87 report_error(message, info);
88 CUP$CDLParser$actions.errors = true;
91 public int curPos () {
92 return cur_token.left;
95 public int curLine (int back) {
96 Stack st = new Stack();
99 for (i = 0; i < back; i++) {
100 st.push(stack.pop());
103 java_cup.runtime.Symbol s;
104 s = (java_cup.runtime.Symbol) st.peek();
106 for (i = 0; i < back; i++) {
107 stack.push(st.pop());
110 return LineCount.getLine(s.left);
115 // TERMINALS /////////////////////////////////////////////////////////////
120 terminal String DECIMAL;
121 terminal String CHAR;
122 terminal String STRING;
128 terminal OPENBRACKET;
129 terminal CLOSEBRACKET;
198 // NON-TERMINALS /////////////////////////////////////////////////////////
202 ------------------------------------------------------------------------*/
203 nonterminal ParseNode constraints;
204 nonterminal ParseNode constraint;
205 nonterminal ParseNode optcrash;
206 nonterminal ParseNode quantifiers;
207 nonterminal ParseNode quantifier;
208 nonterminal ParseNode set;
209 nonterminal ParseNode listofliterals;
210 nonterminal ParseNode literal;
211 nonterminal ParseNode body;
212 nonterminal ParseNode predicate;
213 nonterminal ParseNode setexpr;
215 nonterminal ParseNode compare;
216 nonterminal ParseNode expr;
217 nonterminal ParseNode addsuboperator;
218 nonterminal ParseNode multdivoperator;
224 precedence left EQ, NE;
225 precedence left LT, LE, GE, GT;
227 precedence left ADD, SUB;
228 precedence left MULT, DIV;
232 precedence left DOT, DOTINV;
234 // PRODUCTION RULES /////////////////////////////////////////////////////
238 constraints:constraints constraint:constraint
240 debugMessage(PRODSTRING);
241 constraints.addChild(constraint);
242 RESULT = constraints;
245 | constraint:constraint
247 debugMessage(PRODSTRING);
248 ParseNode constraints = new ParseNode("constraints", parser.curLine(1));
249 constraints.addChild(constraint);
250 RESULT = constraints;
256 optcrash:crash OPENBRACKET quantifiers:quantifiers CLOSEBRACKET COMMA body:body SEMICOLON
258 debugMessage(PRODSTRING);
259 ParseNode constraint = new ParseNode("constraint", parser.curLine(7));
261 constraint.addChild(crash);
263 if (quantifiers != null) {
264 constraint.addChild(quantifiers);
266 constraint.addChild(body);
275 debugMessage(PRODSTRING);
276 RESULT = new ParseNode("crash", parser.curLine(1));
281 debugMessage(PRODSTRING);
288 quantifiers:quantifiers COMMA quantifier:quantifier
290 debugMessage(PRODSTRING);
291 quantifiers.addChild(quantifier);
292 RESULT = quantifiers;
295 | quantifier:quantifier
297 debugMessage(PRODSTRING);
298 ParseNode quantifiers = new ParseNode("quantifiers", parser.curLine(1));
299 quantifiers.addChild(quantifier);
300 RESULT = quantifiers;
305 debugMessage(PRODSTRING);
312 FORALL ID:var IN set:set
314 debugMessage(PRODSTRING);
315 ParseNode q = new ParseNode("quantifier", parser.curLine(4));
316 q.addChild("forall", parser.curLine(4));
317 q.addChild("var", parser.curLine(3)).addChild(var);
321 | FORALL LT ID:r1 COMMA ID:r2 GT IN ID:relation
323 debugMessage(PRODSTRING);
324 ParseNode q = new ParseNode("quantifier", parser.curLine(7));
325 q.addChild("relation", parser.curLine(1)).addChild(relation);
326 q.addChild("left", parser.curLine(5)).addChild(r1);
327 q.addChild("right", parser.curLine(3)).addChild(r2);
336 debugMessage(PRODSTRING);
337 ParseNode set = new ParseNode("set", parser.curLine(1));
338 set.addChild("name").addChild(setname);
342 | OPENBRACE listofliterals:list CLOSEBRACE
344 debugMessage(PRODSTRING);
345 ParseNode set = new ParseNode("set", parser.curLine(3));
353 listofliterals:list COMMA literal:literal
355 debugMessage(PRODSTRING);
356 list.addChild(literal);
362 debugMessage(PRODSTRING);
363 ParseNode list = new ParseNode("listofliterals", parser.curLine(1));
364 list.addChild(literal);
371 body:body1 AND body:body2
373 debugMessage(PRODSTRING);
374 ParseNode body = new ParseNode("body", parser.curLine(3));
375 body.addChild("and").addChild("left", parser.curLine(3)).addChild(body1);
376 body.getChild("and").addChild("right", parser.curLine(1)).addChild(body2);
380 | body:body1 OR body:body2
382 debugMessage(PRODSTRING);
383 ParseNode body = new ParseNode("body", parser.curLine(3));
384 body.addChild("or").addChild("left", parser.curLine(3)).addChild(body1);
385 body.getChild("or").addChild("right", parser.curLine(1)).addChild(body2);
391 debugMessage(PRODSTRING);
392 ParseNode body = new ParseNode("body", parser.curLine(2));
393 body.addChild("not").addChild(body1);
397 | OPENPAREN body:body CLOSEPAREN
399 debugMessage(PRODSTRING);
403 | predicate:predicate
405 debugMessage(PRODSTRING);
406 ParseNode body = new ParseNode("body", parser.curLine(1));
407 body.addChild(predicate);
414 expr:expr IN setexpr:setexpr
416 debugMessage(PRODSTRING);
417 ParseNode inclusion = (new ParseNode("predicate", parser.curLine(3))).addChild("inclusion");
418 inclusion.addChild(expr);
419 inclusion.addChild(setexpr);
420 RESULT = inclusion.getRoot();
423 | expr:lexpr compare:compare expr:rexpr
425 debugMessage(PRODSTRING);
426 ParseNode comparison = (new ParseNode("predicate", parser.curLine(3))).addChild("expr").addChild("operator");
427 comparison.addChild("op").addChild(compare);
428 comparison.addChild("left", parser.curLine(2)).addChild(lexpr);
429 comparison.addChild("right", parser.curLine(2)).addChild(rexpr);
430 RESULT = comparison.getRoot();
439 debugMessage(PRODSTRING);
440 ParseNode set = new ParseNode("setexpr", parser.curLine(1));
441 set.addChild("set").addChild(setname);
445 | ID:var DOT ID:relation
447 debugMessage(PRODSTRING);
448 ParseNode set = new ParseNode("setexpr", parser.curLine(3));
449 set.addChild("dot").addChild("quantifiervar", parser.curLine(3)).addChild(var);
450 set.getChild("dot").addChild("relation", parser.curLine(1)).addChild(relation);
454 | ID:var DOTINV ID:relation
456 debugMessage(PRODSTRING);
457 ParseNode set = new ParseNode("setexpr", parser.curLine(3));
458 set.addChild("dotinv").addChild("quantifiervar", parser.curLine(3)).addChild(var);
459 set.getChild("dotinv").addChild("relation", parser.curLine(1)).addChild(relation);
463 | setexpr:setexpr DOT ID:relation
465 debugMessage(PRODSTRING);
466 ParseNode set = new ParseNode("setexpr", parser.curLine(3));
467 set.addChild("dotset").addChild(setexpr);
468 set.getChild("dotset").addChild("relation", parser.curLine(1)).addChild(relation);
472 | setexpr:setexpr DOTINV ID:relation
474 debugMessage(PRODSTRING);
475 ParseNode set = new ParseNode("setexpr", parser.curLine(3));
476 set.addChild("dotinvset").addChild(setexpr);
477 set.getChild("dotinvset").addChild("relation", parser.curLine(1)).addChild(relation);
484 SUM OPENPAREN ID:set DOT ID:relation CLOSEPAREN
486 debugMessage(PRODSTRING);
487 ParseNode expr = new ParseNode("expr", parser.curLine(1));
488 expr.addChild("sumexpr", parser.curLine(3));
489 expr.getChild("sumexpr").addChild("dot").addChild("set", parser.curLine(3)).addChild(set);
490 expr.getChild("sumexpr").getChild("dot").addChild("relation", parser.curLine(1)).addChild(relation);
496 debugMessage(PRODSTRING);
497 ParseNode expr = new ParseNode("expr", parser.curLine(1));
498 expr.addChild("var").addChild(var);
502 | OPENPAREN expr:expr CLOSEPAREN
504 debugMessage(PRODSTRING);
510 debugMessage(PRODSTRING);
511 ParseNode expr = new ParseNode("expr", parser.curLine(4));
512 expr.addChild(literal);
516 | expr:expr DOT ID:relname
518 debugMessage(PRODSTRING);
519 ParseNode relation = (new ParseNode("expr", parser.curLine(3))).addChild("relation");
520 relation.addChild(expr);
521 relation.addChild("name").addChild(relname);
522 RESULT = relation.getRoot();
525 | expr:expr DOTINV ID:relname
527 debugMessage(PRODSTRING);
528 ParseNode relation = (new ParseNode("expr", parser.curLine(3))).addChild("relation");
529 relation.addChild(expr);
530 relation.addChild("name").addChild(relname);
531 relation.addChild("inv");
532 RESULT = relation.getRoot();
535 | expr:expr1 addsuboperator:operator expr:expr2
537 debugMessage(PRODSTRING);
538 ParseNode op = (new ParseNode("expr", parser.curLine(3))).addChild("operator");
539 op.addChild("op").addChild(operator);
540 op.addChild("left", parser.curLine(3)).addChild(expr1);
541 op.addChild("right", parser.curLine(1)).addChild(expr2);
542 RESULT = op.getRoot();
545 | expr:expr1 multdivoperator:operator expr:expr2
547 debugMessage(PRODSTRING);
548 ParseNode op = (new ParseNode("expr", parser.curLine(3))).addChild("operator");
549 op.addChild("op").addChild(operator);
550 op.addChild("left", parser.curLine(3)).addChild(expr1);
551 op.addChild("right", parser.curLine(1)).addChild(expr2);
552 RESULT = op.getRoot();
555 | SIZEOF OPENPAREN setexpr:setexpr CLOSEPAREN
557 ParseNode sizeof = (new ParseNode("expr", parser.curLine(4))).addChild("sizeof");
558 sizeof.addChild(setexpr);
559 RESULT = sizeof.getRoot();
567 debugMessage(PRODSTRING);
568 RESULT = new ParseNode("add", parser.curLine(1));
573 debugMessage(PRODSTRING);
574 RESULT = new ParseNode("sub", parser.curLine(1));
580 debugMessage(PRODSTRING);
581 RESULT = new ParseNode("mult", parser.curLine(1));
585 debugMessage(PRODSTRING);
586 RESULT = new ParseNode("div", parser.curLine(1));
594 debugMessage(PRODSTRING);
595 RESULT = new ParseNode("lt", parser.curLine(1));
600 debugMessage(PRODSTRING);
601 RESULT = new ParseNode("gt", parser.curLine(1));
606 debugMessage(PRODSTRING);
607 RESULT = new ParseNode("le", parser.curLine(1));
612 debugMessage(PRODSTRING);
613 RESULT = new ParseNode("ge", parser.curLine(1));
618 debugMessage(PRODSTRING);
619 RESULT = new ParseNode("eq", parser.curLine(1));
624 debugMessage(PRODSTRING);
625 RESULT = new ParseNode("ne", parser.curLine(1));
633 debugMessage(PRODSTRING);
634 RESULT = (new ParseNode("literal", parser.curLine(1))).addChild("boolean").addChild("true").getRoot();
639 debugMessage(PRODSTRING);
640 RESULT = (new ParseNode("literal", parser.curLine(1))).addChild("boolean").addChild("false").getRoot();
645 debugMessage(PRODSTRING);
646 RESULT = (new ParseNode("literal", parser.curLine(1))).addChild("decimal").addChild("0").getRoot();
651 debugMessage(PRODSTRING);
652 RESULT = (new ParseNode("literal", parser.curLine(1))).addChild("decimal").addChild(dec).getRoot();
657 debugMessage(PRODSTRING);
658 RESULT = (new ParseNode("literal", parser.curLine(1))).addChild("decimal").addChild("-"+dec).getRoot();
663 debugMessage(PRODSTRING);
664 RESULT = (new ParseNode("literal", parser.curLine(1))).addChild("string").addChild(str).getRoot();
669 debugMessage(PRODSTRING);
670 RESULT = (new ParseNode("literal", parser.curLine(1))).addChild("char").addChild(chr).getRoot();
673 | LITERAL OPENPAREN ID:literal CLOSEPAREN
675 debugMessage(PRODSTRING);
676 RESULT = (new ParseNode("literal", parser.curLine(1))).addChild("token").addChild(literal).getRoot();