linearFormula ::= T_IDENT:name {:RESULT = new State(name); :} | T_TRUE {:RESULT = new BooleanLeaf(true); :} | T_FALSE {:RESULT = new BooleanLeaf(false); :} | linearConstraint:value {:RESULT = new LinearConstraint(value); :} | linearFormula:op1 T_AND linearFormula:op2 {:RESULT = new And(op1, op2); :} | linearFormula:op1 T_OR linearFormula:op2 {:RESULT = new Or(op1, op2); :} // | T_LEFTBRACKET linearFormula:op1 T_RIGHTBRACKET {:RESULT = new Bracket(op1); :} ; linearConstraint ::= linearExpression:op1 T_EQ linearExpression:op2 {:RESULT = op1+" = "+op2; :} | linearExpression:op1 T_GREATER linearExpression:op2 {:RESULT = op1+" > "+op2; :} | linearExpression:op1 T_GEQ linearExpression:op2 {:RESULT = op1+" >= "+op2; :} | linearExpression:op1 T_LESS linearExpression:op2 {:RESULT = op1+" < "+op2; :} | linearExpression:op1 T_LEQ linearExpression:op2 {:RESULT = op1+" <= "+op2; :} ; linearExpression ::= T_IDENT:s {:RESULT = s; :} | T_NUMBER:n {:RESULT = n; :} | linearExpression:op1 T_PLUS linearExpression:op2 {:RESULT = op1+" + "+op2; :} | linearExpression:op1 T_MINUS linearExpression:op2 {:RESULT = op1+" - "+op2; :} | linearExpression:op1 T_DIV linearExpression:op2 {:RESULT = op1+" / "+op2; :} | linearExpression:op1 T_TIMES linearExpression:op2 {:RESULT = op1+" * "+op2; :} | T_LEFTBRACKET linearExpression:op1 T_RIGHTBRACKET {:RESULT = "("+op1+")"; :} ;