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;
precedence left OR;
precedence left AND;
-precedence right EQ, NE;
-precedence right LT, LE, GE, GT;
+precedence left EQ, NE;
+precedence left LT, LE, GE, GT;
+
precedence left ADD, SUB;
precedence left MULT, DIV;
+
precedence left NOT;
+
precedence left DOT, DOTINV;
// PRODUCTION RULES /////////////////////////////////////////////////////
q.addChild(set);
RESULT = q;
:}
+ | FORALL LT ID:r1 COMMA ID:r2 GT IN ID:relation
+ {:
+ debugMessage(PRODSTRING);
+ ParseNode q = new ParseNode("quantifier", parser.curLine(7));
+ q.addChild("relation", parser.curLine(1)).addChild(relation);
+ q.addChild("left", parser.curLine(5)).addChild(r1);
+ q.addChild("right", parser.curLine(3)).addChild(r2);
+ RESULT = q;
+ :}
;
set ::=
predicate ::=
- ID:var IN setexpr:setexpr
+ expr:expr IN setexpr:setexpr
{:
debugMessage(PRODSTRING);
ParseNode inclusion = (new ParseNode("predicate", parser.curLine(3))).addChild("inclusion");
- inclusion.addChild("quantifiervar", parser.curLine(3)).addChild(var);
+ inclusion.addChild(expr);
inclusion.addChild(setexpr);
RESULT = inclusion.getRoot();
:}
- | SIZEOF OPENPAREN setexpr:setexpr CLOSEPAREN compare:compare LITERAL OPENPAREN DECIMAL:dec CLOSEPAREN
- {:
- ParseNode sizeof = (new ParseNode("predicate", parser.curLine(4))).addChild("sizeof");
- sizeof.addChild(setexpr);
- sizeof.addChild("compare", parser.curLine(2)).addChild(compare);
- sizeof.addChild("decimal", parser.curLine(1)).addChild(dec);
- RESULT = sizeof.getRoot();
- :}
-
- | ID:var DOT ID:relation compare:compare expr:expr
+ | expr:lexpr compare:compare expr:rexpr
{:
debugMessage(PRODSTRING);
- ParseNode comparison = (new ParseNode("predicate", parser.curLine(3))).addChild("comparison");
- comparison.addChild("compare", parser.curLine(2)).addChild(compare);
- comparison.addChild("relation", parser.curLine(3)).addChild(relation);
- comparison.addChild("quantifier", parser.curLine(5)).addChild(var);
- comparison.addChild(expr);
+ ParseNode comparison = (new ParseNode("predicate", parser.curLine(3))).addChild("expr").addChild("operator");
+ comparison.addChild("op").addChild(compare);
+ comparison.addChild("left", parser.curLine(2)).addChild(lexpr);
+ comparison.addChild("right", parser.curLine(2)).addChild(rexpr);
RESULT = comparison.getRoot();
:}
+
;
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("sumexpr", parser.curLine(3));
+ expr.addChild("dot").addChild("set", parser.curLine(3)).addChild(set);
+ expr.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));
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();