Fix grammar and Sum bug.
[repair.git] / Repair / RepairCompiler / MCC / CDL.cup
index 76f769d58151caa7c956d27eb1982cf54b916a06..6de3880a3f33ca5904d88a389df83e432477d0dd 100755 (executable)
@@ -72,8 +72,10 @@ parser code {:
                 report_error(filename+":"+(symbol.line+1)+": Syntax error at column " 
                 + (LineCount.getColumn(symbol.left)+1) +": " + current.value, current);
 
+               /*
                if (current.value.equals("true") || isInteger)
                   System.out.println("Did you mean literal("+current.value+")?");
+               */
 
                System.out.println();
                System.exit(0);
@@ -130,6 +132,7 @@ parser code {:
     terminal SUB; 
     terminal MULT; 
     terminal DIV;
+    terminal SUM;
 
     terminal NOT;
     terminal LT;
@@ -139,7 +142,6 @@ parser code {:
     terminal EQ;
     terminal NE;
 
-
     terminal FORALL;
     terminal IN;
     terminal INTEST;
@@ -173,6 +175,7 @@ parser code {:
     terminal LABEL;
     terminal INT;
     terminal SUBTYPE;
+    terminal SUBCLASS;
     terminal OF;
 
     terminal SEMICOLON;
@@ -210,7 +213,8 @@ nonterminal ParseNode               setexpr;
 
 nonterminal    ParseNode               compare;
 nonterminal    ParseNode               expr;
-nonterminal    ParseNode               operator;
+nonterminal    ParseNode               addsuboperator;
+nonterminal    ParseNode               multdivoperator;
 
 
 
@@ -454,11 +458,39 @@ setexpr ::=
        set.getChild("dotinv").addChild("relation", parser.curLine(1)).addChild(relation);
        RESULT = set;
        :}
+
+       | setexpr:setexpr DOT ID:relation
+       {:
+       debugMessage(PRODSTRING);
+       ParseNode set = new ParseNode("setexpr", parser.curLine(3));
+       set.addChild("dotset").addChild(setexpr);
+       set.getChild("dotset").addChild("relation", parser.curLine(1)).addChild(relation);
+       RESULT = set;
+       :}
+
+       | setexpr:setexpr DOTINV ID:relation
+       {:
+       debugMessage(PRODSTRING);
+       ParseNode set = new ParseNode("setexpr", parser.curLine(3));
+       set.addChild("dotinvset").addChild(setexpr);
+       set.getChild("dotinvset").addChild("relation", parser.curLine(1)).addChild(relation);
+       RESULT = set;
+       :}
        ;
        
 expr ::=
-       
-       ID:var
+
+       SUM OPENPAREN ID:set DOT ID:relation CLOSEPAREN
+       {:
+       debugMessage(PRODSTRING);
+       ParseNode expr = new ParseNode("expr", parser.curLine(1));      
+       expr.addChild("sumexpr", parser.curLine(3));
+       expr.getChild("sumexpr").addChild("dot").addChild("set", parser.curLine(3)).addChild(set);
+       expr.getChild("sumexpr").getChild("dot").addChild("relation", parser.curLine(1)).addChild(relation);
+       RESULT = expr;
+       :}
+
+       | ID:var
        {:
        debugMessage(PRODSTRING);
        ParseNode expr = new ParseNode("expr", parser.curLine(1));      
@@ -472,7 +504,7 @@ expr ::=
        RESULT = expr;
        :}     
        
-       | LITERAL OPENPAREN literal:literal CLOSEPAREN
+       | literal:literal
        {:
        debugMessage(PRODSTRING);
        ParseNode expr = new ParseNode("expr", parser.curLine(4));
@@ -499,7 +531,7 @@ expr ::=
        RESULT = relation.getRoot();
        :}
             
-       | expr:expr1 operator:operator expr:expr2
+       | expr:expr1 addsuboperator:operator expr:expr2
        {:
        debugMessage(PRODSTRING);
        ParseNode op = (new ParseNode("expr", parser.curLine(3))).addChild("operator");
@@ -508,7 +540,17 @@ expr ::=
        op.addChild("right", parser.curLine(1)).addChild(expr2);
        RESULT = op.getRoot();
        :}
-
+       %prec ADD
+       | expr:expr1 multdivoperator:operator expr:expr2
+       {:
+       debugMessage(PRODSTRING);
+       ParseNode op = (new ParseNode("expr", parser.curLine(3))).addChild("operator");
+       op.addChild("op").addChild(operator);
+       op.addChild("left", parser.curLine(3)).addChild(expr1);
+       op.addChild("right", parser.curLine(1)).addChild(expr2);
+       RESULT = op.getRoot();
+       :}
+       %prec MULT
        | SIZEOF OPENPAREN setexpr:setexpr CLOSEPAREN
        {:
        ParseNode sizeof = (new ParseNode("expr", parser.curLine(4))).addChild("sizeof");
@@ -517,7 +559,7 @@ expr ::=
        :}
        ;
 
-operator ::=
+addsuboperator ::=
          
        ADD 
        {:
@@ -530,13 +572,13 @@ operator ::=
        debugMessage(PRODSTRING);
        RESULT = new ParseNode("sub", parser.curLine(1));
        :}
-         
-       | MULT
+       ;
+multdivoperator ::=
+       MULT
        {:
        debugMessage(PRODSTRING);
        RESULT = new ParseNode("mult", parser.curLine(1));
        :}
-         
        | DIV
        {:
        debugMessage(PRODSTRING);
@@ -596,12 +638,24 @@ literal ::=
        debugMessage(PRODSTRING);
        RESULT = (new ParseNode("literal", parser.curLine(1))).addChild("boolean").addChild("false").getRoot();
        :}
+
+       | NULL
+       {:
+       debugMessage(PRODSTRING);
+       RESULT = (new ParseNode("literal", parser.curLine(1))).addChild("decimal").addChild("0").getRoot();
+       :}
         
        | DECIMAL:dec
        {:
        debugMessage(PRODSTRING);
        RESULT = (new ParseNode("literal", parser.curLine(1))).addChild("decimal").addChild(dec).getRoot();
        :}
+
+       | SUB DECIMAL:dec
+       {:
+       debugMessage(PRODSTRING);
+       RESULT = (new ParseNode("literal", parser.curLine(1))).addChild("decimal").addChild("-"+dec).getRoot();
+       :}
         
        | STRING:str
        {:
@@ -615,7 +669,7 @@ literal ::=
        RESULT = (new ParseNode("literal", parser.curLine(1))).addChild("char").addChild(chr).getRoot();
        :}
         
-       | ID:literal
+       | LITERAL OPENPAREN ID:literal CLOSEPAREN
        {:
        debugMessage(PRODSTRING);
        RESULT = (new ParseNode("literal", parser.curLine(1))).addChild("token").addChild(literal).getRoot();