1 /***********************************************************************/
5 /* Xavier Leroy, projet Cristal, INRIA Rocquencourt */
7 /* Copyright 1996 Institut National de Recherche en Informatique et */
8 /* en Automatique. All rights reserved. This file is distributed */
9 /* under the terms of the Q Public License version 1.0. */
11 /***********************************************************************/
15 /* The parser definition */
24 { ptyp_desc = d; ptyp_loc = symbol_rloc() }
26 { ppat_desc = d; ppat_loc = symbol_rloc() }
28 { pexp_desc = d; pexp_loc = symbol_rloc() }
30 { pmty_desc = d; pmty_loc = symbol_rloc() }
32 { psig_desc = d; psig_loc = symbol_rloc() }
34 { pmod_desc = d; pmod_loc = symbol_rloc() }
36 { pstr_desc = d; pstr_loc = symbol_rloc() }
38 { pfield_desc = d; pfield_loc = symbol_rloc() }
40 { pcl_desc = d; pcl_loc = symbol_rloc() }
42 { pcty_desc = d; pcty_loc = symbol_rloc() }
44 let reloc_pat x = { x with ppat_loc = symbol_rloc () };;
45 let reloc_exp x = { x with pexp_loc = symbol_rloc () };;
47 let mkoperator name pos =
48 { pexp_desc = Pexp_ident(Lident name); pexp_loc = rhs_loc pos }
51 Ghost expressions and patterns:
52 expressions and patterns that do not appear explicitely in the
53 source file they have the loc_ghost flag set to true.
54 Then the profiler will not try to instrument them and the
55 -stypes option will not try to display their type.
57 Every grammar rule that generates an element with a location must
58 make at most one non-ghost element, the topmost one.
60 How to tell whether your location must be ghost:
61 A location corresponds to a range of characters in the source file.
62 If the location contains a piece of code that is syntactically
63 valid (according to the documentation), and corresponds to the
64 AST node, then the location must be real; in all other cases,
67 let ghexp d = { pexp_desc = d; pexp_loc = symbol_gloc () };;
68 let ghpat d = { ppat_desc = d; ppat_loc = symbol_gloc () };;
69 let ghtyp d = { ptyp_desc = d; ptyp_loc = symbol_gloc () };;
73 | {pexp_desc = Pexp_construct (Lident "false", None, false) } ->
74 mkexp (Pexp_assertfalse)
75 | _ -> mkexp (Pexp_assert (e))
78 let mkinfix arg1 name arg2 =
79 mkexp(Pexp_apply(mkoperator name 2, ["", arg1; "", arg2]))
81 let neg_float_string f =
82 if String.length f > 0 && f.[0] = '-'
83 then String.sub f 1 (String.length f - 1)
86 let mkuminus name arg =
87 match name, arg.pexp_desc with
88 | "-", Pexp_constant(Const_int n) ->
89 mkexp(Pexp_constant(Const_int(-n)))
90 | "-", Pexp_constant(Const_int32 n) ->
91 mkexp(Pexp_constant(Const_int32(Int32.neg n)))
92 | "-", Pexp_constant(Const_int64 n) ->
93 mkexp(Pexp_constant(Const_int64(Int64.neg n)))
94 | "-", Pexp_constant(Const_nativeint n) ->
95 mkexp(Pexp_constant(Const_nativeint(Nativeint.neg n)))
96 | _, Pexp_constant(Const_float f) ->
97 mkexp(Pexp_constant(Const_float(neg_float_string f)))
99 mkexp(Pexp_apply(mkoperator ("~" ^ name) 1, ["", arg]))
101 let rec mktailexp = function
103 ghexp(Pexp_construct(Lident "[]", None, false))
105 let exp_el = mktailexp el in
106 let l = {loc_start = e1.pexp_loc.loc_start;
107 loc_end = exp_el.pexp_loc.loc_end;
110 let arg = {pexp_desc = Pexp_tuple [e1; exp_el]; pexp_loc = l} in
111 {pexp_desc = Pexp_construct(Lident "::", Some arg, false); pexp_loc = l}
113 let rec mktailpat = function
115 ghpat(Ppat_construct(Lident "[]", None, false))
117 let pat_pl = mktailpat pl in
118 let l = {loc_start = p1.ppat_loc.loc_start;
119 loc_end = pat_pl.ppat_loc.loc_end;
122 let arg = {ppat_desc = Ppat_tuple [p1; pat_pl]; ppat_loc = l} in
123 {ppat_desc = Ppat_construct(Lident "::", Some arg, false); ppat_loc = l}
126 { pstr_desc = Pstr_eval e; pstr_loc = {e.pexp_loc with loc_ghost = true} }
128 let array_function str name =
129 Ldot(Lident str, (if !Clflags.fast then "unsafe_" ^ name else name))
131 let rec deep_mkrangepat c1 c2 =
132 if c1 = c2 then ghpat(Ppat_constant(Const_char c1)) else
133 ghpat(Ppat_or(ghpat(Ppat_constant(Const_char c1)),
134 deep_mkrangepat (Char.chr(Char.code c1 + 1)) c2))
136 let rec mkrangepat c1 c2 =
137 if c1 > c2 then mkrangepat c2 c1 else
138 if c1 = c2 then mkpat(Ppat_constant(Const_char c1)) else
139 reloc_pat (deep_mkrangepat c1 c2)
141 let syntax_error () =
142 raise Syntaxerr.Escape_error
144 let unclosed opening_name opening_num closing_name closing_num =
145 raise(Syntaxerr.Error(Syntaxerr.Unclosed(rhs_loc opening_num, opening_name,
146 rhs_loc closing_num, closing_name)))
148 let bigarray_function str name =
149 Ldot(Ldot(Lident "Bigarray", str), name)
151 let bigarray_untuplify = function
152 { pexp_desc = Pexp_tuple explist} -> explist
155 let bigarray_get arr arg =
156 match bigarray_untuplify arg with
158 mkexp(Pexp_apply(ghexp(Pexp_ident(bigarray_function "Array1" "get")),
161 mkexp(Pexp_apply(ghexp(Pexp_ident(bigarray_function "Array2" "get")),
162 ["", arr; "", c1; "", c2]))
164 mkexp(Pexp_apply(ghexp(Pexp_ident(bigarray_function "Array3" "get")),
165 ["", arr; "", c1; "", c2; "", c3]))
167 mkexp(Pexp_apply(ghexp(Pexp_ident(bigarray_function "Genarray" "get")),
168 ["", arr; "", ghexp(Pexp_array coords)]))
170 let bigarray_set arr arg newval =
171 match bigarray_untuplify arg with
173 mkexp(Pexp_apply(ghexp(Pexp_ident(bigarray_function "Array1" "set")),
174 ["", arr; "", c1; "", newval]))
176 mkexp(Pexp_apply(ghexp(Pexp_ident(bigarray_function "Array2" "set")),
177 ["", arr; "", c1; "", c2; "", newval]))
179 mkexp(Pexp_apply(ghexp(Pexp_ident(bigarray_function "Array3" "set")),
180 ["", arr; "", c1; "", c2; "", c3; "", newval]))
182 mkexp(Pexp_apply(ghexp(Pexp_ident(bigarray_function "Genarray" "set")),
184 "", ghexp(Pexp_array coords);
220 %token <string> FLOAT
227 %token GREATERRBRACKET
231 %token <string> INFIXOP0
232 %token <string> INFIXOP1
233 %token <string> INFIXOP2
234 %token <string> INFIXOP3
235 %token <string> INFIXOP4
241 %token <string> LABEL
248 %token LBRACKETGREATER
252 %token <string> LIDENT
261 %token <nativeint> NATIVEINT
266 %token <string> OPTLABEL
270 %token <string> PREFIXOP
273 %token QUESTIONQUESTION
284 %token <string> STRING
292 %token <string> UIDENT
300 /* Precedences and associativities.
302 Tokens and rules have precedences. A reduce/reduce conflict is resolved
303 in favor of the first rule (in source file order). A shift/reduce conflict
304 is resolved by comparing the precedence and associativity of the token to
305 be shifted with those of the rule to be reduced.
307 By default, a rule has the precedence of its rightmost terminal (if any).
309 When there is a shift/reduce conflict between a rule and a token that
310 have the same precedence, it is resolved using the associativity:
311 if the token is left-associative, the parser will reduce; if
312 right-associative, the parser will shift; if non-associative,
313 the parser will declare a syntax error.
315 We will only use associativities with operators of the kind x * x -> x
316 for example, in the rules of the form expr: expr BINOP expr
317 in all other cases, we define two precedences if needed to resolve
320 The precedences must be listed from low to high.
325 %nonassoc SEMI /* below EQUAL ({lbl=...; lbl=...}) */
326 %nonassoc LET /* above SEMI ( ...; let ... in ...) */
328 %nonassoc FUNCTION WITH /* below BAR (match ... with ...) */
329 %nonassoc AND /* above WITH (module rec A: SIG with ... and ...) */
330 %nonassoc THEN /* below ELSE (if ... then ...) */
331 %nonassoc ELSE /* (if ... then ... else ...) */
332 %nonassoc LESSMINUS /* below COLONEQUAL (lbl <- x := e) */
333 %right COLONEQUAL /* expr (e := e := e) */
335 %left BAR /* pattern (p|p|p) */
336 %nonassoc below_COMMA
337 %left COMMA /* expr/expr_comma_list (e,e,e) */
338 %right MINUSGREATER /* core_type2 (t -> t -> t) */
339 %right OR BARBAR /* expr (e || e || e) */
340 %right AMPERSAND AMPERAMPER /* expr (e && e && e) */
341 %nonassoc below_EQUAL
342 %left INFIXOP0 EQUAL LESS GREATER /* expr (e OP e OP e) */
343 %right INFIXOP1 /* expr (e OP e OP e) */
344 %right COLONCOLON /* expr (e :: e :: e) */
345 %left INFIXOP2 PLUS MINUS MINUSDOT /* expr (e OP e OP e) */
346 %left INFIXOP3 STAR /* expr (e OP e OP e) */
347 %right INFIXOP4 /* expr (e OP e OP e) */
348 %nonassoc prec_unary_minus /* unary - */
349 %nonassoc prec_constant_constructor /* cf. simple_expr (C versus C x) */
350 %nonassoc prec_constr_appl /* above AS BAR COLONCOLON COMMA */
351 %nonassoc below_SHARP
352 %nonassoc SHARP /* simple_expr/toplevel_directive */
355 /* Finally, the first tokens of simple_expr are above everything else. */
356 %nonassoc BACKQUOTE BEGIN CHAR FALSE FLOAT INT INT32 INT64
357 LBRACE LBRACELESS LBRACKET LBRACKETBAR LIDENT LPAREN
358 NEW NATIVEINT PREFIXOP STRING TRUE UIDENT
363 %start implementation /* for implementation files */
364 %type <Parsetree.structure> implementation
365 %start interface /* for interface files */
366 %type <Parsetree.signature> interface
367 %start toplevel_phrase /* for interactive use */
368 %type <Parsetree.toplevel_phrase> toplevel_phrase
369 %start use_file /* for the #use directive */
370 %type <Parsetree.toplevel_phrase list> use_file
380 signature EOF { List.rev $1 }
383 top_structure SEMISEMI { Ptop_def $1 }
384 | seq_expr SEMISEMI { Ptop_def[ghstrexp $1] }
385 | toplevel_directive SEMISEMI { $1 }
386 | EOF { raise End_of_file }
389 structure_item { [$1] }
390 | structure_item top_structure { $1 :: $2 }
394 | seq_expr use_file_tail { Ptop_def[ghstrexp $1] :: $2 }
398 | SEMISEMI EOF { [] }
399 | SEMISEMI seq_expr use_file_tail { Ptop_def[ghstrexp $2] :: $3 }
400 | SEMISEMI structure_item use_file_tail { Ptop_def[$2] :: $3 }
401 | SEMISEMI toplevel_directive use_file_tail { $2 :: $3 }
402 | structure_item use_file_tail { Ptop_def[$1] :: $2 }
403 | toplevel_directive use_file_tail { $1 :: $2 }
406 /* Module expressions */
410 { mkmod(Pmod_ident $1) }
411 | STRUCT structure END
412 { mkmod(Pmod_structure($2)) }
413 | STRUCT structure error
414 { unclosed "struct" 1 "end" 3 }
415 | FUNCTOR LPAREN UIDENT COLON module_type RPAREN MINUSGREATER module_expr
416 { mkmod(Pmod_functor($3, $5, $8)) }
417 | module_expr LPAREN module_expr RPAREN
418 { mkmod(Pmod_apply($1, $3)) }
419 | module_expr LPAREN module_expr error
420 { unclosed "(" 2 ")" 4 }
421 | LPAREN module_expr COLON module_type RPAREN
422 { mkmod(Pmod_constraint($2, $4)) }
423 | LPAREN module_expr COLON module_type error
424 { unclosed "(" 1 ")" 5 }
425 | LPAREN module_expr RPAREN
427 | LPAREN module_expr error
428 { unclosed "(" 1 ")" 3 }
431 structure_tail { $1 }
432 | seq_expr structure_tail { ghstrexp $1 :: $2 }
437 | SEMISEMI seq_expr structure_tail { ghstrexp $2 :: $3 }
438 | SEMISEMI structure_item structure_tail { $2 :: $3 }
439 | structure_item structure_tail { $1 :: $2 }
442 LET rec_flag let_bindings
444 [{ppat_desc = Ppat_any}, exp] -> mkstr(Pstr_eval exp)
445 | _ -> mkstr(Pstr_value($2, List.rev $3)) }
446 | EXTERNAL val_ident COLON core_type EQUAL primitive_declaration
447 { mkstr(Pstr_primitive($2, {pval_type = $4; pval_prim = $6})) }
448 | TYPE type_declarations
449 { mkstr(Pstr_type(List.rev $2)) }
450 | EXCEPTION UIDENT constructor_arguments
451 { mkstr(Pstr_exception($2, $3)) }
452 | EXCEPTION UIDENT EQUAL constr_longident
453 { mkstr(Pstr_exn_rebind($2, $4)) }
454 | MODULE UIDENT module_binding
455 { mkstr(Pstr_module($2, $3)) }
456 | MODULE REC module_rec_bindings
457 { mkstr(Pstr_recmodule(List.rev $3)) }
458 | MODULE TYPE ident EQUAL module_type
459 { mkstr(Pstr_modtype($3, $5)) }
461 { mkstr(Pstr_open $2) }
462 | CLASS class_declarations
463 { mkstr(Pstr_class (List.rev $2)) }
464 | CLASS TYPE class_type_declarations
465 { mkstr(Pstr_class_type (List.rev $3)) }
466 | INCLUDE module_expr
467 { mkstr(Pstr_include $2) }
472 | COLON module_type EQUAL module_expr
473 { mkmod(Pmod_constraint($4, $2)) }
474 | LPAREN UIDENT COLON module_type RPAREN module_binding
475 { mkmod(Pmod_functor($2, $4, $6)) }
478 module_rec_binding { [$1] }
479 | module_rec_bindings AND module_rec_binding { $3 :: $1 }
482 UIDENT COLON module_type EQUAL module_expr { ($1, $3, $5) }
489 { mkmty(Pmty_ident $1) }
491 { mkmty(Pmty_signature(List.rev $2)) }
492 | SIG signature error
493 { unclosed "sig" 1 "end" 3 }
494 | FUNCTOR LPAREN UIDENT COLON module_type RPAREN MINUSGREATER module_type
496 { mkmty(Pmty_functor($3, $5, $8)) }
497 | module_type WITH with_constraints
498 { mkmty(Pmty_with($1, List.rev $3)) }
499 | LPAREN module_type RPAREN
501 | LPAREN module_type error
502 { unclosed "(" 1 ")" 3 }
506 | signature signature_item { $2 :: $1 }
507 | signature signature_item SEMISEMI { $2 :: $1 }
510 VAL val_ident COLON core_type
511 { mksig(Psig_value($2, {pval_type = $4; pval_prim = []})) }
512 | EXTERNAL val_ident COLON core_type EQUAL primitive_declaration
513 { mksig(Psig_value($2, {pval_type = $4; pval_prim = $6})) }
514 | TYPE type_declarations
515 { mksig(Psig_type(List.rev $2)) }
516 | EXCEPTION UIDENT constructor_arguments
517 { mksig(Psig_exception($2, $3)) }
518 | MODULE UIDENT module_declaration
519 { mksig(Psig_module($2, $3)) }
520 | MODULE REC module_rec_declarations
521 { mksig(Psig_recmodule(List.rev $3)) }
523 { mksig(Psig_modtype($3, Pmodtype_abstract)) }
524 | MODULE TYPE ident EQUAL module_type
525 { mksig(Psig_modtype($3, Pmodtype_manifest $5)) }
527 { mksig(Psig_open $2) }
528 | INCLUDE module_type
529 { mksig(Psig_include $2) }
530 | CLASS class_descriptions
531 { mksig(Psig_class (List.rev $2)) }
532 | CLASS TYPE class_type_declarations
533 { mksig(Psig_class_type (List.rev $3)) }
539 | LPAREN UIDENT COLON module_type RPAREN module_declaration
540 { mkmty(Pmty_functor($2, $4, $6)) }
542 module_rec_declarations:
543 module_rec_declaration { [$1] }
544 | module_rec_declarations AND module_rec_declaration { $3 :: $1 }
546 module_rec_declaration:
547 UIDENT COLON module_type { ($1, $3) }
550 /* Class expressions */
553 class_declarations AND class_declaration { $3 :: $1 }
554 | class_declaration { [$1] }
557 virtual_flag class_type_parameters LIDENT class_fun_binding
558 { let params, variance = List.split (fst $2) in
559 {pci_virt = $1; pci_params = params, snd $2;
560 pci_name = $3; pci_expr = $4; pci_variance = variance;
561 pci_loc = symbol_rloc ()} }
566 | COLON class_type EQUAL class_expr
567 { mkclass(Pcl_constraint($4, $2)) }
568 | labeled_simple_pattern class_fun_binding
569 { let (l,o,p) = $1 in mkclass(Pcl_fun(l, o, p, $2)) }
571 class_type_parameters:
572 /*empty*/ { [], symbol_gloc () }
573 | LBRACKET type_parameter_list RBRACKET { List.rev $2, symbol_rloc () }
576 labeled_simple_pattern MINUSGREATER class_expr
577 { let (l,o,p) = $1 in mkclass(Pcl_fun(l, o, p, $3)) }
578 | labeled_simple_pattern class_fun_def
579 { let (l,o,p) = $1 in mkclass(Pcl_fun(l, o, p, $2)) }
586 | class_simple_expr simple_labeled_expr_list
587 { mkclass(Pcl_apply($1, List.rev $2)) }
588 | LET rec_flag let_bindings IN class_expr
589 { mkclass(Pcl_let ($2, List.rev $3, $5)) }
592 LBRACKET core_type_comma_list RBRACKET class_longident
593 { mkclass(Pcl_constr($4, List.rev $2)) }
595 { mkclass(Pcl_constr($1, [])) }
596 | OBJECT class_structure END
597 { mkclass(Pcl_structure($2)) }
598 | OBJECT class_structure error
599 { unclosed "object" 1 "end" 3 }
600 | LPAREN class_expr COLON class_type RPAREN
601 { mkclass(Pcl_constraint($2, $4)) }
602 | LPAREN class_expr COLON class_type error
603 { unclosed "(" 1 ")" 5 }
604 | LPAREN class_expr RPAREN
606 | LPAREN class_expr error
607 { unclosed "(" 1 ")" 3 }
610 class_self_pattern class_fields
614 LPAREN pattern RPAREN
616 | LPAREN pattern COLON core_type RPAREN
617 { mkpat(Ppat_constraint($2, $4)) }
624 | class_fields INHERIT class_expr parent_binder
625 { Pcf_inher ($3, $4) :: $1 }
626 | class_fields VAL virtual_value
627 { Pcf_valvirt $3 :: $1 }
628 | class_fields VAL value
630 | class_fields virtual_method
631 { Pcf_virt $2 :: $1 }
632 | class_fields concrete_method
633 { Pcf_meth $2 :: $1 }
634 | class_fields CONSTRAINT constrain
635 { Pcf_cstr $3 :: $1 }
636 | class_fields INITIALIZER seq_expr
637 { Pcf_init $3 :: $1 }
646 MUTABLE VIRTUAL label COLON core_type
647 { $3, Mutable, $5, symbol_rloc () }
648 | VIRTUAL mutable_flag label COLON core_type
649 { $3, $2, $5, symbol_rloc () }
652 mutable_flag label EQUAL seq_expr
653 { $2, $1, $4, symbol_rloc () }
654 | mutable_flag label type_constraint EQUAL seq_expr
655 { $2, $1, (let (t, t') = $3 in ghexp(Pexp_constraint($5, t, t'))),
659 METHOD PRIVATE VIRTUAL label COLON poly_type
660 { $4, Private, $6, symbol_rloc () }
661 | METHOD VIRTUAL private_flag label COLON poly_type
662 { $4, $3, $6, symbol_rloc () }
665 METHOD private_flag label strict_binding
666 { $3, $2, ghexp(Pexp_poly ($4, None)), symbol_rloc () }
667 | METHOD private_flag label COLON poly_type EQUAL seq_expr
668 { $3, $2, ghexp(Pexp_poly($7,Some $5)), symbol_rloc () }
676 | QUESTION LIDENT COLON simple_core_type_or_tuple MINUSGREATER class_type
677 { mkcty(Pcty_fun("?" ^ $2 ,
678 {ptyp_desc = Ptyp_constr(Lident "option", [$4]);
679 ptyp_loc = $4.ptyp_loc},
681 | OPTLABEL simple_core_type_or_tuple MINUSGREATER class_type
682 { mkcty(Pcty_fun("?" ^ $1 ,
683 {ptyp_desc = Ptyp_constr(Lident "option", [$2]);
684 ptyp_loc = $2.ptyp_loc},
686 | LIDENT COLON simple_core_type_or_tuple MINUSGREATER class_type
687 { mkcty(Pcty_fun($1, $3, $5)) }
688 | simple_core_type_or_tuple MINUSGREATER class_type
689 { mkcty(Pcty_fun("", $1, $3)) }
692 LBRACKET core_type_comma_list RBRACKET clty_longident
693 { mkcty(Pcty_constr ($4, List.rev $2)) }
695 { mkcty(Pcty_constr ($1, [])) }
696 | OBJECT class_sig_body END
697 { mkcty(Pcty_signature $2) }
698 | OBJECT class_sig_body error
699 { unclosed "object" 1 "end" 3 }
702 class_self_type class_sig_fields
706 LPAREN core_type RPAREN
713 | class_sig_fields INHERIT class_signature { Pctf_inher $3 :: $1 }
714 | class_sig_fields VAL value_type { Pctf_val $3 :: $1 }
715 | class_sig_fields virtual_method { Pctf_virt $2 :: $1 }
716 | class_sig_fields method_type { Pctf_meth $2 :: $1 }
717 | class_sig_fields CONSTRAINT constrain { Pctf_cstr $3 :: $1 }
720 VIRTUAL mutable_flag label COLON core_type
721 { $3, $2, Virtual, $5, symbol_rloc () }
722 | MUTABLE virtual_flag label COLON core_type
723 { $3, Mutable, $2, $5, symbol_rloc () }
724 | label COLON core_type
725 { $1, Immutable, Concrete, $3, symbol_rloc () }
728 METHOD private_flag label COLON poly_type
729 { $3, $2, $5, symbol_rloc () }
732 core_type EQUAL core_type { $1, $3, symbol_rloc () }
735 class_descriptions AND class_description { $3 :: $1 }
736 | class_description { [$1] }
739 virtual_flag class_type_parameters LIDENT COLON class_type
740 { let params, variance = List.split (fst $2) in
741 {pci_virt = $1; pci_params = params, snd $2;
742 pci_name = $3; pci_expr = $5; pci_variance = variance;
743 pci_loc = symbol_rloc ()} }
745 class_type_declarations:
746 class_type_declarations AND class_type_declaration { $3 :: $1 }
747 | class_type_declaration { [$1] }
749 class_type_declaration:
750 virtual_flag class_type_parameters LIDENT EQUAL class_signature
751 { let params, variance = List.split (fst $2) in
752 {pci_virt = $1; pci_params = params, snd $2;
753 pci_name = $3; pci_expr = $5; pci_variance = variance;
754 pci_loc = symbol_rloc ()} }
757 /* Core expressions */
760 | expr %prec below_SEMI { $1 }
761 | expr SEMI { reloc_exp $1 }
762 | expr SEMI seq_expr { mkexp(Pexp_sequence($1, $3)) }
764 labeled_simple_pattern:
765 QUESTION LPAREN label_let_pattern opt_default RPAREN
766 { ("?" ^ fst $3, $4, snd $3) }
768 { ("?" ^ fst $2, None, snd $2) }
769 | OPTLABEL LPAREN let_pattern opt_default RPAREN
770 { ("?" ^ $1, $4, $3) }
771 | OPTLABEL pattern_var
772 { ("?" ^ $1, None, $2) }
773 | TILDE LPAREN label_let_pattern RPAREN
774 { (fst $3, None, snd $3) }
776 { (fst $2, None, snd $2) }
777 | LABEL simple_pattern
783 LIDENT { mkpat(Ppat_var $1) }
784 | UNDERSCORE { mkpat Ppat_any }
788 | EQUAL seq_expr { Some $2 }
793 | label_var COLON core_type
794 { let (lab, pat) = $1 in (lab, mkpat(Ppat_constraint(pat, $3))) }
797 LIDENT { ($1, mkpat(Ppat_var $1)) }
802 | pattern COLON core_type
803 { mkpat(Ppat_constraint($1, $3)) }
806 simple_expr %prec below_SHARP
808 | simple_expr simple_labeled_expr_list
809 { mkexp(Pexp_apply($1, List.rev $2)) }
810 | LET rec_flag let_bindings IN seq_expr
811 { mkexp(Pexp_let($2, List.rev $3, $5)) }
812 | LET MODULE UIDENT module_binding IN seq_expr
813 { mkexp(Pexp_letmodule($3, $4, $6)) }
814 | FUNCTION opt_bar match_cases
815 { mkexp(Pexp_function("", None, List.rev $3)) }
816 | FUN labeled_simple_pattern fun_def
817 { let (l,o,p) = $2 in mkexp(Pexp_function(l, o, [p, $3])) }
818 | MATCH seq_expr WITH opt_bar match_cases
819 { mkexp(Pexp_match($2, List.rev $5)) }
820 | TRY seq_expr WITH opt_bar match_cases
821 { mkexp(Pexp_try($2, List.rev $5)) }
822 | TRY seq_expr WITH error
824 | expr_comma_list %prec below_COMMA
825 { mkexp(Pexp_tuple(List.rev $1)) }
826 | constr_longident simple_expr %prec below_SHARP
827 { mkexp(Pexp_construct($1, Some $2, false)) }
828 | name_tag simple_expr %prec below_SHARP
829 { mkexp(Pexp_variant($1, Some $2)) }
830 | IF seq_expr THEN expr ELSE expr
831 { mkexp(Pexp_ifthenelse($2, $4, Some $6)) }
832 | IF seq_expr THEN expr
833 { mkexp(Pexp_ifthenelse($2, $4, None)) }
834 | WHILE seq_expr DO seq_expr DONE
835 { mkexp(Pexp_while($2, $4)) }
836 | FOR val_ident EQUAL seq_expr direction_flag seq_expr DO seq_expr DONE
837 { mkexp(Pexp_for($2, $4, $6, $5, $8)) }
838 | expr COLONCOLON expr
839 { mkexp(Pexp_construct(Lident "::",
840 Some(ghexp(Pexp_tuple[$1;$3])),
842 | LPAREN COLONCOLON RPAREN LPAREN expr COMMA expr RPAREN
843 { mkexp(Pexp_construct(Lident "::",
844 Some(ghexp(Pexp_tuple[$5;$7])),
857 { mkinfix $1 "+" $3 }
859 { mkinfix $1 "-" $3 }
861 { mkinfix $1 "-." $3 }
863 { mkinfix $1 "*" $3 }
865 { mkinfix $1 "=" $3 }
867 { mkinfix $1 "<" $3 }
869 { mkinfix $1 ">" $3 }
871 { mkinfix $1 "or" $3 }
873 { mkinfix $1 "||" $3 }
874 | expr AMPERSAND expr
875 { mkinfix $1 "&" $3 }
876 | expr AMPERAMPER expr
877 { mkinfix $1 "&&" $3 }
878 | expr COLONEQUAL expr
879 { mkinfix $1 ":=" $3 }
880 | subtractive expr %prec prec_unary_minus
882 | simple_expr DOT label_longident LESSMINUS expr
883 { mkexp(Pexp_setfield($1, $3, $5)) }
884 | simple_expr DOT LPAREN seq_expr RPAREN LESSMINUS expr
885 { mkexp(Pexp_apply(ghexp(Pexp_ident(array_function "Array" "set")),
886 ["",$1; "",$4; "",$7])) }
887 | simple_expr DOT LBRACKET seq_expr RBRACKET LESSMINUS expr
888 { mkexp(Pexp_apply(ghexp(Pexp_ident(array_function "String" "set")),
889 ["",$1; "",$4; "",$7])) }
890 | simple_expr DOT LBRACE expr RBRACE LESSMINUS expr
891 { bigarray_set $1 $4 $7 }
892 | label LESSMINUS expr
893 { mkexp(Pexp_setinstvar($1, $3)) }
894 | ASSERT simple_expr %prec below_SHARP
896 | LAZY simple_expr %prec below_SHARP
897 { mkexp (Pexp_lazy ($2)) }
898 | OBJECT class_structure END
899 { mkexp (Pexp_object($2)) }
900 | OBJECT class_structure error
901 { unclosed "object" 1 "end" 3 }
905 { mkexp(Pexp_ident $1) }
907 { mkexp(Pexp_constant $1) }
908 | constr_longident %prec prec_constant_constructor
909 { mkexp(Pexp_construct($1, None, false)) }
910 | name_tag %prec prec_constant_constructor
911 { mkexp(Pexp_variant($1, None)) }
912 | LPAREN seq_expr RPAREN
914 | LPAREN seq_expr error
915 { unclosed "(" 1 ")" 3 }
919 { mkexp (Pexp_construct (Lident "()", None, false)) }
920 | BEGIN seq_expr error
921 { unclosed "begin" 1 "end" 3 }
922 | LPAREN seq_expr type_constraint RPAREN
923 { let (t, t') = $3 in mkexp(Pexp_constraint($2, t, t')) }
924 | simple_expr DOT label_longident
925 { mkexp(Pexp_field($1, $3)) }
926 | simple_expr DOT LPAREN seq_expr RPAREN
927 { mkexp(Pexp_apply(ghexp(Pexp_ident(array_function "Array" "get")),
929 | simple_expr DOT LPAREN seq_expr error
930 { unclosed "(" 3 ")" 5 }
931 | simple_expr DOT LBRACKET seq_expr RBRACKET
932 { mkexp(Pexp_apply(ghexp(Pexp_ident(array_function "String" "get")),
934 | simple_expr DOT LBRACKET seq_expr error
935 { unclosed "[" 3 "]" 5 }
936 | simple_expr DOT LBRACE expr RBRACE
937 { bigarray_get $1 $4 }
938 | simple_expr DOT LBRACE expr_comma_list error
939 { unclosed "{" 3 "}" 5 }
940 | LBRACE record_expr RBRACE
941 { let (exten, fields) = $2 in mkexp(Pexp_record(fields, exten)) }
942 | LBRACE record_expr error
943 { unclosed "{" 1 "}" 3 }
944 | LBRACKETBAR expr_semi_list opt_semi BARRBRACKET
945 { mkexp(Pexp_array(List.rev $2)) }
946 | LBRACKETBAR expr_semi_list opt_semi error
947 { unclosed "[|" 1 "|]" 4 }
948 | LBRACKETBAR BARRBRACKET
949 { mkexp(Pexp_array []) }
950 | LBRACKET expr_semi_list opt_semi RBRACKET
951 { reloc_exp (mktailexp (List.rev $2)) }
952 | LBRACKET expr_semi_list opt_semi error
953 { unclosed "[" 1 "]" 4 }
954 | PREFIXOP simple_expr
955 { mkexp(Pexp_apply(mkoperator $1 1, ["",$2])) }
956 | NEW class_longident
957 { mkexp(Pexp_new($2)) }
958 | LBRACELESS field_expr_list opt_semi GREATERRBRACE
959 { mkexp(Pexp_override(List.rev $2)) }
960 | LBRACELESS field_expr_list opt_semi error
961 { unclosed "{<" 1 ">}" 4 }
962 | LBRACELESS GREATERRBRACE
963 { mkexp(Pexp_override []) }
964 | simple_expr SHARP label
965 { mkexp(Pexp_send($1, $3)) }
967 simple_labeled_expr_list:
970 | simple_labeled_expr_list labeled_simple_expr
974 simple_expr %prec below_SHARP
980 LABEL simple_expr %prec below_SHARP
984 | QUESTION label_ident
985 { ("?" ^ fst $2, snd $2) }
986 | OPTLABEL simple_expr %prec below_SHARP
990 LIDENT { ($1, mkexp(Pexp_ident(Lident $1))) }
994 | let_bindings AND let_binding { $3 :: $1 }
997 val_ident fun_binding
998 { ({ppat_desc = Ppat_var $1; ppat_loc = rhs_loc 1}, $2) }
999 | pattern EQUAL seq_expr
1005 | type_constraint EQUAL seq_expr
1006 { let (t, t') = $1 in ghexp(Pexp_constraint($3, t, t')) }
1011 | labeled_simple_pattern fun_binding
1012 { let (l, o, p) = $1 in ghexp(Pexp_function(l, o, [p, $2])) }
1015 pattern match_action { [$1, $2] }
1016 | match_cases BAR pattern match_action { ($3, $4) :: $1 }
1020 | labeled_simple_pattern fun_def
1021 { let (l,o,p) = $1 in ghexp(Pexp_function(l, o, [p, $2])) }
1024 MINUSGREATER seq_expr { $2 }
1025 | WHEN seq_expr MINUSGREATER seq_expr { mkexp(Pexp_when($2, $4)) }
1028 expr_comma_list COMMA expr { $3 :: $1 }
1029 | expr COMMA expr { [$3; $1] }
1032 simple_expr WITH lbl_expr_list opt_semi { (Some $1, List.rev $3) }
1033 | lbl_expr_list opt_semi { (None, List.rev $1) }
1036 label_longident EQUAL expr
1038 | lbl_expr_list SEMI label_longident EQUAL expr
1044 | field_expr_list SEMI label EQUAL expr
1049 | expr_semi_list SEMI expr { $3 :: $1 }
1052 COLON core_type { (Some $2, None) }
1053 | COLON core_type COLONGREATER core_type { (Some $2, Some $4) }
1054 | COLONGREATER core_type { (None, Some $2) }
1055 | COLON error { syntax_error() }
1056 | COLONGREATER error { syntax_error() }
1064 | pattern AS val_ident
1065 { mkpat(Ppat_alias($1, $3)) }
1066 | pattern_comma_list %prec below_COMMA
1067 { mkpat(Ppat_tuple(List.rev $1)) }
1068 | constr_longident pattern %prec prec_constr_appl
1069 { mkpat(Ppat_construct($1, Some $2, false)) }
1070 | name_tag pattern %prec prec_constr_appl
1071 { mkpat(Ppat_variant($1, Some $2)) }
1072 | pattern COLONCOLON pattern
1073 { mkpat(Ppat_construct(Lident "::", Some(ghpat(Ppat_tuple[$1;$3])),
1075 | LPAREN COLONCOLON RPAREN LPAREN pattern COMMA pattern RPAREN
1076 { mkpat(Ppat_construct(Lident "::", Some(ghpat(Ppat_tuple[$5;$7])),
1078 | pattern BAR pattern
1079 { mkpat(Ppat_or($1, $3)) }
1082 val_ident %prec below_EQUAL
1083 { mkpat(Ppat_var $1) }
1087 { mkpat(Ppat_constant $1) }
1089 { mkrangepat $1 $3 }
1091 { mkpat(Ppat_construct($1, None, false)) }
1093 { mkpat(Ppat_variant($1, None)) }
1094 | SHARP type_longident
1095 { mkpat(Ppat_type $2) }
1096 | LBRACE lbl_pattern_list opt_semi RBRACE
1097 { mkpat(Ppat_record(List.rev $2)) }
1098 | LBRACE lbl_pattern_list opt_semi error
1099 { unclosed "{" 1 "}" 4 }
1100 | LBRACKET pattern_semi_list opt_semi RBRACKET
1101 { reloc_pat (mktailpat (List.rev $2)) }
1102 | LBRACKET pattern_semi_list opt_semi error
1103 { unclosed "[" 1 "]" 4 }
1104 | LBRACKETBAR pattern_semi_list opt_semi BARRBRACKET
1105 { mkpat(Ppat_array(List.rev $2)) }
1106 | LBRACKETBAR BARRBRACKET
1107 { mkpat(Ppat_array []) }
1108 | LBRACKETBAR pattern_semi_list opt_semi error
1109 { unclosed "[|" 1 "|]" 4 }
1110 | LPAREN pattern RPAREN
1112 | LPAREN pattern error
1113 { unclosed "(" 1 ")" 3 }
1114 | LPAREN pattern COLON core_type RPAREN
1115 { mkpat(Ppat_constraint($2, $4)) }
1116 | LPAREN pattern COLON core_type error
1117 { unclosed "(" 1 ")" 5 }
1121 pattern_comma_list COMMA pattern { $3 :: $1 }
1122 | pattern COMMA pattern { [$3; $1] }
1126 | pattern_semi_list SEMI pattern { $3 :: $1 }
1129 label_longident EQUAL pattern { [($1, $3)] }
1130 | lbl_pattern_list SEMI label_longident EQUAL pattern { ($3, $5) :: $1 }
1133 /* Primitive declarations */
1135 primitive_declaration:
1137 | STRING primitive_declaration { $1 :: $2 }
1140 /* Type declarations */
1143 type_declaration { [$1] }
1144 | type_declarations AND type_declaration { $3 :: $1 }
1148 type_parameters LIDENT type_kind constraints
1149 { let (params, variance) = List.split $1 in
1150 let (kind, manifest) = $3 in
1151 ($2, {ptype_params = params;
1152 ptype_cstrs = List.rev $4;
1154 ptype_manifest = manifest;
1155 ptype_variance = variance;
1156 ptype_loc = symbol_rloc()}) }
1159 constraints CONSTRAINT constrain { $3 :: $1 }
1160 | /* empty */ { [] }
1164 { (Ptype_abstract, None) }
1166 { (Ptype_abstract, Some $2) }
1167 | EQUAL constructor_declarations
1168 { (Ptype_variant(List.rev $2, Public), None) }
1169 | EQUAL PRIVATE constructor_declarations
1170 { (Ptype_variant(List.rev $3, Private), None) }
1171 | EQUAL private_flag BAR constructor_declarations
1172 { (Ptype_variant(List.rev $4, $2), None) }
1173 | EQUAL private_flag LBRACE label_declarations opt_semi RBRACE
1174 { (Ptype_record(List.rev $4, $2), None) }
1175 | EQUAL core_type EQUAL private_flag opt_bar constructor_declarations
1176 { (Ptype_variant(List.rev $6, $4), Some $2) }
1177 | EQUAL core_type EQUAL private_flag LBRACE label_declarations opt_semi RBRACE
1178 { (Ptype_record(List.rev $6, $4), Some $2) }
1179 | EQUAL PRIVATE core_type
1180 { (Ptype_private, Some $3) }
1184 | type_parameter { [$1] }
1185 | LPAREN type_parameter_list RPAREN { List.rev $2 }
1188 type_variance QUOTE ident { $3, $1 }
1191 /* empty */ { false, false }
1192 | PLUS { true, false }
1193 | MINUS { false, true }
1195 type_parameter_list:
1196 type_parameter { [$1] }
1197 | type_parameter_list COMMA type_parameter { $3 :: $1 }
1199 constructor_declarations:
1200 constructor_declaration { [$1] }
1201 | constructor_declarations BAR constructor_declaration { $3 :: $1 }
1203 constructor_declaration:
1204 constr_ident constructor_arguments { ($1, $2, symbol_rloc()) }
1206 constructor_arguments:
1208 | OF core_type_list { List.rev $2 }
1211 label_declaration { [$1] }
1212 | label_declarations SEMI label_declaration { $3 :: $1 }
1215 mutable_flag label COLON poly_type { ($2, $1, $4, symbol_rloc()) }
1218 /* "with" constraints (additional type equations over signature components) */
1221 with_constraint { [$1] }
1222 | with_constraints AND with_constraint { $3 :: $1 }
1225 TYPE type_parameters label_longident with_type_binder core_type constraints
1226 { let params, variance = List.split $2 in
1227 ($3, Pwith_type {ptype_params = params;
1228 ptype_cstrs = List.rev $6;
1230 ptype_manifest = Some $5;
1231 ptype_variance = variance;
1232 ptype_loc = symbol_rloc()}) }
1233 /* used label_longident instead of type_longident to disallow
1234 functor applications in type path */
1235 | MODULE mod_longident EQUAL mod_ext_longident
1236 { ($2, Pwith_module $4) }
1239 EQUAL { Ptype_abstract }
1240 | EQUAL PRIVATE { Ptype_private }
1243 /* Polymorphic types */
1246 QUOTE ident { [$2] }
1247 | typevar_list QUOTE ident { $3 :: $1 }
1251 { mktyp(Ptyp_poly([], $1)) }
1252 | typevar_list DOT core_type
1253 { mktyp(Ptyp_poly(List.rev $1, $3)) }
1261 | core_type2 AS QUOTE ident
1262 { mktyp(Ptyp_alias($1, $4)) }
1265 simple_core_type_or_tuple
1267 | QUESTION LIDENT COLON core_type2 MINUSGREATER core_type2
1268 { mktyp(Ptyp_arrow("?" ^ $2 ,
1269 {ptyp_desc = Ptyp_constr(Lident "option", [$4]);
1270 ptyp_loc = $4.ptyp_loc}, $6)) }
1271 | OPTLABEL core_type2 MINUSGREATER core_type2
1272 { mktyp(Ptyp_arrow("?" ^ $1 ,
1273 {ptyp_desc = Ptyp_constr(Lident "option", [$2]);
1274 ptyp_loc = $2.ptyp_loc}, $4)) }
1275 | LIDENT COLON core_type2 MINUSGREATER core_type2
1276 { mktyp(Ptyp_arrow($1, $3, $5)) }
1277 | core_type2 MINUSGREATER core_type2
1278 { mktyp(Ptyp_arrow("", $1, $3)) }
1282 simple_core_type2 %prec below_SHARP
1284 | LPAREN core_type_comma_list RPAREN %prec below_SHARP
1285 { match $2 with [sty] -> sty | _ -> raise Parse_error }
1289 { mktyp(Ptyp_var $2) }
1293 { mktyp(Ptyp_constr($1, [])) }
1294 | simple_core_type2 type_longident
1295 { mktyp(Ptyp_constr($2, [$1])) }
1296 | LPAREN core_type_comma_list RPAREN type_longident
1297 { mktyp(Ptyp_constr($4, List.rev $2)) }
1298 | LESS meth_list GREATER
1299 { mktyp(Ptyp_object $2) }
1301 { mktyp(Ptyp_object []) }
1302 | SHARP class_longident opt_present
1303 { mktyp(Ptyp_class($2, [], $3)) }
1304 | simple_core_type2 SHARP class_longident opt_present
1305 { mktyp(Ptyp_class($3, [$1], $4)) }
1306 | LPAREN core_type_comma_list RPAREN SHARP class_longident opt_present
1307 { mktyp(Ptyp_class($5, List.rev $2, $6)) }
1308 | LBRACKET tag_field RBRACKET
1309 { mktyp(Ptyp_variant([$2], true, None)) }
1310 /* PR#3835: this is not LR(1), would need lookahead=2
1311 | LBRACKET simple_core_type2 RBRACKET
1312 { mktyp(Ptyp_variant([$2], true, None)) }
1314 | LBRACKET BAR row_field_list RBRACKET
1315 { mktyp(Ptyp_variant(List.rev $3, true, None)) }
1316 | LBRACKET row_field BAR row_field_list RBRACKET
1317 { mktyp(Ptyp_variant($2 :: List.rev $4, true, None)) }
1318 | LBRACKETGREATER opt_bar row_field_list RBRACKET
1319 { mktyp(Ptyp_variant(List.rev $3, false, None)) }
1320 | LBRACKETGREATER RBRACKET
1321 { mktyp(Ptyp_variant([], false, None)) }
1322 | LBRACKETLESS opt_bar row_field_list RBRACKET
1323 { mktyp(Ptyp_variant(List.rev $3, true, Some [])) }
1324 | LBRACKETLESS opt_bar row_field_list GREATER name_tag_list RBRACKET
1325 { mktyp(Ptyp_variant(List.rev $3, true, Some (List.rev $5))) }
1329 | row_field_list BAR row_field { $3 :: $1 }
1333 | simple_core_type2 { Rinherit $1 }
1336 name_tag OF opt_ampersand amper_type_list
1337 { Rtag ($1, $3, List.rev $4) }
1339 { Rtag ($1, true, []) }
1343 | /* empty */ { false }
1347 | amper_type_list AMPERSAND core_type { $3 :: $1 }
1350 LBRACKETGREATER name_tag_list RBRACKET { List.rev $2 }
1351 | /* empty */ { [] }
1355 | name_tag_list name_tag { $2 :: $1 }
1357 simple_core_type_or_tuple:
1358 simple_core_type { $1 }
1359 | simple_core_type STAR core_type_list
1360 { mktyp(Ptyp_tuple($1 :: List.rev $3)) }
1362 core_type_comma_list:
1364 | core_type_comma_list COMMA core_type { $3 :: $1 }
1367 simple_core_type { [$1] }
1368 | core_type_list STAR simple_core_type { $3 :: $1 }
1371 field SEMI meth_list { $1 :: $3 }
1372 | field opt_semi { [$1] }
1373 | DOTDOT { [mkfield Pfield_var] }
1376 label COLON poly_type { mkfield(Pfield($1, $3)) }
1385 INT { Const_int $1 }
1386 | CHAR { Const_char $1 }
1387 | STRING { Const_string $1 }
1388 | FLOAT { Const_float $1 }
1389 | INT32 { Const_int32 $1 }
1390 | INT64 { Const_int64 $1 }
1391 | NATIVEINT { Const_nativeint $1 }
1395 | MINUS INT { Const_int(- $2) }
1396 | MINUS FLOAT { Const_float("-" ^ $2) }
1397 | MINUS INT32 { Const_int32(Int32.neg $2) }
1398 | MINUS INT64 { Const_int64(Int64.neg $2) }
1399 | MINUS NATIVEINT { Const_nativeint(Nativeint.neg $2) }
1401 /* Identifiers and long identifiers */
1409 | LPAREN operator RPAREN { $2 }
1428 | AMPERAMPER { "&&" }
1429 | COLONEQUAL { ":=" }
1433 /* | LBRACKET RBRACKET { "[]" } */
1434 | LPAREN RPAREN { "()" }
1435 | COLONCOLON { "::" }
1436 /* | LPAREN COLONCOLON RPAREN { "::" } */
1442 val_ident { Lident $1 }
1443 | mod_longident DOT val_ident { Ldot($1, $3) }
1446 mod_longident %prec below_DOT { $1 }
1447 | LBRACKET RBRACKET { Lident "[]" }
1448 | LPAREN RPAREN { Lident "()" }
1449 | FALSE { Lident "false" }
1450 | TRUE { Lident "true" }
1453 LIDENT { Lident $1 }
1454 | mod_longident DOT LIDENT { Ldot($1, $3) }
1457 LIDENT { Lident $1 }
1458 | mod_ext_longident DOT LIDENT { Ldot($1, $3) }
1461 UIDENT { Lident $1 }
1462 | mod_longident DOT UIDENT { Ldot($1, $3) }
1465 UIDENT { Lident $1 }
1466 | mod_ext_longident DOT UIDENT { Ldot($1, $3) }
1467 | mod_ext_longident LPAREN mod_ext_longident RPAREN { Lapply($1, $3) }
1471 | mod_ext_longident DOT ident { Ldot($1, $3) }
1474 LIDENT { Lident $1 }
1475 | mod_ext_longident DOT LIDENT { Ldot($1, $3) }
1478 LIDENT { Lident $1 }
1479 | mod_longident DOT LIDENT { Ldot($1, $3) }
1482 /* Toplevel directives */
1485 SHARP ident { Ptop_dir($2, Pdir_none) }
1486 | SHARP ident STRING { Ptop_dir($2, Pdir_string $3) }
1487 | SHARP ident INT { Ptop_dir($2, Pdir_int $3) }
1488 | SHARP ident val_longident { Ptop_dir($2, Pdir_ident $3) }
1489 | SHARP ident FALSE { Ptop_dir($2, Pdir_bool false) }
1490 | SHARP ident TRUE { Ptop_dir($2, Pdir_bool true) }
1496 BACKQUOTE ident { $2 }
1499 /* empty */ { Nonrecursive }
1507 /* empty */ { Public }
1508 | PRIVATE { Private }
1511 /* empty */ { Immutable }
1512 | MUTABLE { Mutable }
1515 /* empty */ { Concrete }
1516 | VIRTUAL { Virtual }
1523 | /* empty */ { () }