check in changes to allow [this.length] into grammar
[repair.git] / Repair / RepairCompiler / MCC / MDL.cup
index 7014831781db21cc2748038f01058459147d429d..7a775c7426691169e56714098363907fafa68eeb 100755 (executable)
@@ -56,13 +56,36 @@ action code {:
 init with {: :}
 
 parser code {:
+
+       public String filename;
        
        public void syntax_error (java_cup.runtime.Symbol current) {
 
                CUP$MDLParser$actions.errors = true;
                Symbol symbol = (Symbol) current;
-               report_error("MDL: Syntax error at line " + (symbol.line + 1)
-               + ", column " + LineCount.getColumn(symbol.left) + ": " + current.value, current);
+
+               //System.out.println("current.value = "+current.value + " " + current.value.equals("true"));
+               //System.out.println("current = " + current);
+
+               boolean isInteger = true;
+               try{ 
+                   Integer.parseInt(current.value.toString());
+               } catch(NumberFormatException e) { isInteger = false;}
+
+                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+")?");
+               */
+              
+                       if (LineCount.getColumn(symbol.left) == 0)      
+                  System.out.println("Did you forget a semicolon on the previous line?");    
+               
+
+               System.out.println();
+               System.exit(0);
        }
 
        public void report_fatal_error (String message, Object info) {
@@ -116,6 +139,7 @@ parser code {:
     terminal SUB; 
     terminal MULT; 
     terminal DIV;
+    terminal SUM;
 
     terminal NOT;
     terminal LT;
@@ -128,6 +152,7 @@ parser code {:
     terminal FORALL;
     terminal IN;
     terminal INTEST;
+    terminal THIS;
 
     terminal COMMA;
     terminal SIZEOF;
@@ -158,6 +183,7 @@ parser code {:
     terminal LABEL;
     terminal INT;
     terminal SUBTYPE;
+    terminal SUBCLASS;
     terminal OF;
 
     terminal SEMICOLON;
@@ -447,13 +473,14 @@ expr ::=
        RESULT = expr;
        :}     
     
-       | LITERAL OPENPAREN literal:literal CLOSEPAREN       
+       |  literal:literal
        {:
        debugMessage(PRODSTRING);
        ParseNode expr = new ParseNode("expr", parser.curLine(4));
        expr.addChild(literal);
        RESULT = expr;
        :}
+
                
        | expr:leftexpr LT expr:rightexpr 
        {:
@@ -569,7 +596,7 @@ expr ::=
        {:
        debugMessage(PRODSTRING);
        ParseNode bool = (new ParseNode("expr", parser.curLine(3))).addChild("operator");
-       bool.addChild("op").addChild("and");
+       bool.addChild("op").addChild("or");
        bool.addChild("left", parser.curLine(3)).addChild(leftexpr);
        bool.addChild("right", parser.curLine(1)).addChild(rightexpr);
        RESULT = bool.getRoot();
@@ -617,12 +644,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
        {:
@@ -636,7 +675,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();