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$CDLParser$actions.errors = true;
63 Symbol symbol = (Symbol) current;
64 report_error("CDL: 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$CDLParser$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;
179 // NON-TERMINALS /////////////////////////////////////////////////////////
183 ------------------------------------------------------------------------*/
184 nonterminal ParseNode constraints;
185 nonterminal ParseNode constraint;
186 nonterminal ParseNode optcrash;
187 nonterminal ParseNode quantifiers;
188 nonterminal ParseNode quantifier;
189 nonterminal ParseNode set;
190 nonterminal ParseNode listofliterals;
191 nonterminal ParseNode literal;
192 nonterminal ParseNode body;
193 nonterminal ParseNode predicate;
194 nonterminal ParseNode setexpr;
195 //nonterminal ParseNode limitedcompare;
196 nonterminal ParseNode compare;
197 nonterminal ParseNode expr;
198 nonterminal ParseNode operator;
199 nonterminal ParseNode relations;
200 //nonterminal ParseNode type;
204 precedence right EQ, NE;
205 precedence right LT, LE, GE, GT;
206 precedence left ADD, SUB;
207 precedence left MULT, DIV;
209 precedence left DOT, DOTINV;
211 // PRODUCTION RULES /////////////////////////////////////////////////////
214 constraints:constraints constraint:constraint
216 debugMessage(PRODSTRING);
217 constraints.addChild(constraint);
218 RESULT = constraints;
220 | constraint:constraint
222 debugMessage(PRODSTRING);
223 ParseNode constraints = new ParseNode("constraints", parser.curLine(1));
224 constraints.addChild(constraint);
225 RESULT = constraints;
230 optcrash:crash OPENBRACKET quantifiers:quantifiers CLOSEBRACKET COMMA body:body SEMICOLON
232 debugMessage(PRODSTRING);
233 ParseNode constraint = new ParseNode("constraint", parser.curLine(7));
235 constraint.addChild(crash);
237 if (quantifiers != null) {
238 constraint.addChild(quantifiers);
240 constraint.addChild(body);
248 debugMessage(PRODSTRING);
249 RESULT = new ParseNode("crash", parser.curLine(1));
253 debugMessage(PRODSTRING);
259 quantifiers:quantifiers COMMA quantifier:quantifier
261 debugMessage(PRODSTRING);
262 quantifiers.addChild(quantifier);
263 RESULT = quantifiers;
266 | quantifier:quantifier
268 debugMessage(PRODSTRING);
269 ParseNode quantifiers = new ParseNode("quantifiers", parser.curLine(1));
270 quantifiers.addChild(quantifier);
271 RESULT = quantifiers;
276 debugMessage(PRODSTRING);
282 FORALL ID:var IN set:set
284 debugMessage(PRODSTRING);
285 ParseNode q = new ParseNode("quantifier", parser.curLine(4));
286 q.addChild("forall", parser.curLine(4));
287 q.addChild("var", parser.curLine(3)).addChild(var);
296 debugMessage(PRODSTRING);
297 ParseNode set = new ParseNode("set", parser.curLine(1));
298 set.addChild("name").addChild(setname);
301 | OPENBRACE listofliterals:list CLOSEBRACE
303 debugMessage(PRODSTRING);
304 ParseNode set = new ParseNode("set", parser.curLine(3));
312 listofliterals:list COMMA literal:literal
314 debugMessage(PRODSTRING);
315 list.addChild(literal);
320 debugMessage(PRODSTRING);
321 ParseNode list = new ParseNode("listofliterals", parser.curLine(1));
322 list.addChild(literal);
328 body:body1 AND body:body2
330 debugMessage(PRODSTRING);
331 ParseNode body = new ParseNode("body", parser.curLine(3));
332 body.addChild("and").addChild("left", parser.curLine(3)).addChild(body1);
333 body.getChild("and").addChild("right", parser.curLine(1)).addChild(body2);
336 | body:body1 OR body:body2
338 debugMessage(PRODSTRING);
339 ParseNode body = new ParseNode("body", parser.curLine(3));
340 body.addChild("or").addChild("left", parser.curLine(3)).addChild(body1);
341 body.getChild("or").addChild("right", parser.curLine(1)).addChild(body2);
346 debugMessage(PRODSTRING);
347 ParseNode body = new ParseNode("body", parser.curLine(2));
348 body.addChild("not").addChild(body1);
351 | OPENPAREN body:body CLOSEPAREN
353 debugMessage(PRODSTRING);
356 | predicate:predicate
358 debugMessage(PRODSTRING);
359 ParseNode body = new ParseNode("body", parser.curLine(1));
360 body.addChild(predicate);
367 ID:var IN setexpr:setexpr
369 debugMessage(PRODSTRING);
370 ParseNode inclusion = (new ParseNode("predicate", parser.curLine(3))).addChild("inclusion");
371 inclusion.addChild("quantifiervar", parser.curLine(3)).addChild(var);
372 inclusion.addChild(setexpr);
373 RESULT = inclusion.getRoot();
376 | SIZEOF OPENPAREN setexpr:setexpr CLOSEPAREN
378 ParseNode expr = new ParseNode("expr", parser.curLine(4));
379 expr.addChild("sizeof").addChild(setexpr);
385 debugMessage(PRODSTRING);
386 ParseNode comparison = (new ParseNode("predicate", parser.curLine(3))).addChild("comparison");
387 comparison.addChild("compare", parser.curLine(2)).addChild(compare);
388 comparison.addChild("left", parser.curLine(3)).addChild(leftexpr);
389 comparison.addChild("right", parser.curLine(1)).addChild(rightexpr);
390 RESULT = comparison.getRoot();
397 debugMessage(PRODSTRING);
398 ParseNode set = new ParseNode("setexpr", parser.curLine(1));
399 set.addChild("set").addChild(setname);
402 | ID:var DOT ID:relation
404 debugMessage(PRODSTRING);
405 ParseNode set = new ParseNode("setexpr", parser.curLine(3));
406 set.addChild("dot").addChild("quantifiervar", parser.curLine(3)).addChild(var);
407 set.getChild("dot").addChild("relation", parser.curLine(1)).addChild(relation);
410 | ID:var DOTINV ID:relation
412 debugMessage(PRODSTRING);
413 ParseNode set = new ParseNode("setexpr", parser.curLine(3));
414 set.addChild("dotinv").addChild("quantifiervar", parser.curLine(3)).addChild(var);
415 set.getChild("dotinv").addChild("relation", parser.curLine(1)).addChild(relation);
424 relations:relations DOT ID:relation
426 debugMessage(PRODSTRING);
427 relations.insertChild(relation);
431 | relations:relations DOTINV ID:relation
433 debugMessage(PRODSTRING);
434 relations.insertChild(relation).addChild("inv");
440 debugMessage(PRODSTRING);
441 ParseNode relations = new ParseNode("relations", parser.curLine(1));
442 relations.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 | ID:var DOT relations:relations
473 debugMessage(PRODSTRING);
474 ParseNode expr = new ParseNode("expr", parser.curLine(3));
475 ParseNode relation = new ParseNode("relation");
476 expr.addChild(relation);
477 relation.addChild("quantifiervar", parser.curLine(3)).addChild(var);
478 relation.addChild(relations);
482 | ID:var DOTINV relations:relations
484 debugMessage(PRODSTRING);
485 ParseNode expr = new ParseNode("expr", parser.curLine(3));
486 ParseNode relation = new ParseNode("relation");
487 expr.addChild(relation);
488 relation.addChild("quantifiervar", parser.curLine(3)).addChild(var);
489 relation.addChild(relations);
490 relations.getChildren().elementAt(0).addChild("inv");
494 | expr:expr1 operator:operator expr:expr2
496 debugMessage(PRODSTRING);
497 ParseNode op = (new ParseNode("expr", parser.curLine(3))).addChild("operator");
498 op.addChild("op").addChild(operator);
499 op.addChild("left", parser.curLine(3)).addChild(expr1);
500 op.addChild("right", parser.curLine(1)).addChild(expr2);
501 RESULT = op.getRoot();
510 debugMessage(PRODSTRING);
511 RESULT = new ParseNode("add", parser.curLine(1));
515 debugMessage(PRODSTRING);
516 RESULT = new ParseNode("sub", parser.curLine(1));
520 debugMessage(PRODSTRING);
521 RESULT = new ParseNode("mult", parser.curLine(1));
525 debugMessage(PRODSTRING);
526 RESULT = new ParseNode("div", parser.curLine(1));
533 debugMessage(PRODSTRING);
534 RESULT = new ParseNode("lt", parser.curLine(1));
538 debugMessage(PRODSTRING);
539 RESULT = new ParseNode("gt", parser.curLine(1));
543 debugMessage(PRODSTRING);
544 RESULT = new ParseNode("le", parser.curLine(1));
548 debugMessage(PRODSTRING);
549 RESULT = new ParseNode("ge", parser.curLine(1));
553 debugMessage(PRODSTRING);
554 RESULT = new ParseNode("eq", parser.curLine(1));
558 debugMessage(PRODSTRING);
559 RESULT = new ParseNode("ne", parser.curLine(1));
566 debugMessage(PRODSTRING);
567 RESULT = (new ParseNode("literal", parser.curLine(1))).addChild("boolean").addChild("true").getRoot();
571 debugMessage(PRODSTRING);
572 RESULT = (new ParseNode("literal", parser.curLine(1))).addChild("decimal").addChild(dec).getRoot();
576 debugMessage(PRODSTRING);
577 RESULT = (new ParseNode("literal", parser.curLine(1))).addChild("string").addChild(str).getRoot();
581 debugMessage(PRODSTRING);
582 RESULT = (new ParseNode("literal", parser.curLine(1))).addChild("char").addChild(chr).getRoot();
586 debugMessage(PRODSTRING);
587 RESULT = (new ParseNode("literal", parser.curLine(1))).addChild("token").addChild(literal).getRoot();