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$TDLParser$actions.errors = true;
65 Symbol symbol = (Symbol) current;
66 report_error(filename+":"+(symbol.line+1)+": Syntax error at column "
67 + (LineCount.getColumn(symbol.left)+1) +": " + current.value, current);
72 public void report_fatal_error (String message, Object info) {
75 report_error(message, info);
76 CUP$TDLParser$actions.errors = true;
79 public int curPos () {
80 return cur_token.left;
83 public int curLine (int back) {
84 Stack st = new Stack();
87 for (i = 0; i < back; i++) {
91 java_cup.runtime.Symbol s;
92 s = (java_cup.runtime.Symbol) st.peek();
94 for (i = 0; i < back; i++) {
98 return LineCount.getLine(s.left);
103 // TERMINALS /////////////////////////////////////////////////////////////
108 terminal String DECIMAL;
109 terminal String CHAR;
110 terminal String STRING;
116 terminal OPENBRACKET;
117 terminal CLOSEBRACKET;
185 // NON-TERMINALS /////////////////////////////////////////////////////////
189 ------------------------------------------------------------------------*/
190 nonterminal ParseNode structures;
191 nonterminal ParseNode structure;
192 nonterminal ParseNode optsubtype;
193 nonterminal ParseNode labelsandfields;
194 nonterminal ParseNode label;
195 nonterminal ParseNode field;
196 nonterminal ParseNode optptr;
197 nonterminal ParseNode type;
198 nonterminal ParseNode primtype;
199 nonterminal ParseNode optindex;
200 nonterminal ParseNode expr;
201 nonterminal ParseNode simple_expr;
202 nonterminal ParseNode location;
203 nonterminal ParseNode operator;
204 nonterminal ParseNode literal;
208 precedence right EQ, NE;
209 precedence right LT, LE, GE, GT;
210 precedence left ADD, SUB;
211 precedence left MULT, DIV;
215 // PRODUCTION RULES /////////////////////////////////////////////////////
217 start with structures;
221 structures:structures structure:structure
223 debugMessage(PRODSTRING);
224 structures.addChild(structure);
228 | structure:structure
230 debugMessage(PRODSTRING);
231 ParseNode structures = new ParseNode("structures", parser.curLine(1));
232 structures.addChild(structure);
239 STRUCTURE ID:typename optsubtype:subtype OPENBRACE labelsandfields:lf CLOSEBRACE
241 debugMessage(PRODSTRING);
242 ParseNode structure = new ParseNode("structure", parser.curLine(6));
243 structure.addChild("name", parser.curLine(5)).addChild(typename);
244 if (subtype != null) {
245 structure.addChild(subtype);
247 structure.addChild(lf);
251 | ID:type MULT ID:name SEMICOLON
253 debugMessage(PRODSTRING);
254 ParseNode global = new ParseNode("global", parser.curLine(4));
255 global.addChild("ptr");
256 global.addChild("type").addChild(type);
257 global.addChild("name").addChild(name);
261 | primtype:type ID:name SEMICOLON
263 debugMessage(PRODSTRING);
264 ParseNode global = new ParseNode("global", parser.curLine(4));
265 global.addChild(type);
266 global.addChild("name").addChild(name);
275 debugMessage(PRODSTRING);
276 ParseNode subtype = new ParseNode("subtype", parser.curLine(3));
277 subtype.addChild(type);
285 debugMessage(PRODSTRING);
286 ParseNode subtype = new ParseNode("subclass", parser.curLine(3));
287 subtype.addChild(type);
293 debugMessage(PRODSTRING);
300 labelsandfields:lf label:label
302 debugMessage(PRODSTRING);
303 lf.getChild("labels").addChild(label);
307 | labelsandfields:lf field:field
309 debugMessage(PRODSTRING);
310 lf.getChild("fields").addChild(field);
316 debugMessage(PRODSTRING);
317 ParseNode lf = new ParseNode("lf");
318 lf.addChild("labels", parser.curLine(1)).addChild(label);
319 lf.addChild("fields", parser.curLine(1));
325 debugMessage(PRODSTRING);
326 ParseNode lf = new ParseNode("lf");
327 lf.addChild("fields", parser.curLine(1)).addChild(field);
328 lf.addChild("labels", parser.curLine(1));
335 LABEL ID:field optindex:index COLON type:type ID:name SEMICOLON
337 debugMessage(PRODSTRING);
338 ParseNode label = new ParseNode("label", parser.curLine(6));
339 label.addChild("name", parser.curLine(2)).addChild(name);
341 label.addChild(index);
343 label.addChild(type);
344 label.addChild("field", parser.curLine(5)).addChild(field);
351 OPENBRACKET expr:expr CLOSEBRACKET
353 debugMessage(PRODSTRING);
354 ParseNode index = new ParseNode("index", parser.curLine(2));
355 index.addChild(expr);
361 debugMessage(PRODSTRING);
368 RESERVED type:type optindex:index SEMICOLON
370 debugMessage(PRODSTRING);
371 ParseNode field = new ParseNode("field", parser.curLine(4));
372 field.addChild(type);
373 field.addChild("reserved");
375 field.addChild(index);
380 | type:type optptr:optptr ID:name optindex:index SEMICOLON
382 debugMessage(PRODSTRING);
383 ParseNode field = new ParseNode("field", parser.curLine(5));
384 field.addChild(type);
385 if (optptr != null) {
386 field.addChild(optptr);
388 field.addChild("name", parser.curLine(3)).addChild(name);
390 field.addChild(index);
400 debugMessage(PRODSTRING);
401 RESULT = new ParseNode("*", parser.curLine(1));
406 debugMessage(PRODSTRING);
412 /*** expression interface *********************************/
418 debugMessage(PRODSTRING);
419 ParseNode se = new ParseNode("simple_expr", parser.curLine(1));
420 se.addChild(location);
429 debugMessage(PRODSTRING);
430 ParseNode loc = new ParseNode("location", parser.curLine(1));
431 loc.addChild("var").addChild(var);
435 | simple_expr:dotexpr DOT ID:field
437 debugMessage(PRODSTRING);
438 ParseNode dot = (new ParseNode("location", parser.curLine(3))).addChild("dot");
439 dot.addChild(dotexpr);
440 dot.addChild("field", parser.curLine(1)).addChild(field);
441 RESULT = dot.getRoot();
444 | simple_expr:dotexpr DOT ID:field OPENBRACKET expr:index CLOSEBRACKET
446 debugMessage(PRODSTRING);
447 ParseNode dot = (new ParseNode("location", parser.curLine(6))).addChild("dot");
448 dot.addChild(dotexpr);
449 dot.addChild("field", parser.curLine(4)).addChild(field);
450 dot.addChild("index", parser.curLine(2)).addChild(index);
451 RESULT = dot.getRoot();
454 | CAST OPENPAREN ID:type COMMA simple_expr:expr CLOSEPAREN
456 debugMessage(PRODSTRING);
457 ParseNode cast = (new ParseNode("location", parser.curLine(6))).addChild("cast");
458 cast.addChild("type").addChild(type);
460 RESULT = cast.getRoot();
468 debugMessage(PRODSTRING);
469 ParseNode expr = new ParseNode("expr", parser.curLine(1));
474 | OPENPAREN expr:expr CLOSEPAREN
476 debugMessage(PRODSTRING);
482 debugMessage(PRODSTRING);
483 ParseNode expr = new ParseNode("expr", parser.curLine(4));
484 expr.addChild(literal);
488 | expr:expr1 operator:operator expr:expr2
490 debugMessage(PRODSTRING);
491 ParseNode op = (new ParseNode("expr", parser.curLine(3))).addChild("operator");
492 op.addChild("op").addChild(operator);
493 op.addChild("left", parser.curLine(3)).addChild(expr1);
494 op.addChild("right", parser.curLine(1)).addChild(expr2);
495 RESULT = op.getRoot();
499 /**** standard ***************************************************/
505 debugMessage(PRODSTRING);
506 RESULT = new ParseNode("add", parser.curLine(1));
511 debugMessage(PRODSTRING);
512 RESULT = new ParseNode("sub", parser.curLine(1));
517 debugMessage(PRODSTRING);
518 RESULT = new ParseNode("mult", parser.curLine(1));
523 debugMessage(PRODSTRING);
524 RESULT = new ParseNode("div", parser.curLine(1));
532 debugMessage(PRODSTRING);
533 RESULT = (new ParseNode("literal", parser.curLine(1))).addChild("boolean").addChild("true").getRoot();
538 debugMessage(PRODSTRING);
539 RESULT = (new ParseNode("literal", parser.curLine(1))).addChild("boolean").addChild("false").getRoot();
544 debugMessage(PRODSTRING);
545 RESULT = (new ParseNode("literal", parser.curLine(1))).addChild("decimal").addChild(dec).getRoot();
550 debugMessage(PRODSTRING);
551 RESULT = (new ParseNode("literal", parser.curLine(1))).addChild("decimal").addChild("-"+dec).getRoot();
556 debugMessage(PRODSTRING);
557 RESULT = (new ParseNode("literal", parser.curLine(1))).addChild("string").addChild(str).getRoot();
562 debugMessage(PRODSTRING);
563 RESULT = (new ParseNode("literal", parser.curLine(1))).addChild("char").addChild(chr).getRoot();
566 | LITERAL OPENPAREN ID:literal CLOSEPAREN
568 debugMessage(PRODSTRING);
569 RESULT = (new ParseNode("literal", parser.curLine(1))).addChild("token").addChild(literal).getRoot();
577 debugMessage(PRODSTRING);
578 ParseNode type = new ParseNode("type", parser.curLine(1));
579 type.addChild("bit");
585 debugMessage(PRODSTRING);
586 ParseNode type = new ParseNode("type", parser.curLine(1));
587 type.addChild("byte");
593 debugMessage(PRODSTRING);
594 ParseNode type = new ParseNode("type", parser.curLine(1));
595 type.addChild("short");
601 debugMessage(PRODSTRING);
602 ParseNode type = new ParseNode("type", parser.curLine(1));
603 type.addChild("int");
609 debugMessage(PRODSTRING);
610 ParseNode type = new ParseNode("type", parser.curLine(1));
611 type.addChild(typename);
620 debugMessage(PRODSTRING);
621 ParseNode type = new ParseNode("type", parser.curLine(1));
622 type.addChild("bit");
628 debugMessage(PRODSTRING);
629 ParseNode type = new ParseNode("type", parser.curLine(1));
630 type.addChild("byte");
636 debugMessage(PRODSTRING);
637 ParseNode type = new ParseNode("type", parser.curLine(1));
638 type.addChild("short");
644 debugMessage(PRODSTRING);
645 ParseNode type = new ParseNode("type", parser.curLine(1));
646 type.addChild("int");