git.annexia.org
/
whenjobs.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Add 'len <expr>' operator.
[whenjobs.git]
/
lib
/
whenexpr.ml
diff --git
a/lib/whenexpr.ml
b/lib/whenexpr.ml
index
f24e9ed
..
8ccde2c
100644
(file)
--- a/
lib/whenexpr.ml
+++ b/
lib/whenexpr.ml
@@
-47,6
+47,7
@@
type whenexpr =
| Expr_mul of whenexpr * whenexpr
| Expr_div of whenexpr * whenexpr
| Expr_mod of whenexpr * whenexpr
| Expr_mul of whenexpr * whenexpr
| Expr_div of whenexpr * whenexpr
| Expr_mod of whenexpr * whenexpr
+ | Expr_len of whenexpr
| Expr_changes of string
| Expr_increases of string
| Expr_decreases of string
| Expr_changes of string
| Expr_increases of string
| Expr_decreases of string
@@
-202,6
+203,9
@@
and expr_of_iexpr _loc = function
| IExpr_app ("mod", exprs) ->
two_params _loc "+" exprs (fun e1 e2 -> Expr_mod (e1, e2))
| IExpr_app ("mod", exprs) ->
two_params _loc "+" exprs (fun e1 e2 -> Expr_mod (e1, e2))
+ | IExpr_app (("len"|"length"|"size"), exprs) ->
+ one_param _loc "len" exprs (fun e1 -> Expr_len e1)
+
| IExpr_app (("change"|"changes"|"changed"), [IExpr_var v]) ->
Expr_changes v
| IExpr_app (("change"|"changes"|"changed"), [IExpr_var v]) ->
Expr_changes v
@@
-274,6
+278,7
@@
let rec string_of_whenexpr = function
sprintf "%s / %s" (string_of_whenexpr e1) (string_of_whenexpr e2)
| Expr_mod (e1, e2) ->
sprintf "%s mod %s" (string_of_whenexpr e1) (string_of_whenexpr e2)
sprintf "%s / %s" (string_of_whenexpr e1) (string_of_whenexpr e2)
| Expr_mod (e1, e2) ->
sprintf "%s mod %s" (string_of_whenexpr e1) (string_of_whenexpr e2)
+ | Expr_len e -> sprintf "len %s" (string_of_whenexpr e)
| Expr_changes v -> sprintf "changes %s" v
| Expr_increases v -> sprintf "increases %s" v
| Expr_decreases v -> sprintf "decreases %s" v
| Expr_changes v -> sprintf "changes %s" v
| Expr_increases v -> sprintf "increases %s" v
| Expr_decreases v -> sprintf "decreases %s" v
@@
-310,7
+315,8
@@
let rec dependencies_of_whenexpr = function
| Expr_div (e1, e2)
| Expr_mod (e1, e2) ->
dependencies_of_whenexpr e1 @ dependencies_of_whenexpr e2
| Expr_div (e1, e2)
| Expr_mod (e1, e2) ->
dependencies_of_whenexpr e1 @ dependencies_of_whenexpr e2
- | Expr_not e ->
+ | Expr_not e
+ | Expr_len e ->
dependencies_of_whenexpr e
| Expr_changes v
| Expr_increases v
dependencies_of_whenexpr e
| Expr_changes v
| Expr_increases v
@@
-417,6
+423,11
@@
let rec eval_whenexpr variables prev_variables onload = function
and e2 = eval_whenexpr variables prev_variables onload e2 in
mod_values e1 e2
and e2 = eval_whenexpr variables prev_variables onload e2 in
mod_values e1 e2
+ | Expr_len e ->
+ let e = eval_whenexpr variables prev_variables onload e in
+ let e = string_of_variable e in
+ T_int (big_int_of_int (String.length e))
+
| Expr_changes v ->
let prev_value, curr_value = get_prev_curr_value variables prev_variables v in
if compare_values prev_value curr_value <> 0 then
| Expr_changes v ->
let prev_value, curr_value = get_prev_curr_value variables prev_variables v in
if compare_values prev_value curr_value <> 0 then