|
@@ -1083,10 +1083,8 @@ and block acc s =
|
|
block acc s
|
|
block acc s
|
|
|
|
|
|
and parse_block_elt = parser
|
|
and parse_block_elt = parser
|
|
- | [< '(Kwd Var,p1); vl = psep Comma parse_var_decl; p2 = semicolon >] ->
|
|
|
|
- (match vl with
|
|
|
|
- | [] -> error (Custom "Missing variable identifier") p1
|
|
|
|
- | _ -> (EVars vl,punion p1 p2))
|
|
|
|
|
|
+ | [< '(Kwd Var,p1); vl = parse_var_decls p1; p2 = semicolon >] ->
|
|
|
|
+ (EVars vl,punion p1 p2)
|
|
| [< e = expr; _ = semicolon >] -> e
|
|
| [< e = expr; _ = semicolon >] -> e
|
|
|
|
|
|
and parse_obj_decl = parser
|
|
and parse_obj_decl = parser
|
|
@@ -1105,11 +1103,38 @@ and parse_array_decl = parser
|
|
| [< >] ->
|
|
| [< >] ->
|
|
[]
|
|
[]
|
|
|
|
|
|
|
|
+and parse_var_decl_head = parser
|
|
|
|
+ | [< name, _ = dollar_ident; t = parse_type_opt >] -> (name,t)
|
|
|
|
+
|
|
|
|
+and parse_var_assignment = parser
|
|
|
|
+ | [< '(Binop OpAssign,p1); s >] ->
|
|
|
|
+ begin match s with parser
|
|
|
|
+ | [< e = expr >] -> Some e
|
|
|
|
+ | [< >] -> error (Custom "expression expected after =") p1
|
|
|
|
+ end
|
|
|
|
+ | [< >] -> None
|
|
|
|
+
|
|
|
|
+and parse_var_decls_next vl = parser
|
|
|
|
+ | [< '(Comma,p1); name,t = parse_var_decl_head; s >] ->
|
|
|
|
+ begin try
|
|
|
|
+ let eo = parse_var_assignment s in
|
|
|
|
+ parse_var_decls_next ((name,t,eo) :: vl) s
|
|
|
|
+ with Display e ->
|
|
|
|
+ let v = (name,t,Some e) in
|
|
|
|
+ let e = (EVars(List.rev (v :: vl)),punion p1 (pos e)) in
|
|
|
|
+ display e
|
|
|
|
+ end
|
|
|
|
+ | [< >] ->
|
|
|
|
+ vl
|
|
|
|
+
|
|
|
|
+and parse_var_decls p1 = parser
|
|
|
|
+ | [< name,t = parse_var_decl_head; s >] ->
|
|
|
|
+ let eo = parse_var_assignment s in
|
|
|
|
+ List.rev (parse_var_decls_next [name,t,eo] s)
|
|
|
|
+ | [< s >] -> error (Custom "Missing variable identifier") p1
|
|
|
|
+
|
|
and parse_var_decl = parser
|
|
and parse_var_decl = parser
|
|
- | [< name, _ = dollar_ident; t = parse_type_opt; s >] ->
|
|
|
|
- match s with parser
|
|
|
|
- | [< '(Binop OpAssign,_); s >] -> let e = try expr s with Display e -> e in (name,t,Some e)
|
|
|
|
- | [< >] -> (name,t,None)
|
|
|
|
|
|
+ | [< name,t = parse_var_decl_head; eo = parse_var_assignment >] -> (name,t,eo)
|
|
|
|
|
|
and inline_function = parser
|
|
and inline_function = parser
|
|
| [< '(Kwd Inline,_); '(Kwd Function,p1) >] -> true, p1
|
|
| [< '(Kwd Inline,_); '(Kwd Function,p1) >] -> true, p1
|