rendered paste bodylinearFormula ::= 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+")"; :}
;