- | IF LPAREN exp RPAREN LBRACE block RBRACE ifte
- (let val ((L, O), _) = ifte in
- BITEM (Ifthenelse_i((exp, block) :: L, O),
- (IFleft, ifteright))
- end)
- | FOREACH LPAREN IDENT IN exp RPAREN LBRACE block RBRACE
- (BITEM (Foreach_i (IDENT, exp, block),
- (FOREACHleft, RBRACEright)))
- | FOREACH LPAREN IDENT IN exp DOTDOT exp RPAREN LBRACE block RBRACE
- (BITEM (For_i (IDENT, exp1, exp2, block),
- (FOREACHleft, RBRACEright)))
- | CASE pexp matches
- (BITEM (Case_i (pexp, #1 matches), (CASEleft, matchesright)))
- | TRY LBRACE block RBRACE catches
- (BITEM (TryCatch_i (block, catches), (TRYleft, catchesright)))
-
-ifte : ELSE LBRACE block RBRACE (([], SOME block), (ELSEleft, RBRACEright))
- | ELSE IF LPAREN exp RPAREN LBRACE block RBRACE ifte (let val ((L, O), _) = ifte in
- (((exp, block) :: L, O), (ELSEleft, ifteright))
- end)
- | (([], NONE), (0, 0))
+ | IF exp THEN block elseOpt END
+ (BITEM (Ifthenelse_i(exp, compact block, elseOpt),
+ (IFleft, ENDright)))
+ | FOREACH pat IN exp DO block END
+ (BITEM (Foreach_i (pat, exp, compact block),
+ (FOREACHleft, ENDright)))
+ | FOR IDENT IN exp DOTDOT exp DO block END
+ (BITEM (For_i (IDENT, exp1, exp2, compact block),
+ (FORleft, ENDright)))
+ | SWITCH exp OF matches END
+ (BITEM (Case_i (exp, List.rev (#1 matches)), (SWITCHleft, ENDright)))
+ | TRY block WITH catches END
+ (BITEM (TryCatch_i (compact block, List.rev catches), (TRYleft, ENDright)))
+
+elseOpt : (NONE)
+ | ELSEIF exp THEN block elseOpt (SOME (BLOCK ([BITEM (Ifthenelse_i (exp, compact block, elseOpt),
+ (ELSEIFleft, elseOptright))],
+ (ELSEIFleft, elseOptright))))
+ | ELSE block (SOME (compact block))