diff options
Diffstat (limited to 'src/odf/odf_ExpressionParser.mly')
-rwxr-xr-x | src/odf/odf_ExpressionParser.mly | 48 |
1 files changed, 27 insertions, 21 deletions
diff --git a/src/odf/odf_ExpressionParser.mly b/src/odf/odf_ExpressionParser.mly index 54836cd..2acd1b8 100755 --- a/src/odf/odf_ExpressionParser.mly +++ b/src/odf/odf_ExpressionParser.mly @@ -6,6 +6,13 @@ let extractColumnNameFromNum (fixed, str) = (fixed, int_of_string str) + let build_call ident = function + | [] -> Expr.call0 ident + | [p1] -> Expr.call1 ident p1 + | [p1;p2] -> Expr.call2 ident p1 p2 + | [p1;p2;p3] -> Expr.call3 ident p1 p2 p3 + | n -> Expr.callN ident n + %} %token <string> REAL @@ -35,7 +42,7 @@ %left TIMES DIVIDE %left POW -%start<ScTypes.expression> value +%start<ScTypes.Expr.t> value %% @@ -43,37 +50,36 @@ value: | LETTERS COLON EQ expr EOF {$4} expr: - | num {Value (number ($1))} - | MINUS expr {Call (S.sub, [$2])} - | PLUS expr {Call (S.add, [$2])} + | num {Expr.value (Type.number ($1))} + | MINUS expr {Expr.call1 S.sub $2} + | PLUS expr {Expr.call1 S.add $2} | L_SQ_BRACKET ref R_SQ_BRACKET {$2} - | LPAREN expr RPAREN {Expression $2} - | STR {Value (string (u $1))} + | LPAREN expr RPAREN {Expr.expression $2} + | STR {Expr.value (Type.string (u $1))} (* Mathematical operators *) - | expr MINUS expr {Call (S.sub, [$1; $3])} - | expr DIVIDE expr {Call (S.div, [$1; $3])} - | expr TIMES expr {Call (S.mul, [$1; $3])} - | expr PLUS expr {Call (S.add, [$1; $3])} - | expr POW expr {Call (S.pow, [$1; $3])} + | expr MINUS expr {Expr.call2 S.sub $1 $3} + | expr DIVIDE expr {Expr.call2 S.div $1 $3} + | expr TIMES expr {Expr.call2 S.mul $1 $3} + | expr PLUS expr {Expr.call2 S.add $1 $3} + | expr POW expr {Expr.call2 S.pow $1 $3} (* Comparaison *) - | expr EQ expr {Call (S.eq, [$1; $3])} - | expr NEQ expr {Call (S.neq, [$1; $3])} - | expr LT expr {Call (S.lt, [$1; $3])} - | expr GT expr {Call (S.gt, [$1; $3])} - | expr LE expr {Call (S.le, [$1; $3])} - | expr GE expr {Call (S.ge, [$1; $3])} - - | ident LPAREN separated_list(SEMICOLON, expr) RPAREN { Call (u $1, $3) } + | expr EQ expr {Expr.call2 S.eq $1 $3} + | expr NEQ expr {Expr.call2 S.neq $1 $3} + | expr LT expr {Expr.call2 S.lt $1 $3} + | expr GT expr {Expr.call2 S.gt $1 $3} + | expr LE expr {Expr.call2 S.le $1 $3} + | expr GE expr {Expr.call2 S.ge $1 $3} + | ident LPAREN separated_list(SEMICOLON, expr) RPAREN { build_call (u $1) $3 } ref: - | cell {Ref (Cell $1)} - | cell COLON cell {Ref (Range ($1, $3))} + | cell {Expr.ref (Refs.cell $1)} + | cell COLON cell {Expr.ref (Refs.range $1 $3)} cell: | DOT fixed(LETTERS) fixed(NUM){Cell.from_string $2 (extractColumnNameFromNum $3)} |