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 " + LineCount.getColumn(symbol.left) +": " + current.value, current);
70 public void report_fatal_error (String message, Object info) {
73 report_error(message, info);
74 CUP$TDLParser$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;
181 // NON-TERMINALS /////////////////////////////////////////////////////////
185 ------------------------------------------------------------------------*/
186 nonterminal ParseNode structures;
187 nonterminal ParseNode structure;
188 nonterminal ParseNode optsubtype;
189 nonterminal ParseNode labelsandfields;
190 nonterminal ParseNode label;
191 nonterminal ParseNode field;
192 nonterminal ParseNode optptr;
193 nonterminal ParseNode type;
194 nonterminal ParseNode optindex;
195 nonterminal ParseNode expr;
196 nonterminal ParseNode simple_expr;
197 nonterminal ParseNode location;
198 nonterminal ParseNode operator;
199 nonterminal ParseNode literal;
203 precedence right EQ, NE;
204 precedence right LT, LE, GE, GT;
205 precedence left ADD, SUB;
206 precedence left MULT, DIV;
210 // PRODUCTION RULES /////////////////////////////////////////////////////
212 start with structures;
216 structures:structures structure:structure
218 debugMessage(PRODSTRING);
219 structures.addChild(structure);
223 | structure:structure
225 debugMessage(PRODSTRING);
226 ParseNode structures = new ParseNode("structures", parser.curLine(1));
227 structures.addChild(structure);
234 STRUCTURE ID:typename optsubtype:subtype OPENBRACE labelsandfields:lf CLOSEBRACE
236 debugMessage(PRODSTRING);
237 ParseNode structure = new ParseNode("structure", parser.curLine(6));
238 structure.addChild("name", parser.curLine(5)).addChild(typename);
239 if (subtype != null) {
240 structure.addChild(subtype);
242 structure.addChild(lf);
246 | ID:type MULT ID:name SEMICOLON
248 debugMessage(PRODSTRING);
249 ParseNode global = new ParseNode("global", parser.curLine(4));
250 global.addChild("type").addChild(type);
251 global.addChild("name").addChild(name);
260 debugMessage(PRODSTRING);
261 ParseNode subtype = new ParseNode("subtype", parser.curLine(3));
262 subtype.addChild(type);
268 debugMessage(PRODSTRING);
275 labelsandfields:lf label:label
277 debugMessage(PRODSTRING);
278 lf.getChild("labels").addChild(label);
282 | labelsandfields:lf field:field
284 debugMessage(PRODSTRING);
285 lf.getChild("fields").addChild(field);
291 debugMessage(PRODSTRING);
292 ParseNode lf = new ParseNode("lf");
293 lf.addChild("labels", parser.curLine(1)).addChild(label);
294 lf.addChild("fields", parser.curLine(1));
300 debugMessage(PRODSTRING);
301 ParseNode lf = new ParseNode("lf");
302 lf.addChild("fields", parser.curLine(1)).addChild(field);
303 lf.addChild("labels", parser.curLine(1));
310 LABEL ID:field optindex:index COLON type:type ID:name SEMICOLON
312 debugMessage(PRODSTRING);
313 ParseNode label = new ParseNode("label", parser.curLine(6));
314 label.addChild("name", parser.curLine(2)).addChild(name);
316 label.addChild(index);
318 label.addChild(type);
319 label.addChild("field", parser.curLine(5)).addChild(field);
326 OPENBRACKET expr:expr CLOSEBRACKET
328 debugMessage(PRODSTRING);
329 ParseNode index = new ParseNode("index", parser.curLine(2));
330 index.addChild(expr);
336 debugMessage(PRODSTRING);
343 RESERVED type:type optindex:index SEMICOLON
345 debugMessage(PRODSTRING);
346 ParseNode field = new ParseNode("field", parser.curLine(4));
347 field.addChild(type);
348 field.addChild("reserved");
350 field.addChild(index);
355 | type:type optptr:optptr ID:name optindex:index SEMICOLON
357 debugMessage(PRODSTRING);
358 ParseNode field = new ParseNode("field", parser.curLine(5));
359 field.addChild(type);
360 if (optptr != null) {
361 field.addChild(optptr);
363 field.addChild("name", parser.curLine(3)).addChild(name);
365 field.addChild(index);
375 debugMessage(PRODSTRING);
376 RESULT = new ParseNode("*", parser.curLine(1));
381 debugMessage(PRODSTRING);
387 /*** expression interface *********************************/
393 debugMessage(PRODSTRING);
394 ParseNode se = new ParseNode("simple_expr", parser.curLine(1));
395 se.addChild(location);
404 debugMessage(PRODSTRING);
405 ParseNode loc = new ParseNode("location", parser.curLine(1));
406 loc.addChild("var").addChild(var);
410 | simple_expr:dotexpr DOT ID:field
412 debugMessage(PRODSTRING);
413 ParseNode dot = (new ParseNode("location", parser.curLine(3))).addChild("dot");
414 dot.addChild(dotexpr);
415 dot.addChild("field", parser.curLine(1)).addChild(field);
416 RESULT = dot.getRoot();
419 | simple_expr:dotexpr DOT ID:field OPENBRACKET expr:index CLOSEBRACKET
421 debugMessage(PRODSTRING);
422 ParseNode dot = (new ParseNode("location", parser.curLine(6))).addChild("dot");
423 dot.addChild(dotexpr);
424 dot.addChild("field", parser.curLine(4)).addChild(field);
425 dot.addChild("index", parser.curLine(2)).addChild(index);
426 RESULT = dot.getRoot();
429 | CAST OPENPAREN ID:type COMMA simple_expr:expr CLOSEPAREN
431 debugMessage(PRODSTRING);
432 ParseNode cast = (new ParseNode("location", parser.curLine(6))).addChild("cast");
433 cast.addChild("type").addChild(type);
435 RESULT = cast.getRoot();
443 debugMessage(PRODSTRING);
444 ParseNode expr = new ParseNode("expr", parser.curLine(1));
449 | OPENPAREN expr:expr CLOSEPAREN
451 debugMessage(PRODSTRING);
455 | LITERAL OPENPAREN literal:literal CLOSEPAREN
457 debugMessage(PRODSTRING);
458 ParseNode expr = new ParseNode("expr", parser.curLine(4));
459 expr.addChild(literal);
463 | expr:expr1 operator:operator expr:expr2
465 debugMessage(PRODSTRING);
466 ParseNode op = (new ParseNode("expr", parser.curLine(3))).addChild("operator");
467 op.addChild("op").addChild(operator);
468 op.addChild("left", parser.curLine(3)).addChild(expr1);
469 op.addChild("right", parser.curLine(1)).addChild(expr2);
470 RESULT = op.getRoot();
474 /**** standard ***************************************************/
480 debugMessage(PRODSTRING);
481 RESULT = new ParseNode("add", parser.curLine(1));
486 debugMessage(PRODSTRING);
487 RESULT = new ParseNode("sub", parser.curLine(1));
492 debugMessage(PRODSTRING);
493 RESULT = new ParseNode("mult", parser.curLine(1));
498 debugMessage(PRODSTRING);
499 RESULT = new ParseNode("div", parser.curLine(1));
507 debugMessage(PRODSTRING);
508 RESULT = (new ParseNode("literal", parser.curLine(1))).addChild("boolean").addChild("true").getRoot();
513 debugMessage(PRODSTRING);
514 RESULT = (new ParseNode("literal", parser.curLine(1))).addChild("boolean").addChild("false").getRoot();
519 debugMessage(PRODSTRING);
520 RESULT = (new ParseNode("literal", parser.curLine(1))).addChild("decimal").addChild(dec).getRoot();
525 debugMessage(PRODSTRING);
526 RESULT = (new ParseNode("literal", parser.curLine(1))).addChild("string").addChild(str).getRoot();
531 debugMessage(PRODSTRING);
532 RESULT = (new ParseNode("literal", parser.curLine(1))).addChild("char").addChild(chr).getRoot();
537 debugMessage(PRODSTRING);
538 RESULT = (new ParseNode("literal", parser.curLine(1))).addChild("token").addChild(literal).getRoot();
546 debugMessage(PRODSTRING);
547 ParseNode type = new ParseNode("type", parser.curLine(1));
548 type.addChild("bit");
554 debugMessage(PRODSTRING);
555 ParseNode type = new ParseNode("type", parser.curLine(1));
556 type.addChild("byte");
562 debugMessage(PRODSTRING);
563 ParseNode type = new ParseNode("type", parser.curLine(1));
564 type.addChild("short");
570 debugMessage(PRODSTRING);
571 ParseNode type = new ParseNode("type", parser.curLine(1));
572 type.addChild("int");
578 debugMessage(PRODSTRING);
579 ParseNode type = new ParseNode("type", parser.curLine(1));
580 type.addChild(typename);