summaryrefslogtreecommitdiff
path: root/impl/EquationSystem.g
diff options
context:
space:
mode:
authorCarlo Zancanaro <carlo@carlo-laptop>2012-05-28 13:00:50 +1000
committerCarlo Zancanaro <carlo@carlo-laptop>2012-05-28 13:00:50 +1000
commitea05c9c5fa30b8822f618e861d12a09df1f8f017 (patch)
treecb8717d9773ef77978dc8e1d9093560e3cf26532 /impl/EquationSystem.g
parentee8547cf3c89c51ff10603814e6f745466bc4c79 (diff)
Fix memory error and x = max(-inf, expr) stuff.
Diffstat (limited to 'impl/EquationSystem.g')
-rw-r--r--impl/EquationSystem.g19
1 files changed, 13 insertions, 6 deletions
diff --git a/impl/EquationSystem.g b/impl/EquationSystem.g
index 6db7045..3a6598a 100644
--- a/impl/EquationSystem.g
+++ b/impl/EquationSystem.g
@@ -3,27 +3,34 @@ grammar EquationSystem;
options {
language=C;
output=AST;
+ backtrack=true;
}
tokens {
- SYSTEM = 'system' ;
PLUS = '+' ;
SUB = '-' ;
MULT = '*' ;
+ COMMA = ';' ;
+ GUARD = 'guard' ;
+ GREATER_EQUAL = '>=' ;
+ QUESTION_MARK = '?' ;
MAXIMUM = 'max' ;
MINIMUM = 'min' ;
NEWLINE = '\n' ;
}
-equation_system : equation ( NEWLINE! + equation )* (NEWLINE!) *;
-equation : VARIABLE '='! maxExpr;
+equation_system : equation ( NEWLINE! + equation )* (NEWLINE!)* ;
+equation : VARIABLE '='! maxExpr ;
-maxExpr : MAXIMUM^ '('! minExpr ( ','! minExpr )* ')'! | minExpr;
+maxExpr : MAXIMUM^ '('! minExpr ( ','! minExpr )* ')'! | minExpr ;
minExpr : MINIMUM^ '('! maxExpr ( ','! maxExpr )* ')'! | expr ;
-expr : term ( (PLUS | MULT | SUB)^ term )* ;
+expr : '(' expr GREATER_EQUAL expr QUESTION_MARK expr ')' -> ^(GUARD expr expr expr)
+ | term ( (PLUS | MULT | SUB | COMMA)^ expr )* ;
-term : NUMBER | VARIABLE ;
+term : NUMBER
+ | VARIABLE
+ | '('! expr ')'! ;
NUMBER : (DIGIT)+ ;