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 void syntax_error (java_cup.runtime.Symbol current) {
62 CUP$MDLParser$actions.errors = true;
63 Symbol symbol = (Symbol) current;
64 report_error("MDL: Syntax error at line " + (symbol.line + 1)
65 + ", column " + LineCount.getColumn(symbol.left) + ": " + current.value, current);
68 public void report_fatal_error (String message, Object info) {
71 report_error(message, info);
72 CUP$MDLParser$actions.errors = true;
75 public int curPos () {
76 return cur_token.left;
79 public int curLine (int back) {
80 Stack st = new Stack();
83 for (i = 0; i < back; i++) {
87 java_cup.runtime.Symbol s;
88 s = (java_cup.runtime.Symbol) st.peek();
90 for (i = 0; i < back; i++) {
94 return LineCount.getLine(s.left);
99 // TERMINALS /////////////////////////////////////////////////////////////
104 terminal String DECIMAL;
105 terminal String CHAR;
106 terminal String STRING;
112 terminal OPENBRACKET;
113 terminal CLOSEBRACKET;
178 // NON-TERMINALS /////////////////////////////////////////////////////////
182 ------------------------------------------------------------------------*/
184 nonterminal ParseNode rules;
185 nonterminal ParseNode rule;
186 nonterminal ParseNode ruletype;
187 nonterminal ParseNode optquantifiers;
188 nonterminal ParseNode quantifiers;
189 nonterminal ParseNode quantifier;
190 nonterminal ParseNode inclusion;
191 nonterminal ParseNode expr;
192 nonterminal ParseNode literal;
194 nonterminal ParseNode simple_expr;
195 nonterminal ParseNode location;
197 nonterminal ParseNode set;
198 nonterminal ParseNode listofliterals;
200 precedence nonassoc OR;
201 precedence nonassoc AND;
203 precedence nonassoc EQ, NE;
204 precedence nonassoc LT, LE, GE, GT;
206 precedence left INTEST;
208 precedence left ADD, SUB;
209 precedence left MULT, DIV;
213 // PRODUCTION RULES /////////////////////////////////////////////////////
219 rules:rules rule:rule
221 debugMessage(PRODSTRING);
222 rules.addChild(rule);
228 debugMessage(PRODSTRING);
229 ParseNode rules = new ParseNode("rules", parser.curLine(1));
230 rules.addChild(rule);
237 ruletype:ruletype OPENBRACKET optquantifiers:quantifiers CLOSEBRACKET
238 COMMA expr:guard IMPLIES inclusion:inclusion SEMICOLON
240 debugMessage(PRODSTRING);
241 ParseNode rule = new ParseNode("rule", parser.curLine(9));
242 if (ruletype != null) {
243 rule.addChild(ruletype);
245 if (quantifiers != null) {
246 rule.addChild(quantifiers);
248 rule.addChild(guard);
249 rule.addChild(inclusion);
258 debugMessage(PRODSTRING);
259 RESULT = new ParseNode("static", parser.curLine(1));
264 debugMessage(PRODSTRING);
265 RESULT = new ParseNode("delay", parser.curLine(1));
270 debugMessage(PRODSTRING);
277 quantifiers:quantifiers
279 debugMessage(PRODSTRING);
280 RESULT = quantifiers;
285 debugMessage(PRODSTRING);
292 quantifiers:quantifiers COMMA quantifier:quantifier
294 debugMessage(PRODSTRING);
295 quantifiers.addChild(quantifier);
296 RESULT = quantifiers;
299 | quantifier:quantifier
301 debugMessage(PRODSTRING);
302 ParseNode quantifiers = new ParseNode("quantifiers", parser.curLine(1));
303 quantifiers.addChild(quantifier);
304 RESULT = quantifiers;
310 FORALL ID:var IN set:set
312 debugMessage(PRODSTRING);
313 ParseNode q = new ParseNode("quantifier", parser.curLine(4));
314 q.addChild("forall", parser.curLine(4));
315 q.addChild("var", parser.curLine(3)).addChild(var);
320 | FORALL LT ID:r1 COMMA ID:r2 GT IN ID:relation
322 debugMessage(PRODSTRING);
323 ParseNode q = new ParseNode("quantifier", parser.curLine(7));
324 q.addChild("relation", parser.curLine(1)).addChild(relation);
325 q.addChild("left", parser.curLine(5)).addChild(r1);
326 q.addChild("right", parser.curLine(3)).addChild(r2);
330 | FOR ID:var EQ expr:lower TO expr:upper
332 debugMessage(PRODSTRING);
333 ParseNode q = new ParseNode("quantifier", parser.curLine(5));
335 q.addChild("var", parser.curLine(4)).addChild(var);
336 q.addChild("lower", parser.curLine(3)).addChild(lower);
337 q.addChild("upper", parser.curLine(1)).addChild(upper);
344 expr:expr IN ID:setname
346 debugMessage(PRODSTRING);
347 ParseNode set = (new ParseNode("inclusion", parser.curLine(3))).addChild("set");
349 set.addChild("name", parser.curLine(1)).addChild(setname);
350 RESULT = set.getRoot();
353 | LT expr:r1 COMMA expr:r2 GT IN ID:relationname
355 debugMessage(PRODSTRING);
356 ParseNode relation = (new ParseNode("inclusion", parser.curLine(7))).addChild("relation");
357 relation.addChild("left").addChild(r1);
358 relation.addChild("right").addChild(r2);
359 relation.addChild("name", parser.curLine(1)).addChild(relationname);
360 RESULT = relation.getRoot();
368 debugMessage(PRODSTRING);
369 ParseNode se = new ParseNode("simple_expr", parser.curLine(1));
370 se.addChild(location);
379 debugMessage(PRODSTRING);
380 ParseNode loc = new ParseNode("location", parser.curLine(1));
381 loc.addChild("var").addChild(var);
385 | simple_expr:dotexpr DOT ID:field
387 debugMessage(PRODSTRING);
388 ParseNode dot = (new ParseNode("location", parser.curLine(3))).addChild("dot");
389 dot.addChild(dotexpr);
390 dot.addChild("field", parser.curLine(1)).addChild(field);
391 RESULT = dot.getRoot();
394 | simple_expr:dotexpr DOT ID:field OPENBRACKET expr:index CLOSEBRACKET
396 debugMessage(PRODSTRING);
397 ParseNode dot = (new ParseNode("location", parser.curLine(6))).addChild("dot");
398 dot.addChild(dotexpr);
399 dot.addChild("field", parser.curLine(4)).addChild(field);
400 dot.addChild("index", parser.curLine(2)).addChild(index);
401 RESULT = dot.getRoot();
404 | CAST OPENPAREN ID:type COMMA simple_expr:expr CLOSEPAREN
406 debugMessage(PRODSTRING);
407 ParseNode cast = (new ParseNode("location", parser.curLine(6))).addChild("cast");
408 cast.addChild("type").addChild(type);
410 RESULT = cast.getRoot();
418 debugMessage(PRODSTRING);
419 ParseNode expr = new ParseNode("expr", parser.curLine(1));
424 | expr:expr INTEST ID:setname
426 debugMessage(PRODSTRING);
427 ParseNode elementof = (new ParseNode("expr", parser.curLine(3))).addChild("elementof");
428 elementof.addChild(expr);
429 elementof.addChild("name").addChild(setname);
430 RESULT = elementof.getRoot();
433 | LT expr:r1 COMMA expr:r2 GT INTEST ID:relationname
435 debugMessage(PRODSTRING);
436 ParseNode tupleof = (new ParseNode("expr", parser.curLine(7))).addChild("tupleof");
437 tupleof.addChild("left").addChild(r1);
438 tupleof.addChild("right").addChild(r2);
439 tupleof.addChild("name").addChild(relationname);
440 RESULT = tupleof.getRoot();
443 | OPENPAREN expr:expr CLOSEPAREN
445 debugMessage(PRODSTRING);
449 | LITERAL OPENPAREN literal:literal CLOSEPAREN
451 debugMessage(PRODSTRING);
452 ParseNode expr = new ParseNode("expr", parser.curLine(4));
453 expr.addChild(literal);
457 | expr:leftexpr LT expr:rightexpr
459 debugMessage(PRODSTRING);
460 ParseNode bool = (new ParseNode("expr", parser.curLine(3))).addChild("operator");
461 bool.addChild("op").addChild("lt");
462 bool.addChild("left", parser.curLine(3)).addChild(leftexpr);
463 bool.addChild("right", parser.curLine(1)).addChild(rightexpr);
464 RESULT = bool.getRoot();
467 | expr:leftexpr LE expr:rightexpr
469 debugMessage(PRODSTRING);
470 ParseNode bool = (new ParseNode("expr", parser.curLine(3))).addChild("operator");
471 bool.addChild("op").addChild("le");
472 bool.addChild("left", parser.curLine(3)).addChild(leftexpr);
473 bool.addChild("right", parser.curLine(1)).addChild(rightexpr);
474 RESULT = bool.getRoot();
477 | expr:leftexpr GT expr:rightexpr
479 debugMessage(PRODSTRING);
480 ParseNode bool = (new ParseNode("expr", parser.curLine(3))).addChild("operator");
481 bool.addChild("op").addChild("gt");
482 bool.addChild("left", parser.curLine(3)).addChild(leftexpr);
483 bool.addChild("right", parser.curLine(1)).addChild(rightexpr);
484 RESULT = bool.getRoot();
487 | expr:leftexpr GE expr:rightexpr
489 debugMessage(PRODSTRING);
490 ParseNode bool = (new ParseNode("expr", parser.curLine(3))).addChild("operator");
491 bool.addChild("op").addChild("ge");
492 bool.addChild("left", parser.curLine(3)).addChild(leftexpr);
493 bool.addChild("right", parser.curLine(1)).addChild(rightexpr);
494 RESULT = bool.getRoot();
497 | expr:leftexpr EQ expr:rightexpr
499 debugMessage(PRODSTRING);
500 ParseNode bool = (new ParseNode("expr", parser.curLine(3))).addChild("operator");
501 bool.addChild("op").addChild("eq");
502 bool.addChild("left", parser.curLine(3)).addChild(leftexpr);
503 bool.addChild("right", parser.curLine(1)).addChild(rightexpr);
504 RESULT = bool.getRoot();
507 | expr:leftexpr NE expr:rightexpr
509 debugMessage(PRODSTRING);
510 ParseNode bool = (new ParseNode("expr", parser.curLine(3))).addChild("operator");
511 bool.addChild("op").addChild("ne");
512 bool.addChild("left", parser.curLine(3)).addChild(leftexpr);
513 bool.addChild("right", parser.curLine(1)).addChild(rightexpr);
514 RESULT = bool.getRoot();
517 | expr:leftexpr ADD expr:rightexpr
519 debugMessage(PRODSTRING);
520 ParseNode bool = (new ParseNode("expr", parser.curLine(3))).addChild("operator");
521 bool.addChild("op").addChild("add");
522 bool.addChild("left", parser.curLine(3)).addChild(leftexpr);
523 bool.addChild("right", parser.curLine(1)).addChild(rightexpr);
524 RESULT = bool.getRoot();
527 | expr:leftexpr SUB expr:rightexpr
529 debugMessage(PRODSTRING);
530 ParseNode bool = (new ParseNode("expr", parser.curLine(3))).addChild("operator");
531 bool.addChild("op").addChild("sub");
532 bool.addChild("left", parser.curLine(3)).addChild(leftexpr);
533 bool.addChild("right", parser.curLine(1)).addChild(rightexpr);
534 RESULT = bool.getRoot();
537 | expr:leftexpr DIV expr:rightexpr
539 debugMessage(PRODSTRING);
540 ParseNode bool = (new ParseNode("expr", parser.curLine(3))).addChild("operator");
541 bool.addChild("op").addChild("div");
542 bool.addChild("left", parser.curLine(3)).addChild(leftexpr);
543 bool.addChild("right", parser.curLine(1)).addChild(rightexpr);
544 RESULT = bool.getRoot();
547 | expr:leftexpr MULT expr:rightexpr
549 debugMessage(PRODSTRING);
550 ParseNode bool = (new ParseNode("expr", parser.curLine(3))).addChild("operator");
551 bool.addChild("op").addChild("mult");
552 bool.addChild("left", parser.curLine(3)).addChild(leftexpr);
553 bool.addChild("right", parser.curLine(1)).addChild(rightexpr);
554 RESULT = bool.getRoot();
557 | expr:leftexpr AND expr:rightexpr
559 debugMessage(PRODSTRING);
560 ParseNode bool = (new ParseNode("expr", parser.curLine(3))).addChild("operator");
561 bool.addChild("op").addChild("and");
562 bool.addChild("left", parser.curLine(3)).addChild(leftexpr);
563 bool.addChild("right", parser.curLine(1)).addChild(rightexpr);
564 RESULT = bool.getRoot();
567 | expr:leftexpr OR expr:rightexpr
569 debugMessage(PRODSTRING);
570 ParseNode bool = (new ParseNode("expr", parser.curLine(3))).addChild("operator");
571 bool.addChild("op").addChild("and");
572 bool.addChild("left", parser.curLine(3)).addChild(leftexpr);
573 bool.addChild("right", parser.curLine(1)).addChild(rightexpr);
574 RESULT = bool.getRoot();
579 debugMessage(PRODSTRING);
580 ParseNode bool = (new ParseNode("expr", parser.curLine(3))).addChild("operator");
581 bool.addChild("op").addChild("not");
582 bool.addChild("left").addChild(expr);
583 RESULT = bool.getRoot();
586 | ISVALID OPENPAREN expr:innerexpr CLOSEPAREN
588 debugMessage(PRODSTRING);
589 ParseNode expr = new ParseNode("expr", parser.curLine(4));
590 expr.addChild("isvalid").addChild(innerexpr);
594 | ISVALID OPENPAREN expr:innerexpr COMMA ID:type CLOSEPAREN
596 debugMessage(PRODSTRING);
597 ParseNode isvalid = (new ParseNode("expr", parser.curLine(6))).addChild("isvalid");
598 isvalid.addChild(innerexpr);
599 isvalid.addChild("type", parser.curLine(2)).addChild(type);
600 RESULT = isvalid.getRoot();
604 /** standard *********************************/
609 debugMessage(PRODSTRING);
610 RESULT = (new ParseNode("literal", parser.curLine(1))).addChild("boolean").addChild("true").getRoot();
615 debugMessage(PRODSTRING);
616 RESULT = (new ParseNode("literal", parser.curLine(1))).addChild("decimal").addChild(dec).getRoot();
621 debugMessage(PRODSTRING);
622 RESULT = (new ParseNode("literal", parser.curLine(1))).addChild("string").addChild(str).getRoot();
627 debugMessage(PRODSTRING);
628 RESULT = (new ParseNode("literal", parser.curLine(1))).addChild("char").addChild(chr).getRoot();
633 debugMessage(PRODSTRING);
634 RESULT = (new ParseNode("literal", parser.curLine(1))).addChild("token").addChild(literal).getRoot();
642 debugMessage(PRODSTRING);
643 ParseNode set = new ParseNode("set", parser.curLine(1));
644 set.addChild("name").addChild(setname);
648 | OPENBRACE listofliterals:list CLOSEBRACE
650 debugMessage(PRODSTRING);
651 ParseNode set = new ParseNode("set", parser.curLine(3));
660 listofliterals:list COMMA literal:literal
662 debugMessage(PRODSTRING);
663 list.addChild(literal);
669 debugMessage(PRODSTRING);
670 ParseNode list = new ParseNode("listofliterals", parser.curLine(1));
671 list.addChild(literal);