MCC files
[repair.git] / Repair / RepairCompiler / MCC / SDL.cup
diff --git a/Repair/RepairCompiler/MCC/SDL.cup b/Repair/RepairCompiler/MCC/SDL.cup
new file mode 100755 (executable)
index 0000000..6604dcd
--- /dev/null
@@ -0,0 +1,359 @@
+package MCC;
+import MCC.IR.ParseNode;
+import MCC.IR.ParseNodeVector;
+import java.util.*;
+
+action code {:
+
+       public static boolean errors;
+       public static boolean debug;
+
+       // debugMessage: writes debug production message only if debug = true
+
+       void debugMessage (String production) {
+               if (debug) {
+                       System.out.println("Applying production: " + production);
+               }
+       }
+
+       String unescape (String str) {
+           StringBuffer sb = new StringBuffer();
+           int i;
+           // Note that we skip the first and last characters (they're "'s)
+           for (i = 1; i < str.length() - 1; i++) {
+               if (str.charAt(i) == '\\') {
+                   i++;
+                   switch (str.charAt(i)) {
+                   case '\"':
+                       sb.append('\"');
+                       break;
+                   case '\'':
+                       sb.append('\'');
+                       break;
+                   case '\\':
+                       sb.append('\\');
+                       break;
+                   case 't':
+                       sb.append('\t');
+                       break;
+                   case 'n':
+                       sb.append('\n');
+                       break;
+                   default:
+                       System.err.print("Error in string literal: ");
+                       System.err.println(str.charAt(i));
+                       System.err.println("Aborting...");
+                       break;
+                   }
+               } else {
+                   sb.append(str.charAt(i));
+               }
+           }
+           return sb.toString();
+       }
+:}
+
+init with {: :}
+
+parser code {:
+       
+       public void syntax_error (java_cup.runtime.Symbol current) {
+
+               CUP$SDLParser$actions.errors = true;
+               Symbol symbol = (Symbol) current;
+               report_error("SDL: Syntax error at line " + (symbol.line + 1)
+               + ", column " + LineCount.getColumn(symbol.left) + ": " + current.value, current);
+       }
+
+       public void report_fatal_error (String message, Object info) {
+               
+                done_parsing();
+                report_error(message, info);
+                CUP$SDLParser$actions.errors = true;
+       }
+
+       public int curPos () {
+               return cur_token.left;
+       }
+
+       public int curLine (int back) {
+               Stack st = new Stack();
+               int i;
+
+               for (i = 0; i < back; i++) {
+                       st.push(stack.pop());
+               }
+
+               java_cup.runtime.Symbol s;
+               s = (java_cup.runtime.Symbol) st.peek();
+
+               for (i = 0; i < back; i++) {
+                       stack.push(st.pop());
+               }
+
+               return LineCount.getLine(s.left);
+       }
+       
+:}
+
+// TERMINALS /////////////////////////////////////////////////////////////
+
+    terminal BAD;
+
+    terminal String ID;
+    terminal String DECIMAL;
+    terminal String CHAR;
+    terminal String STRING;
+
+    terminal OPENBRACE;
+    terminal CLOSEBRACE;
+    terminal OPENPAREN;
+    terminal CLOSEPAREN; 
+    terminal OPENBRACKET;
+    terminal CLOSEBRACKET;
+
+    terminal ADD; 
+    terminal SUB; 
+    terminal MULT; 
+    terminal DIV;
+
+    terminal NOT;
+    terminal LT;
+    terminal GT;
+    terminal LE;
+    terminal GE;
+    terminal EQ;
+    terminal NE;
+
+    terminal FORALL;
+    terminal IN;
+    terminal INTEST;
+
+    terminal COMMA;
+    terminal SIZEOF;
+
+    terminal DOT;
+    terminal DOTINV;
+
+    terminal AND;
+    terminal OR;
+
+    terminal LITERAL;
+
+    terminal IMPLIES;
+    terminal TRUE;
+    terminal ISVALID;
+    terminal FOR;
+    terminal TO;
+    terminal CAST;
+
+    terminal PARAM;
+    terminal STRUCTURE;
+    terminal RESERVED;
+    terminal BIT;
+    terminal BYTE;
+    terminal SHORT;
+      
+    terminal LABEL;
+    terminal INT;
+    terminal SUBTYPE;
+    terminal OF;
+
+    terminal SEMICOLON;
+    terminal COLON;
+
+    terminal SET;
+    terminal ARROW;
+    terminal MANY;
+    terminal BAR;
+
+    terminal PARTITION;
+    terminal ELEMENT;
+    terminal DELAY;
+    terminal STATIC;
+
+    terminal NULL;
+    terminal CRASH;
+
+// NON-TERMINALS /////////////////////////////////////////////////////////
+
+/*
+               TYPE                    NAME
+------------------------------------------------------------------------*/
+nonterminal    ParseNode               spacedefs;
+nonterminal    ParseNode               space;
+nonterminal    ParseNode               mult;
+nonterminal    ParseNode               optstatic;
+nonterminal    ParseNode               optpartition;
+nonterminal    ParseNode               setlist;
+nonterminal    ParseNode               type;
+
+precedence left OR;
+precedence left AND;
+precedence right EQ, NE; 
+precedence right LT, LE, GE, GT;
+precedence left ADD, SUB;
+precedence left MULT, DIV;
+precedence left NOT;
+precedence left DOT;
+
+// PRODUCTION RULES  /////////////////////////////////////////////////////
+
+start with spacedefs;
+
+spacedefs ::= 
+         spacedefs:spacedefs space:space
+       {:
+       debugMessage(PRODSTRING);
+       spacedefs.addChild(space);
+       RESULT = spacedefs;
+       :}
+         | space:space
+       {:
+       debugMessage(PRODSTRING);
+       ParseNode spacedefs = new ParseNode("space", parser.curLine(1));
+       spacedefs.addChild(space);
+       RESULT = spacedefs;
+       :}
+         ;
+
+space ::= 
+      SET ID:setname OPENPAREN type:settype CLOSEPAREN SEMICOLON
+       {:
+       debugMessage(PRODSTRING);
+       ParseNode set = new ParseNode("setdefinition", parser.curLine(6));
+       set.addChild("name", parser.curLine(5)).addChild(setname);
+       set.addChild(settype);
+       RESULT = set;
+       :}
+      | SET ID:setname OPENPAREN type:settype CLOSEPAREN COLON optpartition:partition setlist:setlist SEMICOLON
+       {:
+       debugMessage(PRODSTRING);
+       ParseNode set = new ParseNode("setdefinition", parser.curLine(8));
+       set.addChild("name", parser.curLine(7)).addChild(setname);
+       set.addChild(settype);
+       if (partition != null) set.addChild(partition);
+       if (setlist != null) set.addChild(setlist);
+       RESULT = set;
+       :}
+      | ID:name optstatic:optstatic COLON type:domain ARROW type:range OPENPAREN mult:domainmult ARROW mult:rangemult CLOSEPAREN SEMICOLON 
+       {:
+       debugMessage(PRODSTRING);
+       ParseNode relation = new ParseNode("relationdefinition", parser.curLine(12));
+       if (optstatic != null) relation.addChild(optstatic);
+       relation.addChild("name", parser.curLine(11)).addChild(name);
+       relation.addChild("domain").addChild(domain);
+       relation.addChild("range").addChild(range);
+       relation.getChild("domain").addChild(domainmult);
+       relation.getChild("range").addChild(rangemult);
+       RESULT = relation;
+       :}
+      ;
+
+mult ::=
+     DECIMAL:one
+       {:
+       debugMessage(PRODSTRING);
+       ParseNode mult = new ParseNode("mult", parser.curLine(1));
+       mult.addChild(one);
+       RESULT = mult;
+       :}
+     | MANY
+       {:
+       debugMessage(PRODSTRING);
+       ParseNode mult = new ParseNode("mult", parser.curLine(1));
+       mult.addChild("many");
+       RESULT = mult;
+       :}
+     ;
+
+optstatic ::= 
+         STATIC
+       {:
+       debugMessage(PRODSTRING);
+       RESULT = new ParseNode("static", parser.curLine(1));
+       :}
+         | /* nothing */
+       {:
+       debugMessage(PRODSTRING);
+       RESULT = null;
+       :}
+         ;
+
+optpartition ::= 
+            PARTITION
+       {:
+       debugMessage(PRODSTRING);
+       RESULT = new ParseNode("partition", parser.curLine(1));
+       :}
+            | /* nothing */
+       {:
+       debugMessage(PRODSTRING);
+       RESULT = null;
+       :}
+            ;
+
+setlist ::=
+       setlist:setlist BAR ID:set
+       {:
+       debugMessage(PRODSTRING);
+       setlist.addChild(set, parser.curLine(1));
+       RESULT = setlist;
+       :}
+       | ID:set
+       {:
+       debugMessage(PRODSTRING);
+       ParseNode setlist = new ParseNode("setlist");
+       setlist.addChild(set, parser.curLine(1));
+       RESULT = setlist;
+       :}
+       |
+       {:
+       debugMessage(PRODSTRING);
+       RESULT = null;
+       :}
+       ;
+
+type ::= 
+     BIT
+       {:
+       debugMessage(PRODSTRING);
+       ParseNode type = new ParseNode("type", parser.curLine(1));
+       type.addChild("bit");
+       RESULT = type;
+       :}
+     | BYTE
+       {:
+       debugMessage(PRODSTRING);
+       ParseNode type = new ParseNode("type", parser.curLine(1));
+       type.addChild("byte");
+       RESULT = type;
+       :}
+     | SHORT
+       {:
+       debugMessage(PRODSTRING);
+       ParseNode type = new ParseNode("type", parser.curLine(1));
+       type.addChild("short");
+       RESULT = type;
+       :}
+     | INT 
+       {:
+       debugMessage(PRODSTRING);
+       ParseNode type = new ParseNode("type", parser.curLine(1));
+       type.addChild("int");
+       RESULT = type;
+       :}
+     | ID:typename
+       {:
+       debugMessage(PRODSTRING);
+       ParseNode type = new ParseNode("type", parser.curLine(1));
+       type.addChild(typename);
+       RESULT = type;
+       :}
+     ;
+
+
+
+
+
+