let optv, venv = Var_env.new_ident_from_type venv optt in
fprintf ff "(match %s with@," v;
fprintf ff "| Json_null -> None@,";
- fprintf ff "@<v 8>| %s ->@," (name_of_var optv);
+ fprintf ff "@[<v 8>| %s ->@," (name_of_var optv);
of_json ff venv optv optt tname;
fprintf ff "@]@,)"
| C_list elemt ->
{}
repn:
-| expr
+| expr_or_tuple
{ $1 }
-| expr STAR tuple
- { C_tuple ($1 :: (List.rev $3)) }
| record
{ C_record (List.rev $1) }
| variant
{ C_variant (List.rev $1) }
+expr_or_tuple:
+| expr
+ { $1 }
+| expr STAR tuple
+ { C_tuple ($1 :: (List.rev $3)) }
+
+tuple:
+| tuple STAR expr
+ { $3 :: $1 }
+| expr
+ { [ $1 ] }
+
expr:
-| LPAREN expr RPAREN
+| LPAREN expr_or_tuple RPAREN
{ $2 }
-| LPAREN expr STAR tuple RPAREN
- { C_tuple ($2 :: (List.rev $4)) }
+
| expr LIDENT
{ match $2 with
| "option" -> C_option $1
| base
{ C_base $1 }
-tuple:
-| tuple STAR expr
- { $3 :: $1 }
-| expr
- { [ $1 ] }
-
base:
| LIDENT { match $1 with
| "string" -> B_string
*/
record:
-| LBRACE field_decls RBRACE
+| LBRACE field_decls opt_semi RBRACE
{ $2 }
field_decls:
| field_decl
{ [ $1 ] }
+opt_semi:
+| SEMI
+ {}
+| /* epsilon */
+ {}
+
field_decl:
-| LIDENT COLON expr
+| LIDENT COLON expr_or_tuple
{ ($1, $3) }
-| MUTABLE LIDENT COLON expr
+| MUTABLE LIDENT COLON expr_or_tuple
{ ($2, $4) }
variant: