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$MDLParser$actions.errors = true;
65 Symbol symbol = (Symbol) current;
67 //System.out.println("current.value = "+current.value + " " + current.value.equals("true"));
68 //System.out.println("current = " + current);
70 boolean isInteger = true;
72 Integer.parseInt(current.value.toString());
73 } catch(NumberFormatException e) { isInteger = false;}
75 report_error(filename+":"+(symbol.line+1)+": Syntax error at column "
76 + (LineCount.getColumn(symbol.left)+1) +": " + current.value, current);
78 if (current.value.equals("true") || isInteger)
79 System.out.println("Did you mean literal("+current.value+")?");
81 if (LineCount.getColumn(symbol.left) == 0)
82 System.out.println("Did you forget a semicolon on the previous line?");
89 public void report_fatal_error (String message, Object info) {
92 report_error(message, info);
93 CUP$MDLParser$actions.errors = true;
96 public int curPos () {
97 return cur_token.left;
100 public int curLine (int back) {
101 Stack st = new Stack();
104 for (i = 0; i < back; i++) {
105 st.push(stack.pop());
108 java_cup.runtime.Symbol s;
109 s = (java_cup.runtime.Symbol) st.peek();
111 for (i = 0; i < back; i++) {
112 stack.push(st.pop());
115 return LineCount.getLine(s.left);
120 // TERMINALS /////////////////////////////////////////////////////////////
125 terminal String DECIMAL;
126 terminal String CHAR;
127 terminal String STRING;
133 terminal OPENBRACKET;
134 terminal CLOSEBRACKET;
200 // NON-TERMINALS /////////////////////////////////////////////////////////
204 ------------------------------------------------------------------------*/
206 nonterminal ParseNode rules;
207 nonterminal ParseNode rule;
208 nonterminal ParseNode ruletype;
209 nonterminal ParseNode optquantifiers;
210 nonterminal ParseNode quantifiers;
211 nonterminal ParseNode quantifier;
212 nonterminal ParseNode inclusion;
213 nonterminal ParseNode expr;
214 nonterminal ParseNode literal;
216 nonterminal ParseNode simple_expr;
217 nonterminal ParseNode location;
219 nonterminal ParseNode set;
220 nonterminal ParseNode listofliterals;
222 precedence nonassoc OR;
223 precedence nonassoc AND;
225 precedence nonassoc EQ, NE;
226 precedence nonassoc LT, LE, GE, GT;
228 precedence left INTEST;
230 precedence left ADD, SUB;
231 precedence left MULT, DIV;
235 // PRODUCTION RULES /////////////////////////////////////////////////////
241 rules:rules rule:rule
243 debugMessage(PRODSTRING);
244 rules.addChild(rule);
250 debugMessage(PRODSTRING);
251 ParseNode rules = new ParseNode("rules", parser.curLine(1));
252 rules.addChild(rule);
259 ruletype:ruletype OPENBRACKET optquantifiers:quantifiers CLOSEBRACKET
260 COMMA expr:guard IMPLIES inclusion:inclusion SEMICOLON
262 debugMessage(PRODSTRING);
263 ParseNode rule = new ParseNode("rule", parser.curLine(9));
264 if (ruletype != null) {
265 rule.addChild(ruletype);
267 if (quantifiers != null) {
268 rule.addChild(quantifiers);
270 rule.addChild(guard);
271 rule.addChild(inclusion);
280 debugMessage(PRODSTRING);
281 RESULT = new ParseNode("static", parser.curLine(1));
286 debugMessage(PRODSTRING);
287 RESULT = new ParseNode("delay", parser.curLine(1));
292 debugMessage(PRODSTRING);
299 quantifiers:quantifiers
301 debugMessage(PRODSTRING);
302 RESULT = quantifiers;
307 debugMessage(PRODSTRING);
314 quantifiers:quantifiers COMMA quantifier:quantifier
316 debugMessage(PRODSTRING);
317 quantifiers.addChild(quantifier);
318 RESULT = quantifiers;
321 | quantifier:quantifier
323 debugMessage(PRODSTRING);
324 ParseNode quantifiers = new ParseNode("quantifiers", parser.curLine(1));
325 quantifiers.addChild(quantifier);
326 RESULT = quantifiers;
332 FORALL ID:var IN set:set
334 debugMessage(PRODSTRING);
335 ParseNode q = new ParseNode("quantifier", parser.curLine(4));
336 q.addChild("forall", parser.curLine(4));
337 q.addChild("var", parser.curLine(3)).addChild(var);
342 | FORALL LT ID:r1 COMMA ID:r2 GT IN ID:relation
344 debugMessage(PRODSTRING);
345 ParseNode q = new ParseNode("quantifier", parser.curLine(7));
346 q.addChild("relation", parser.curLine(1)).addChild(relation);
347 q.addChild("left", parser.curLine(5)).addChild(r1);
348 q.addChild("right", parser.curLine(3)).addChild(r2);
352 | FOR ID:var EQ expr:lower TO expr:upper
354 debugMessage(PRODSTRING);
355 ParseNode q = new ParseNode("quantifier", parser.curLine(5));
357 q.addChild("var", parser.curLine(4)).addChild(var);
358 q.addChild("lower", parser.curLine(3)).addChild(lower);
359 q.addChild("upper", parser.curLine(1)).addChild(upper);
366 expr:expr IN ID:setname
368 debugMessage(PRODSTRING);
369 ParseNode set = (new ParseNode("inclusion", parser.curLine(3))).addChild("set");
371 set.addChild("name", parser.curLine(1)).addChild(setname);
372 RESULT = set.getRoot();
375 | LT expr:r1 COMMA expr:r2 GT IN ID:relationname
377 debugMessage(PRODSTRING);
378 ParseNode relation = (new ParseNode("inclusion", parser.curLine(7))).addChild("relation");
379 relation.addChild("left").addChild(r1);
380 relation.addChild("right").addChild(r2);
381 relation.addChild("name", parser.curLine(1)).addChild(relationname);
382 RESULT = relation.getRoot();
390 debugMessage(PRODSTRING);
391 ParseNode se = new ParseNode("simple_expr", parser.curLine(1));
392 se.addChild(location);
401 debugMessage(PRODSTRING);
402 ParseNode loc = new ParseNode("location", parser.curLine(1));
403 loc.addChild("var").addChild(var);
407 | simple_expr:dotexpr DOT ID:field
409 debugMessage(PRODSTRING);
410 ParseNode dot = (new ParseNode("location", parser.curLine(3))).addChild("dot");
411 dot.addChild(dotexpr);
412 dot.addChild("field", parser.curLine(1)).addChild(field);
413 RESULT = dot.getRoot();
416 | simple_expr:dotexpr DOT ID:field OPENBRACKET expr:index CLOSEBRACKET
418 debugMessage(PRODSTRING);
419 ParseNode dot = (new ParseNode("location", parser.curLine(6))).addChild("dot");
420 dot.addChild(dotexpr);
421 dot.addChild("field", parser.curLine(4)).addChild(field);
422 dot.addChild("index", parser.curLine(2)).addChild(index);
423 RESULT = dot.getRoot();
426 | CAST OPENPAREN ID:type COMMA simple_expr:expr CLOSEPAREN
428 debugMessage(PRODSTRING);
429 ParseNode cast = (new ParseNode("location", parser.curLine(6))).addChild("cast");
430 cast.addChild("type").addChild(type);
432 RESULT = cast.getRoot();
440 debugMessage(PRODSTRING);
441 ParseNode expr = new ParseNode("expr", parser.curLine(1));
446 | expr:expr INTEST ID:setname
448 debugMessage(PRODSTRING);
449 ParseNode elementof = (new ParseNode("expr", parser.curLine(3))).addChild("elementof");
450 elementof.addChild(expr);
451 elementof.addChild("name").addChild(setname);
452 RESULT = elementof.getRoot();
455 | LT expr:r1 COMMA expr:r2 GT INTEST ID:relationname
457 debugMessage(PRODSTRING);
458 ParseNode tupleof = (new ParseNode("expr", parser.curLine(7))).addChild("tupleof");
459 tupleof.addChild("left").addChild(r1);
460 tupleof.addChild("right").addChild(r2);
461 tupleof.addChild("name").addChild(relationname);
462 RESULT = tupleof.getRoot();
465 | OPENPAREN expr:expr CLOSEPAREN
467 debugMessage(PRODSTRING);
473 debugMessage(PRODSTRING);
474 ParseNode expr = new ParseNode("expr", parser.curLine(4));
475 expr.addChild(literal);
480 | expr:leftexpr LT expr:rightexpr
482 debugMessage(PRODSTRING);
483 ParseNode bool = (new ParseNode("expr", parser.curLine(3))).addChild("operator");
484 bool.addChild("op").addChild("lt");
485 bool.addChild("left", parser.curLine(3)).addChild(leftexpr);
486 bool.addChild("right", parser.curLine(1)).addChild(rightexpr);
487 RESULT = bool.getRoot();
490 | expr:leftexpr LE expr:rightexpr
492 debugMessage(PRODSTRING);
493 ParseNode bool = (new ParseNode("expr", parser.curLine(3))).addChild("operator");
494 bool.addChild("op").addChild("le");
495 bool.addChild("left", parser.curLine(3)).addChild(leftexpr);
496 bool.addChild("right", parser.curLine(1)).addChild(rightexpr);
497 RESULT = bool.getRoot();
500 | expr:leftexpr GT expr:rightexpr
502 debugMessage(PRODSTRING);
503 ParseNode bool = (new ParseNode("expr", parser.curLine(3))).addChild("operator");
504 bool.addChild("op").addChild("gt");
505 bool.addChild("left", parser.curLine(3)).addChild(leftexpr);
506 bool.addChild("right", parser.curLine(1)).addChild(rightexpr);
507 RESULT = bool.getRoot();
510 | expr:leftexpr GE expr:rightexpr
512 debugMessage(PRODSTRING);
513 ParseNode bool = (new ParseNode("expr", parser.curLine(3))).addChild("operator");
514 bool.addChild("op").addChild("ge");
515 bool.addChild("left", parser.curLine(3)).addChild(leftexpr);
516 bool.addChild("right", parser.curLine(1)).addChild(rightexpr);
517 RESULT = bool.getRoot();
520 | expr:leftexpr EQ expr:rightexpr
522 debugMessage(PRODSTRING);
523 ParseNode bool = (new ParseNode("expr", parser.curLine(3))).addChild("operator");
524 bool.addChild("op").addChild("eq");
525 bool.addChild("left", parser.curLine(3)).addChild(leftexpr);
526 bool.addChild("right", parser.curLine(1)).addChild(rightexpr);
527 RESULT = bool.getRoot();
530 | expr:leftexpr NE expr:rightexpr
532 debugMessage(PRODSTRING);
533 ParseNode bool = (new ParseNode("expr", parser.curLine(3))).addChild("operator");
534 bool.addChild("op").addChild("ne");
535 bool.addChild("left", parser.curLine(3)).addChild(leftexpr);
536 bool.addChild("right", parser.curLine(1)).addChild(rightexpr);
537 RESULT = bool.getRoot();
540 | expr:leftexpr ADD expr:rightexpr
542 debugMessage(PRODSTRING);
543 ParseNode bool = (new ParseNode("expr", parser.curLine(3))).addChild("operator");
544 bool.addChild("op").addChild("add");
545 bool.addChild("left", parser.curLine(3)).addChild(leftexpr);
546 bool.addChild("right", parser.curLine(1)).addChild(rightexpr);
547 RESULT = bool.getRoot();
550 | expr:leftexpr SUB expr:rightexpr
552 debugMessage(PRODSTRING);
553 ParseNode bool = (new ParseNode("expr", parser.curLine(3))).addChild("operator");
554 bool.addChild("op").addChild("sub");
555 bool.addChild("left", parser.curLine(3)).addChild(leftexpr);
556 bool.addChild("right", parser.curLine(1)).addChild(rightexpr);
557 RESULT = bool.getRoot();
560 | expr:leftexpr DIV expr:rightexpr
562 debugMessage(PRODSTRING);
563 ParseNode bool = (new ParseNode("expr", parser.curLine(3))).addChild("operator");
564 bool.addChild("op").addChild("div");
565 bool.addChild("left", parser.curLine(3)).addChild(leftexpr);
566 bool.addChild("right", parser.curLine(1)).addChild(rightexpr);
567 RESULT = bool.getRoot();
570 | expr:leftexpr MULT expr:rightexpr
572 debugMessage(PRODSTRING);
573 ParseNode bool = (new ParseNode("expr", parser.curLine(3))).addChild("operator");
574 bool.addChild("op").addChild("mult");
575 bool.addChild("left", parser.curLine(3)).addChild(leftexpr);
576 bool.addChild("right", parser.curLine(1)).addChild(rightexpr);
577 RESULT = bool.getRoot();
580 | expr:leftexpr AND expr:rightexpr
582 debugMessage(PRODSTRING);
583 ParseNode bool = (new ParseNode("expr", parser.curLine(3))).addChild("operator");
584 bool.addChild("op").addChild("and");
585 bool.addChild("left", parser.curLine(3)).addChild(leftexpr);
586 bool.addChild("right", parser.curLine(1)).addChild(rightexpr);
587 RESULT = bool.getRoot();
590 | expr:leftexpr OR expr:rightexpr
592 debugMessage(PRODSTRING);
593 ParseNode bool = (new ParseNode("expr", parser.curLine(3))).addChild("operator");
594 bool.addChild("op").addChild("and");
595 bool.addChild("left", parser.curLine(3)).addChild(leftexpr);
596 bool.addChild("right", parser.curLine(1)).addChild(rightexpr);
597 RESULT = bool.getRoot();
602 debugMessage(PRODSTRING);
603 ParseNode bool = (new ParseNode("expr", parser.curLine(3))).addChild("operator");
604 bool.addChild("op").addChild("not");
605 bool.addChild("left").addChild(expr);
606 RESULT = bool.getRoot();
609 | ISVALID OPENPAREN expr:innerexpr CLOSEPAREN
611 debugMessage(PRODSTRING);
612 ParseNode expr = new ParseNode("expr", parser.curLine(4));
613 expr.addChild("isvalid").addChild(innerexpr);
617 | ISVALID OPENPAREN expr:innerexpr COMMA ID:type CLOSEPAREN
619 debugMessage(PRODSTRING);
620 ParseNode isvalid = (new ParseNode("expr", parser.curLine(6))).addChild("isvalid");
621 isvalid.addChild(innerexpr);
622 isvalid.addChild("type", parser.curLine(2)).addChild(type);
623 RESULT = isvalid.getRoot();
627 /** standard *********************************/
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("string").addChild(str).getRoot();
663 debugMessage(PRODSTRING);
664 RESULT = (new ParseNode("literal", parser.curLine(1))).addChild("char").addChild(chr).getRoot();
667 | LITERAL OPENPAREN ID:literal CLOSEPAREN
669 debugMessage(PRODSTRING);
670 RESULT = (new ParseNode("literal", parser.curLine(1))).addChild("token").addChild(literal).getRoot();
678 debugMessage(PRODSTRING);
679 ParseNode set = new ParseNode("set", parser.curLine(1));
680 set.addChild("name").addChild(setname);
684 | OPENBRACE listofliterals:list CLOSEBRACE
686 debugMessage(PRODSTRING);
687 ParseNode set = new ParseNode("set", parser.curLine(3));
696 listofliterals:list COMMA literal:literal
698 debugMessage(PRODSTRING);
699 list.addChild(literal);
705 debugMessage(PRODSTRING);
706 ParseNode list = new ParseNode("listofliterals", parser.curLine(1));
707 list.addChild(literal);