X-Git-Url: http://plrg.eecs.uci.edu/git/?p=repair.git;a=blobdiff_plain;f=Repair%2FRepairCompiler%2FMCC%2FCDL.cup;h=6de3880a3f33ca5904d88a389df83e432477d0dd;hp=e6df103acbbac122346598cce8833221ebf1e77e;hb=312a3d1c3b3dddc26a8a5a7e2ec0e0c393d80814;hpb=08fd782ecea5e9ce28ad24debbcb650c217e6fab diff --git a/Repair/RepairCompiler/MCC/CDL.cup b/Repair/RepairCompiler/MCC/CDL.cup index e6df103..6de3880 100755 --- a/Repair/RepairCompiler/MCC/CDL.cup +++ b/Repair/RepairCompiler/MCC/CDL.cup @@ -56,13 +56,29 @@ action code {: init with {: :} parser code {: + + public String filename; public void syntax_error (java_cup.runtime.Symbol current) { CUP$CDLParser$actions.errors = true; Symbol symbol = (Symbol) current; - report_error("CDL: Syntax error at line " + (symbol.line + 1) - + ", column " + LineCount.getColumn(symbol.left) + ": " + current.value, 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+")?"); + */ + + System.out.println(); + System.exit(0); } public void report_fatal_error (String message, Object info) { @@ -116,6 +132,7 @@ parser code {: terminal SUB; terminal MULT; terminal DIV; + terminal SUM; terminal NOT; terminal LT; @@ -125,7 +142,6 @@ parser code {: terminal EQ; terminal NE; - terminal FORALL; terminal IN; terminal INTEST; @@ -159,6 +175,7 @@ parser code {: terminal LABEL; terminal INT; terminal SUBTYPE; + terminal SUBCLASS; terminal OF; terminal SEMICOLON; @@ -196,7 +213,8 @@ nonterminal ParseNode setexpr; nonterminal ParseNode compare; nonterminal ParseNode expr; -nonterminal ParseNode operator; +nonterminal ParseNode addsuboperator; +nonterminal ParseNode multdivoperator; @@ -440,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)); @@ -458,7 +504,7 @@ expr ::= RESULT = expr; :} - | LITERAL OPENPAREN literal:literal CLOSEPAREN + | literal:literal {: debugMessage(PRODSTRING); ParseNode expr = new ParseNode("expr", parser.curLine(4)); @@ -485,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"); @@ -494,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"); @@ -503,7 +559,7 @@ expr ::= :} ; -operator ::= +addsuboperator ::= ADD {: @@ -516,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); @@ -582,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 {: @@ -601,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();