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;
66 report_error(filename+":"+(symbol.line+1)+": Syntax error at column " + LineCount.getColumn(symbol.left) +": " + current.value, current);
70 public void report_fatal_error (String message, Object info) {
73 report_error(message, info);
74 CUP$CDLParser$actions.errors = true;
77 public int curPos () {
78 return cur_token.left;
81 public int curLine (int back) {
82 Stack st = new Stack();
85 for (i = 0; i < back; i++) {
89 java_cup.runtime.Symbol s;
90 s = (java_cup.runtime.Symbol) st.peek();
92 for (i = 0; i < back; i++) {
96 return LineCount.getLine(s.left);
101 // TERMINALS /////////////////////////////////////////////////////////////
106 terminal String DECIMAL;
107 terminal String CHAR;
108 terminal String STRING;
114 terminal OPENBRACKET;
115 terminal CLOSEBRACKET;
182 // NON-TERMINALS /////////////////////////////////////////////////////////
186 ------------------------------------------------------------------------*/
187 nonterminal ParseNode constraints;
188 nonterminal ParseNode constraint;
189 nonterminal ParseNode optcrash;
190 nonterminal ParseNode quantifiers;
191 nonterminal ParseNode quantifier;
192 nonterminal ParseNode set;
193 nonterminal ParseNode listofliterals;
194 nonterminal ParseNode literal;
195 nonterminal ParseNode body;
196 nonterminal ParseNode predicate;
197 nonterminal ParseNode setexpr;
199 nonterminal ParseNode compare;
200 nonterminal ParseNode expr;
201 nonterminal ParseNode operator;
207 precedence left EQ, NE;
208 precedence left LT, LE, GE, GT;
210 precedence left ADD, SUB;
211 precedence left MULT, DIV;
215 precedence left DOT, DOTINV;
217 // PRODUCTION RULES /////////////////////////////////////////////////////
221 constraints:constraints constraint:constraint
223 debugMessage(PRODSTRING);
224 constraints.addChild(constraint);
225 RESULT = constraints;
228 | constraint:constraint
230 debugMessage(PRODSTRING);
231 ParseNode constraints = new ParseNode("constraints", parser.curLine(1));
232 constraints.addChild(constraint);
233 RESULT = constraints;
239 optcrash:crash OPENBRACKET quantifiers:quantifiers CLOSEBRACKET COMMA body:body SEMICOLON
241 debugMessage(PRODSTRING);
242 ParseNode constraint = new ParseNode("constraint", parser.curLine(7));
244 constraint.addChild(crash);
246 if (quantifiers != null) {
247 constraint.addChild(quantifiers);
249 constraint.addChild(body);
258 debugMessage(PRODSTRING);
259 RESULT = new ParseNode("crash", parser.curLine(1));
264 debugMessage(PRODSTRING);
271 quantifiers:quantifiers COMMA quantifier:quantifier
273 debugMessage(PRODSTRING);
274 quantifiers.addChild(quantifier);
275 RESULT = quantifiers;
278 | quantifier:quantifier
280 debugMessage(PRODSTRING);
281 ParseNode quantifiers = new ParseNode("quantifiers", parser.curLine(1));
282 quantifiers.addChild(quantifier);
283 RESULT = quantifiers;
288 debugMessage(PRODSTRING);
295 FORALL ID:var IN set:set
297 debugMessage(PRODSTRING);
298 ParseNode q = new ParseNode("quantifier", parser.curLine(4));
299 q.addChild("forall", parser.curLine(4));
300 q.addChild("var", parser.curLine(3)).addChild(var);
304 | FORALL LT ID:r1 COMMA ID:r2 GT IN ID:relation
306 debugMessage(PRODSTRING);
307 ParseNode q = new ParseNode("quantifier", parser.curLine(7));
308 q.addChild("relation", parser.curLine(1)).addChild(relation);
309 q.addChild("left", parser.curLine(5)).addChild(r1);
310 q.addChild("right", parser.curLine(3)).addChild(r2);
319 debugMessage(PRODSTRING);
320 ParseNode set = new ParseNode("set", parser.curLine(1));
321 set.addChild("name").addChild(setname);
325 | OPENBRACE listofliterals:list CLOSEBRACE
327 debugMessage(PRODSTRING);
328 ParseNode set = new ParseNode("set", parser.curLine(3));
336 listofliterals:list COMMA literal:literal
338 debugMessage(PRODSTRING);
339 list.addChild(literal);
345 debugMessage(PRODSTRING);
346 ParseNode list = new ParseNode("listofliterals", parser.curLine(1));
347 list.addChild(literal);
354 body:body1 AND body:body2
356 debugMessage(PRODSTRING);
357 ParseNode body = new ParseNode("body", parser.curLine(3));
358 body.addChild("and").addChild("left", parser.curLine(3)).addChild(body1);
359 body.getChild("and").addChild("right", parser.curLine(1)).addChild(body2);
363 | body:body1 OR body:body2
365 debugMessage(PRODSTRING);
366 ParseNode body = new ParseNode("body", parser.curLine(3));
367 body.addChild("or").addChild("left", parser.curLine(3)).addChild(body1);
368 body.getChild("or").addChild("right", parser.curLine(1)).addChild(body2);
374 debugMessage(PRODSTRING);
375 ParseNode body = new ParseNode("body", parser.curLine(2));
376 body.addChild("not").addChild(body1);
380 | OPENPAREN body:body CLOSEPAREN
382 debugMessage(PRODSTRING);
386 | predicate:predicate
388 debugMessage(PRODSTRING);
389 ParseNode body = new ParseNode("body", parser.curLine(1));
390 body.addChild(predicate);
397 expr:expr IN setexpr:setexpr
399 debugMessage(PRODSTRING);
400 ParseNode inclusion = (new ParseNode("predicate", parser.curLine(3))).addChild("inclusion");
401 inclusion.addChild(expr);
402 inclusion.addChild(setexpr);
403 RESULT = inclusion.getRoot();
406 | expr:lexpr compare:compare expr:rexpr
408 debugMessage(PRODSTRING);
409 ParseNode comparison = (new ParseNode("predicate", parser.curLine(3))).addChild("expr").addChild("operator");
410 comparison.addChild("op").addChild(compare);
411 comparison.addChild("left", parser.curLine(2)).addChild(lexpr);
412 comparison.addChild("right", parser.curLine(2)).addChild(rexpr);
413 RESULT = comparison.getRoot();
422 debugMessage(PRODSTRING);
423 ParseNode set = new ParseNode("setexpr", parser.curLine(1));
424 set.addChild("set").addChild(setname);
428 | ID:var DOT ID:relation
430 debugMessage(PRODSTRING);
431 ParseNode set = new ParseNode("setexpr", parser.curLine(3));
432 set.addChild("dot").addChild("quantifiervar", parser.curLine(3)).addChild(var);
433 set.getChild("dot").addChild("relation", parser.curLine(1)).addChild(relation);
437 | ID:var DOTINV ID:relation
439 debugMessage(PRODSTRING);
440 ParseNode set = new ParseNode("setexpr", parser.curLine(3));
441 set.addChild("dotinv").addChild("quantifiervar", parser.curLine(3)).addChild(var);
442 set.getChild("dotinv").addChild("relation", parser.curLine(1)).addChild(relation);
451 debugMessage(PRODSTRING);
452 ParseNode expr = new ParseNode("expr", parser.curLine(1));
453 expr.addChild("var").addChild(var);
457 | OPENPAREN expr:expr CLOSEPAREN
459 debugMessage(PRODSTRING);
463 | LITERAL OPENPAREN literal:literal CLOSEPAREN
465 debugMessage(PRODSTRING);
466 ParseNode expr = new ParseNode("expr", parser.curLine(4));
467 expr.addChild(literal);
471 | expr:expr DOT ID:relname
473 debugMessage(PRODSTRING);
474 ParseNode relation = (new ParseNode("expr", parser.curLine(3))).addChild("relation");
475 relation.addChild(expr);
476 relation.addChild("name").addChild(relname);
477 RESULT = relation.getRoot();
480 | expr:expr DOTINV ID:relname
482 debugMessage(PRODSTRING);
483 ParseNode relation = (new ParseNode("expr", parser.curLine(3))).addChild("relation");
484 relation.addChild(expr);
485 relation.addChild("name").addChild(relname);
486 relation.addChild("inv");
487 RESULT = relation.getRoot();
490 | expr:expr1 operator:operator expr:expr2
492 debugMessage(PRODSTRING);
493 ParseNode op = (new ParseNode("expr", parser.curLine(3))).addChild("operator");
494 op.addChild("op").addChild(operator);
495 op.addChild("left", parser.curLine(3)).addChild(expr1);
496 op.addChild("right", parser.curLine(1)).addChild(expr2);
497 RESULT = op.getRoot();
500 | SIZEOF OPENPAREN setexpr:setexpr CLOSEPAREN
502 ParseNode sizeof = (new ParseNode("expr", parser.curLine(4))).addChild("sizeof");
503 sizeof.addChild(setexpr);
504 RESULT = sizeof.getRoot();
512 debugMessage(PRODSTRING);
513 RESULT = new ParseNode("add", parser.curLine(1));
518 debugMessage(PRODSTRING);
519 RESULT = new ParseNode("sub", parser.curLine(1));
524 debugMessage(PRODSTRING);
525 RESULT = new ParseNode("mult", parser.curLine(1));
530 debugMessage(PRODSTRING);
531 RESULT = new ParseNode("div", parser.curLine(1));
539 debugMessage(PRODSTRING);
540 RESULT = new ParseNode("lt", parser.curLine(1));
545 debugMessage(PRODSTRING);
546 RESULT = new ParseNode("gt", parser.curLine(1));
551 debugMessage(PRODSTRING);
552 RESULT = new ParseNode("le", parser.curLine(1));
557 debugMessage(PRODSTRING);
558 RESULT = new ParseNode("ge", parser.curLine(1));
563 debugMessage(PRODSTRING);
564 RESULT = new ParseNode("eq", parser.curLine(1));
569 debugMessage(PRODSTRING);
570 RESULT = new ParseNode("ne", parser.curLine(1));
578 debugMessage(PRODSTRING);
579 RESULT = (new ParseNode("literal", parser.curLine(1))).addChild("boolean").addChild("true").getRoot();
584 debugMessage(PRODSTRING);
585 RESULT = (new ParseNode("literal", parser.curLine(1))).addChild("boolean").addChild("false").getRoot();
590 debugMessage(PRODSTRING);
591 RESULT = (new ParseNode("literal", parser.curLine(1))).addChild("decimal").addChild(dec).getRoot();
596 debugMessage(PRODSTRING);
597 RESULT = (new ParseNode("literal", parser.curLine(1))).addChild("string").addChild(str).getRoot();
602 debugMessage(PRODSTRING);
603 RESULT = (new ParseNode("literal", parser.curLine(1))).addChild("char").addChild(chr).getRoot();
608 debugMessage(PRODSTRING);
609 RESULT = (new ParseNode("literal", parser.curLine(1))).addChild("token").addChild(literal).getRoot();