| M.Let _ x y
| M.Select _ x y
| M.For _ _ x y -> iter an_set [x; y]
+ | M.While _ x y -> iter an_set [x; y]
| M.Fun _ _ l -> iter an_set l
| M.Gen _ l -> iter an_set l
| M.Add _ g x -> join (an_grp g) (an_set x)
%token ADD ALIGN AND AS ATTR BE BUT COUNT DIFF DISTR ELSE EMPTY EQ EX
%token FALSE FOR FROM GEN IF IN INF INTER INV ISF IST KEEP LE LET LOG LT
%token MAIN MATCH MEET NOT OF OR PAT PEEK PROJ PROP READ RENDER SELECT
- %token SEQ SOURCE STAT SUB SUP SUPER THEN TRUE UNION WHERE XOR
+ %token SEQ SOURCE STAT SUB SUP SUPER THEN TRUE UNION WHERE WHILE XOR
%nonassoc SOURCE
%right IN SEQ
| KEEP allbut ppaths IN set_exp { make_fun ["keep"; $2] $3 [$5] }
| KEEP allbut set_exp { make_fun ["keep"; $2] [] [$3] }
| path LC paths RC LC sets RC { make_fun $1 $3 $6 }
- | set_exp SEQ set_exp { make_fun ["seq"] [] [$1; $3] }
| set_exp DIFF set_exp { make_fun ["diff"] [] [$1; $3] }
| set_exp UNION set_exp { make_fun ["union"] [] [$1; $3] }
| set_exp INTER set_exp { make_fun ["intersect"] [] [$1; $3] }
| EX set_exp { M.Ex (analyze $2) $2 }
| svar { M.SVar $1 }
| avar { M.AVar $1 }
- | LET svar BE set_exp IN set_exp { M.Let $2 $4 $6 }
+ | LET svar BE set_exp IN set_exp { M.Let (Some $2) $4 $6 }
+ | set_exp SEQ set_exp { M.Let None $1 $3 }
| FOR avar IN set_exp gen_op { M.For (fst $5) $2 $4 (snd $5) }
+ | WHILE set_exp gen_op { M.While (fst $3) $2 (snd $3) }
| ADD distr grp_exp IN set_exp { M.Add $2 $3 $5 }
| PROP qualif mainc istrue isfalse attrc OF pattern set_exp
{ M.Property (f $2) (s $2) (t $2) $3 $4 $5 $6 $8 $9 }