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) {
terminal SUB;
terminal MULT;
terminal DIV;
+ terminal SUM;
terminal NOT;
terminal LT;
terminal EQ;
terminal NE;
-
terminal FORALL;
terminal IN;
terminal INTEST;
terminal LABEL;
terminal INT;
terminal SUBTYPE;
+ terminal SUBCLASS;
terminal OF;
terminal SEMICOLON;
nonterminal ParseNode compare;
nonterminal ParseNode expr;
-nonterminal ParseNode operator;
+nonterminal ParseNode addsuboperator;
+nonterminal ParseNode multdivoperator;
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));
RESULT = expr;
:}
- | LITERAL OPENPAREN literal:literal CLOSEPAREN
+ | literal:literal
{:
debugMessage(PRODSTRING);
ParseNode expr = new ParseNode("expr", parser.curLine(4));
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");
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");
:}
;
-operator ::=
+addsuboperator ::=
ADD
{:
debugMessage(PRODSTRING);
RESULT = new ParseNode("sub", parser.curLine(1));
:}
-
- | MULT
+ ;
+multdivoperator ::=
+ MULT
{:
debugMessage(PRODSTRING);
RESULT = new ParseNode("mult", parser.curLine(1));
:}
-
| DIV
{:
debugMessage(PRODSTRING);
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
{:
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();