1995-08-09 08:06:35 -07:00
|
|
|
/***********************************************************************/
|
|
|
|
/* */
|
2011-07-27 07:17:02 -07:00
|
|
|
/* OCaml */
|
1995-08-09 08:06:35 -07:00
|
|
|
/* */
|
|
|
|
/* Xavier Leroy, projet Cristal, INRIA Rocquencourt */
|
|
|
|
/* */
|
1996-04-30 07:53:58 -07:00
|
|
|
/* Copyright 1996 Institut National de Recherche en Informatique et */
|
1999-11-17 10:59:06 -08:00
|
|
|
/* en Automatique. All rights reserved. This file is distributed */
|
|
|
|
/* under the terms of the Q Public License version 1.0. */
|
1995-08-09 08:06:35 -07:00
|
|
|
/* */
|
|
|
|
/***********************************************************************/
|
|
|
|
|
1995-05-04 03:15:53 -07:00
|
|
|
/* The parser definition */
|
|
|
|
|
|
|
|
%{
|
|
|
|
open Location
|
|
|
|
open Asttypes
|
|
|
|
open Longident
|
|
|
|
open Parsetree
|
|
|
|
|
|
|
|
let mktyp d =
|
1999-09-08 10:42:36 -07:00
|
|
|
{ ptyp_desc = d; ptyp_loc = symbol_rloc() }
|
1995-05-04 03:15:53 -07:00
|
|
|
let mkpat d =
|
1999-09-08 10:42:36 -07:00
|
|
|
{ ppat_desc = d; ppat_loc = symbol_rloc() }
|
1995-05-04 03:15:53 -07:00
|
|
|
let mkexp d =
|
1999-09-08 10:42:36 -07:00
|
|
|
{ pexp_desc = d; pexp_loc = symbol_rloc() }
|
1995-05-04 03:15:53 -07:00
|
|
|
let mkmty d =
|
1999-09-08 10:42:36 -07:00
|
|
|
{ pmty_desc = d; pmty_loc = symbol_rloc() }
|
1995-10-05 08:18:49 -07:00
|
|
|
let mksig d =
|
1999-09-08 10:42:36 -07:00
|
|
|
{ psig_desc = d; psig_loc = symbol_rloc() }
|
1995-05-04 03:15:53 -07:00
|
|
|
let mkmod d =
|
1999-09-08 10:42:36 -07:00
|
|
|
{ pmod_desc = d; pmod_loc = symbol_rloc() }
|
1995-10-05 08:18:49 -07:00
|
|
|
let mkstr d =
|
1999-09-08 10:42:36 -07:00
|
|
|
{ pstr_desc = d; pstr_loc = symbol_rloc() }
|
1996-04-22 04:15:41 -07:00
|
|
|
let mkfield d =
|
1999-09-08 10:42:36 -07:00
|
|
|
{ pfield_desc = d; pfield_loc = symbol_rloc() }
|
1998-06-24 12:22:26 -07:00
|
|
|
let mkclass d =
|
1999-09-08 10:42:36 -07:00
|
|
|
{ pcl_desc = d; pcl_loc = symbol_rloc() }
|
1998-06-24 12:22:26 -07:00
|
|
|
let mkcty d =
|
1999-09-08 10:42:36 -07:00
|
|
|
{ pcty_desc = d; pcty_loc = symbol_rloc() }
|
2012-05-30 07:52:37 -07:00
|
|
|
let mkctf d =
|
|
|
|
{ pctf_desc = d; pctf_loc = symbol_rloc () }
|
|
|
|
let mkcf d =
|
|
|
|
{ pcf_desc = d; pcf_loc = symbol_rloc () }
|
|
|
|
let mkrhs rhs pos = mkloc rhs (rhs_loc pos)
|
|
|
|
let mkoption d =
|
2012-12-06 07:41:43 -08:00
|
|
|
let loc = {d.ptyp_loc with loc_ghost = true} in
|
|
|
|
{ ptyp_desc = Ptyp_constr(mkloc (Ldot (Lident "*predef*", "option")) loc,[d]);
|
|
|
|
ptyp_loc = loc}
|
1995-05-04 03:15:53 -07:00
|
|
|
|
2003-04-06 05:45:03 -07:00
|
|
|
let reloc_pat x = { x with ppat_loc = symbol_rloc () };;
|
|
|
|
let reloc_exp x = { x with pexp_loc = symbol_rloc () };;
|
|
|
|
|
1995-05-04 03:15:53 -07:00
|
|
|
let mkoperator name pos =
|
2012-05-30 07:52:37 -07:00
|
|
|
let loc = rhs_loc pos in
|
|
|
|
{ pexp_desc = Pexp_ident(mkloc (Lident name) loc); pexp_loc = loc }
|
1995-05-04 03:15:53 -07:00
|
|
|
|
2011-12-14 00:59:07 -08:00
|
|
|
let mkpatvar name pos =
|
2012-05-30 07:52:37 -07:00
|
|
|
{ ppat_desc = Ppat_var (mkrhs name pos); ppat_loc = rhs_loc pos }
|
2011-12-14 00:59:07 -08:00
|
|
|
|
2003-04-02 08:03:33 -08:00
|
|
|
(*
|
|
|
|
Ghost expressions and patterns:
|
2012-04-13 05:44:29 -07:00
|
|
|
expressions and patterns that do not appear explicitly in the
|
2003-04-02 08:03:33 -08:00
|
|
|
source file they have the loc_ghost flag set to true.
|
|
|
|
Then the profiler will not try to instrument them and the
|
2012-09-10 03:32:49 -07:00
|
|
|
-annot option will not try to display their type.
|
1999-09-08 10:42:36 -07:00
|
|
|
|
2003-04-02 08:03:33 -08:00
|
|
|
Every grammar rule that generates an element with a location must
|
|
|
|
make at most one non-ghost element, the topmost one.
|
|
|
|
|
|
|
|
How to tell whether your location must be ghost:
|
|
|
|
A location corresponds to a range of characters in the source file.
|
|
|
|
If the location contains a piece of code that is syntactically
|
|
|
|
valid (according to the documentation), and corresponds to the
|
|
|
|
AST node, then the location must be real; in all other cases,
|
|
|
|
it must be ghost.
|
1998-05-23 07:10:59 -07:00
|
|
|
*)
|
1999-09-08 10:42:36 -07:00
|
|
|
let ghexp d = { pexp_desc = d; pexp_loc = symbol_gloc () };;
|
|
|
|
let ghpat d = { ppat_desc = d; ppat_loc = symbol_gloc () };;
|
|
|
|
let ghtyp d = { ptyp_desc = d; ptyp_loc = symbol_gloc () };;
|
2012-12-06 07:41:43 -08:00
|
|
|
let ghloc d = { txt = d; loc = symbol_gloc () };;
|
1998-05-23 07:10:59 -07:00
|
|
|
|
1997-05-13 11:28:25 -07:00
|
|
|
let mkassert e =
|
|
|
|
match e with
|
2012-05-30 07:52:37 -07:00
|
|
|
| {pexp_desc = Pexp_construct ({ txt = Lident "false" }, None , false);
|
|
|
|
pexp_loc = _ } ->
|
|
|
|
mkexp (Pexp_assertfalse)
|
2000-12-04 07:37:05 -08:00
|
|
|
| _ -> mkexp (Pexp_assert (e))
|
1997-05-13 11:28:25 -07:00
|
|
|
;;
|
|
|
|
|
1995-05-04 03:15:53 -07:00
|
|
|
let mkinfix arg1 name arg2 =
|
1999-11-30 08:07:38 -08:00
|
|
|
mkexp(Pexp_apply(mkoperator name 2, ["", arg1; "", arg2]))
|
1995-05-04 03:15:53 -07:00
|
|
|
|
1999-10-19 09:43:49 -07:00
|
|
|
let neg_float_string f =
|
|
|
|
if String.length f > 0 && f.[0] = '-'
|
|
|
|
then String.sub f 1 (String.length f - 1)
|
|
|
|
else "-" ^ f
|
|
|
|
|
1995-05-04 03:15:53 -07:00
|
|
|
let mkuminus name arg =
|
2003-03-12 08:33:38 -08:00
|
|
|
match name, arg.pexp_desc with
|
|
|
|
| "-", Pexp_constant(Const_int n) ->
|
1995-05-04 03:15:53 -07:00
|
|
|
mkexp(Pexp_constant(Const_int(-n)))
|
2003-04-25 05:27:31 -07:00
|
|
|
| "-", Pexp_constant(Const_int32 n) ->
|
|
|
|
mkexp(Pexp_constant(Const_int32(Int32.neg n)))
|
|
|
|
| "-", Pexp_constant(Const_int64 n) ->
|
|
|
|
mkexp(Pexp_constant(Const_int64(Int64.neg n)))
|
|
|
|
| "-", Pexp_constant(Const_nativeint n) ->
|
|
|
|
mkexp(Pexp_constant(Const_nativeint(Nativeint.neg n)))
|
2011-11-29 07:49:25 -08:00
|
|
|
| ("-" | "-."), Pexp_constant(Const_float f) ->
|
1999-10-19 09:43:49 -07:00
|
|
|
mkexp(Pexp_constant(Const_float(neg_float_string f)))
|
1995-05-04 03:15:53 -07:00
|
|
|
| _ ->
|
1999-11-30 08:07:38 -08:00
|
|
|
mkexp(Pexp_apply(mkoperator ("~" ^ name) 1, ["", arg]))
|
1995-05-04 03:15:53 -07:00
|
|
|
|
2009-12-07 08:40:39 -08:00
|
|
|
let mkuplus name arg =
|
2010-06-04 09:44:08 -07:00
|
|
|
let desc = arg.pexp_desc in
|
|
|
|
match name, desc with
|
|
|
|
| "+", Pexp_constant(Const_int _)
|
|
|
|
| "+", Pexp_constant(Const_int32 _)
|
|
|
|
| "+", Pexp_constant(Const_int64 _)
|
|
|
|
| "+", Pexp_constant(Const_nativeint _)
|
|
|
|
| ("+" | "+."), Pexp_constant(Const_float _) -> mkexp desc
|
2009-12-07 08:40:39 -08:00
|
|
|
| _ ->
|
|
|
|
mkexp(Pexp_apply(mkoperator ("~" ^ name) 1, ["", arg]))
|
|
|
|
|
2012-12-08 12:56:07 -08:00
|
|
|
let mkexp_cons consloc args loc =
|
|
|
|
{pexp_desc = Pexp_construct(mkloc (Lident "::") consloc, Some args, false);
|
|
|
|
pexp_loc = loc}
|
2012-05-30 07:52:37 -07:00
|
|
|
|
2012-12-08 12:56:07 -08:00
|
|
|
let mkpat_cons consloc args loc =
|
|
|
|
{ppat_desc = Ppat_construct(mkloc (Lident "::") consloc, Some args, false);
|
|
|
|
ppat_loc = loc}
|
2012-05-30 07:52:37 -07:00
|
|
|
|
2012-12-08 12:56:07 -08:00
|
|
|
let rec mktailexp nilloc = function
|
1995-05-04 03:15:53 -07:00
|
|
|
[] ->
|
2012-12-08 12:56:07 -08:00
|
|
|
let loc = { nilloc with loc_ghost = true } in
|
|
|
|
let nil = { txt = Lident "[]"; loc = loc } in
|
|
|
|
{ pexp_desc = Pexp_construct (nil, None, false); pexp_loc = loc }
|
1995-05-04 03:15:53 -07:00
|
|
|
| e1 :: el ->
|
2012-12-08 12:56:07 -08:00
|
|
|
let exp_el = mktailexp nilloc el in
|
1998-05-23 07:10:59 -07:00
|
|
|
let l = {loc_start = e1.pexp_loc.loc_start;
|
1999-09-08 10:42:36 -07:00
|
|
|
loc_end = exp_el.pexp_loc.loc_end;
|
2003-04-01 17:17:19 -08:00
|
|
|
loc_ghost = true}
|
1998-05-23 07:10:59 -07:00
|
|
|
in
|
2003-04-06 05:45:03 -07:00
|
|
|
let arg = {pexp_desc = Pexp_tuple [e1; exp_el]; pexp_loc = l} in
|
2012-12-08 12:56:07 -08:00
|
|
|
mkexp_cons {l with loc_ghost = true} arg l
|
1998-05-23 07:10:59 -07:00
|
|
|
|
2012-12-08 12:56:07 -08:00
|
|
|
let rec mktailpat nilloc = function
|
1995-05-04 03:15:53 -07:00
|
|
|
[] ->
|
2012-12-08 12:56:07 -08:00
|
|
|
let loc = { nilloc with loc_ghost = true } in
|
|
|
|
let nil = { txt = Lident "[]"; loc = loc } in
|
|
|
|
{ ppat_desc = Ppat_construct (nil, None, false); ppat_loc = loc }
|
1995-05-04 03:15:53 -07:00
|
|
|
| p1 :: pl ->
|
2012-12-08 12:56:07 -08:00
|
|
|
let pat_pl = mktailpat nilloc pl in
|
1998-05-23 07:10:59 -07:00
|
|
|
let l = {loc_start = p1.ppat_loc.loc_start;
|
1999-09-08 10:42:36 -07:00
|
|
|
loc_end = pat_pl.ppat_loc.loc_end;
|
2003-04-06 05:45:03 -07:00
|
|
|
loc_ghost = true}
|
1998-05-23 07:10:59 -07:00
|
|
|
in
|
2003-04-06 05:45:03 -07:00
|
|
|
let arg = {ppat_desc = Ppat_tuple [p1; pat_pl]; ppat_loc = l} in
|
2012-12-08 12:56:07 -08:00
|
|
|
mkpat_cons {l with loc_ghost = true} arg l
|
1995-05-04 03:15:53 -07:00
|
|
|
|
2012-12-13 04:48:51 -08:00
|
|
|
let mkstrexp e =
|
|
|
|
{ pstr_desc = Pstr_eval e; pstr_loc = e.pexp_loc }
|
1995-10-05 08:18:49 -07:00
|
|
|
|
1995-05-04 03:15:53 -07:00
|
|
|
let array_function str name =
|
2012-12-06 07:41:43 -08:00
|
|
|
ghloc (Ldot(Lident str, (if !Clflags.fast then "unsafe_" ^ name else name)))
|
1995-05-04 03:15:53 -07:00
|
|
|
|
2003-02-24 07:13:01 -08:00
|
|
|
let rec deep_mkrangepat c1 c2 =
|
1999-09-08 10:42:36 -07:00
|
|
|
if c1 = c2 then ghpat(Ppat_constant(Const_char c1)) else
|
|
|
|
ghpat(Ppat_or(ghpat(Ppat_constant(Const_char c1)),
|
2003-02-24 07:13:01 -08:00
|
|
|
deep_mkrangepat (Char.chr(Char.code c1 + 1)) c2))
|
|
|
|
|
|
|
|
let rec mkrangepat c1 c2 =
|
|
|
|
if c1 > c2 then mkrangepat c2 c1 else
|
|
|
|
if c1 = c2 then mkpat(Ppat_constant(Const_char c1)) else
|
2003-04-06 05:45:03 -07:00
|
|
|
reloc_pat (deep_mkrangepat c1 c2)
|
1996-04-22 04:15:41 -07:00
|
|
|
|
1997-11-12 04:32:53 -08:00
|
|
|
let syntax_error () =
|
|
|
|
raise Syntaxerr.Escape_error
|
|
|
|
|
1997-08-22 01:55:41 -07:00
|
|
|
let unclosed opening_name opening_num closing_name closing_num =
|
|
|
|
raise(Syntaxerr.Error(Syntaxerr.Unclosed(rhs_loc opening_num, opening_name,
|
|
|
|
rhs_loc closing_num, closing_name)))
|
|
|
|
|
2012-10-16 07:04:33 -07:00
|
|
|
let expecting pos nonterm =
|
|
|
|
raise Syntaxerr.(Error(Expecting(rhs_loc pos, nonterm)))
|
|
|
|
|
2000-02-24 09:42:32 -08:00
|
|
|
let bigarray_function str name =
|
2012-12-06 07:41:43 -08:00
|
|
|
ghloc (Ldot(Ldot(Lident "Bigarray", str), name))
|
2000-02-24 09:42:32 -08:00
|
|
|
|
|
|
|
let bigarray_untuplify = function
|
2011-10-28 14:21:55 -07:00
|
|
|
{ pexp_desc = Pexp_tuple explist; pexp_loc = _ } -> explist
|
2000-02-24 09:42:32 -08:00
|
|
|
| exp -> [exp]
|
|
|
|
|
|
|
|
let bigarray_get arr arg =
|
2008-07-14 02:09:53 -07:00
|
|
|
let get = if !Clflags.fast then "unsafe_get" else "get" in
|
2000-02-24 09:42:32 -08:00
|
|
|
match bigarray_untuplify arg with
|
|
|
|
[c1] ->
|
2008-07-14 02:09:53 -07:00
|
|
|
mkexp(Pexp_apply(ghexp(Pexp_ident(bigarray_function "Array1" get)),
|
2000-02-24 09:42:32 -08:00
|
|
|
["", arr; "", c1]))
|
|
|
|
| [c1;c2] ->
|
2008-07-14 02:09:53 -07:00
|
|
|
mkexp(Pexp_apply(ghexp(Pexp_ident(bigarray_function "Array2" get)),
|
2000-02-24 09:42:32 -08:00
|
|
|
["", arr; "", c1; "", c2]))
|
|
|
|
| [c1;c2;c3] ->
|
2008-07-14 02:09:53 -07:00
|
|
|
mkexp(Pexp_apply(ghexp(Pexp_ident(bigarray_function "Array3" get)),
|
2000-02-24 09:42:32 -08:00
|
|
|
["", arr; "", c1; "", c2; "", c3]))
|
|
|
|
| coords ->
|
|
|
|
mkexp(Pexp_apply(ghexp(Pexp_ident(bigarray_function "Genarray" "get")),
|
|
|
|
["", arr; "", ghexp(Pexp_array coords)]))
|
|
|
|
|
|
|
|
let bigarray_set arr arg newval =
|
2009-12-01 01:57:02 -08:00
|
|
|
let set = if !Clflags.fast then "unsafe_set" else "set" in
|
2000-02-24 09:42:32 -08:00
|
|
|
match bigarray_untuplify arg with
|
|
|
|
[c1] ->
|
2008-07-14 02:09:53 -07:00
|
|
|
mkexp(Pexp_apply(ghexp(Pexp_ident(bigarray_function "Array1" set)),
|
2000-02-24 09:42:32 -08:00
|
|
|
["", arr; "", c1; "", newval]))
|
|
|
|
| [c1;c2] ->
|
2008-07-14 02:09:53 -07:00
|
|
|
mkexp(Pexp_apply(ghexp(Pexp_ident(bigarray_function "Array2" set)),
|
2000-02-24 09:42:32 -08:00
|
|
|
["", arr; "", c1; "", c2; "", newval]))
|
|
|
|
| [c1;c2;c3] ->
|
2008-07-14 02:09:53 -07:00
|
|
|
mkexp(Pexp_apply(ghexp(Pexp_ident(bigarray_function "Array3" set)),
|
2000-02-24 09:42:32 -08:00
|
|
|
["", arr; "", c1; "", c2; "", c3; "", newval]))
|
|
|
|
| coords ->
|
|
|
|
mkexp(Pexp_apply(ghexp(Pexp_ident(bigarray_function "Genarray" "set")),
|
2006-04-16 16:28:22 -07:00
|
|
|
["", arr;
|
2000-02-24 09:42:32 -08:00
|
|
|
"", ghexp(Pexp_array coords);
|
|
|
|
"", newval]))
|
2009-07-15 07:06:37 -07:00
|
|
|
|
|
|
|
let lapply p1 p2 =
|
|
|
|
if !Clflags.applicative_functors
|
|
|
|
then Lapply(p1, p2)
|
|
|
|
else raise (Syntaxerr.Error(Syntaxerr.Applicative_path (symbol_rloc())))
|
|
|
|
|
2012-05-30 07:52:37 -07:00
|
|
|
let exp_of_label lbl pos =
|
|
|
|
mkexp (Pexp_ident(mkrhs (Lident(Longident.last lbl)) pos))
|
2009-08-27 01:19:08 -07:00
|
|
|
|
2012-05-30 07:52:37 -07:00
|
|
|
let pat_of_label lbl pos =
|
|
|
|
mkpat (Ppat_var (mkrhs (Longident.last lbl) pos))
|
2009-08-27 01:19:08 -07:00
|
|
|
|
2012-03-22 19:20:24 -07:00
|
|
|
let check_variable vl loc v =
|
|
|
|
if List.mem v vl then
|
|
|
|
raise Syntaxerr.(Error(Variable_in_scope(loc,v)))
|
2010-11-24 05:37:24 -08:00
|
|
|
|
2011-11-29 07:49:25 -08:00
|
|
|
let varify_constructors var_names t =
|
|
|
|
let rec loop t =
|
|
|
|
let desc =
|
2010-10-17 21:54:24 -07:00
|
|
|
match t.ptyp_desc with
|
|
|
|
| Ptyp_any -> Ptyp_any
|
2012-03-22 19:20:24 -07:00
|
|
|
| Ptyp_var x ->
|
|
|
|
check_variable var_names t.ptyp_loc x;
|
|
|
|
Ptyp_var x
|
2010-10-17 21:54:24 -07:00
|
|
|
| Ptyp_arrow (label,core_type,core_type') ->
|
2011-11-29 07:49:25 -08:00
|
|
|
Ptyp_arrow(label, loop core_type, loop core_type')
|
2010-10-17 21:54:24 -07:00
|
|
|
| Ptyp_tuple lst -> Ptyp_tuple (List.map loop lst)
|
2012-05-30 07:52:37 -07:00
|
|
|
| Ptyp_constr( { txt = Lident s }, []) when List.mem s var_names ->
|
2012-03-22 19:20:24 -07:00
|
|
|
Ptyp_var s
|
2010-10-17 21:54:24 -07:00
|
|
|
| Ptyp_constr(longident, lst) ->
|
2011-11-29 07:49:25 -08:00
|
|
|
Ptyp_constr(longident, List.map loop lst)
|
2010-10-17 21:54:24 -07:00
|
|
|
| Ptyp_object lst ->
|
2011-11-29 07:49:25 -08:00
|
|
|
Ptyp_object (List.map loop_core_field lst)
|
2010-10-17 21:54:24 -07:00
|
|
|
| Ptyp_class (longident, lst, lbl_list) ->
|
2011-11-29 07:49:25 -08:00
|
|
|
Ptyp_class (longident, List.map loop lst, lbl_list)
|
2010-10-17 21:54:24 -07:00
|
|
|
| Ptyp_alias(core_type, string) ->
|
2012-03-22 19:20:24 -07:00
|
|
|
check_variable var_names t.ptyp_loc string;
|
2011-11-29 07:49:25 -08:00
|
|
|
Ptyp_alias(loop core_type, string)
|
|
|
|
| Ptyp_variant(row_field_list, flag, lbl_lst_option) ->
|
2012-03-22 19:20:24 -07:00
|
|
|
Ptyp_variant(List.map loop_row_field row_field_list,
|
|
|
|
flag, lbl_lst_option)
|
2010-10-17 21:54:24 -07:00
|
|
|
| Ptyp_poly(string_lst, core_type) ->
|
2012-03-22 19:20:24 -07:00
|
|
|
List.iter (check_variable var_names t.ptyp_loc) string_lst;
|
2011-11-29 07:49:25 -08:00
|
|
|
Ptyp_poly(string_lst, loop core_type)
|
2010-10-17 21:54:24 -07:00
|
|
|
| Ptyp_package(longident,lst) ->
|
2011-11-29 07:49:25 -08:00
|
|
|
Ptyp_package(longident,List.map (fun (n,typ) -> (n,loop typ) ) lst)
|
2010-10-17 21:54:24 -07:00
|
|
|
in
|
|
|
|
{t with ptyp_desc = desc}
|
2011-11-29 07:49:25 -08:00
|
|
|
and loop_core_field t =
|
|
|
|
let desc =
|
2010-10-17 21:54:24 -07:00
|
|
|
match t.pfield_desc with
|
|
|
|
| Pfield(n,typ) ->
|
2011-11-29 07:49:25 -08:00
|
|
|
Pfield(n,loop typ)
|
2010-10-17 21:54:24 -07:00
|
|
|
| Pfield_var ->
|
2011-11-29 07:49:25 -08:00
|
|
|
Pfield_var
|
2010-10-17 21:54:24 -07:00
|
|
|
in
|
|
|
|
{ t with pfield_desc=desc}
|
2011-11-29 07:49:25 -08:00
|
|
|
and loop_row_field =
|
2010-10-17 21:54:24 -07:00
|
|
|
function
|
|
|
|
| Rtag(label,flag,lst) ->
|
2011-11-29 07:49:25 -08:00
|
|
|
Rtag(label,flag,List.map loop lst)
|
2010-10-17 21:54:24 -07:00
|
|
|
| Rinherit t ->
|
2011-11-29 07:49:25 -08:00
|
|
|
Rinherit (loop t)
|
2010-10-17 21:54:24 -07:00
|
|
|
in
|
2012-03-22 19:20:24 -07:00
|
|
|
loop t
|
2010-10-17 21:54:24 -07:00
|
|
|
|
2011-11-24 01:02:48 -08:00
|
|
|
let wrap_type_annotation newtypes core_type body =
|
|
|
|
let exp = mkexp(Pexp_constraint(body,Some core_type,None)) in
|
|
|
|
let exp =
|
|
|
|
List.fold_right (fun newtype exp -> mkexp (Pexp_newtype (newtype, exp)))
|
|
|
|
newtypes exp
|
|
|
|
in
|
2012-03-22 19:20:24 -07:00
|
|
|
(exp, ghtyp(Ptyp_poly(newtypes,varify_constructors newtypes core_type)))
|
2010-10-17 21:54:24 -07:00
|
|
|
|
1995-05-04 03:15:53 -07:00
|
|
|
%}
|
|
|
|
|
|
|
|
/* Tokens */
|
|
|
|
|
1995-12-15 02:20:24 -08:00
|
|
|
%token AMPERAMPER
|
1995-05-04 03:15:53 -07:00
|
|
|
%token AMPERSAND
|
|
|
|
%token AND
|
|
|
|
%token AS
|
1997-05-13 11:28:25 -07:00
|
|
|
%token ASSERT
|
1999-11-30 08:07:38 -08:00
|
|
|
%token BACKQUOTE
|
2010-04-07 20:58:41 -07:00
|
|
|
%token BANG
|
1995-05-04 03:15:53 -07:00
|
|
|
%token BAR
|
1995-12-15 02:20:24 -08:00
|
|
|
%token BARBAR
|
1995-05-04 03:15:53 -07:00
|
|
|
%token BARRBRACKET
|
|
|
|
%token BEGIN
|
|
|
|
%token <char> CHAR
|
1996-04-22 04:15:41 -07:00
|
|
|
%token CLASS
|
1995-05-04 03:15:53 -07:00
|
|
|
%token COLON
|
|
|
|
%token COLONCOLON
|
|
|
|
%token COLONEQUAL
|
1996-04-22 04:15:41 -07:00
|
|
|
%token COLONGREATER
|
1995-05-04 03:15:53 -07:00
|
|
|
%token COMMA
|
1996-04-22 04:15:41 -07:00
|
|
|
%token CONSTRAINT
|
1995-05-04 03:15:53 -07:00
|
|
|
%token DO
|
|
|
|
%token DONE
|
|
|
|
%token DOT
|
|
|
|
%token DOTDOT
|
|
|
|
%token DOWNTO
|
|
|
|
%token ELSE
|
|
|
|
%token END
|
|
|
|
%token EOF
|
|
|
|
%token EQUAL
|
|
|
|
%token EXCEPTION
|
|
|
|
%token EXTERNAL
|
|
|
|
%token FALSE
|
|
|
|
%token <string> FLOAT
|
|
|
|
%token FOR
|
|
|
|
%token FUN
|
|
|
|
%token FUNCTION
|
|
|
|
%token FUNCTOR
|
1996-04-30 07:53:58 -07:00
|
|
|
%token GREATER
|
1996-04-22 04:15:41 -07:00
|
|
|
%token GREATERRBRACE
|
1995-11-28 07:00:53 -08:00
|
|
|
%token GREATERRBRACKET
|
1995-05-04 03:15:53 -07:00
|
|
|
%token IF
|
|
|
|
%token IN
|
|
|
|
%token INCLUDE
|
1996-04-30 07:53:58 -07:00
|
|
|
%token <string> INFIXOP0
|
1995-05-04 03:15:53 -07:00
|
|
|
%token <string> INFIXOP1
|
|
|
|
%token <string> INFIXOP2
|
|
|
|
%token <string> INFIXOP3
|
|
|
|
%token <string> INFIXOP4
|
1996-04-22 04:15:41 -07:00
|
|
|
%token INHERIT
|
1998-06-24 12:22:26 -07:00
|
|
|
%token INITIALIZER
|
1995-05-04 03:15:53 -07:00
|
|
|
%token <int> INT
|
2003-04-25 05:27:31 -07:00
|
|
|
%token <int32> INT32
|
|
|
|
%token <int64> INT64
|
1999-11-30 08:07:38 -08:00
|
|
|
%token <string> LABEL
|
1997-10-14 06:17:48 -07:00
|
|
|
%token LAZY
|
1995-05-04 03:15:53 -07:00
|
|
|
%token LBRACE
|
1996-04-22 04:15:41 -07:00
|
|
|
%token LBRACELESS
|
1995-05-04 03:15:53 -07:00
|
|
|
%token LBRACKET
|
|
|
|
%token LBRACKETBAR
|
1995-11-28 07:00:53 -08:00
|
|
|
%token LBRACKETLESS
|
2003-12-18 05:16:22 -08:00
|
|
|
%token LBRACKETGREATER
|
1996-04-30 07:53:58 -07:00
|
|
|
%token LESS
|
1995-05-04 03:15:53 -07:00
|
|
|
%token LESSMINUS
|
|
|
|
%token LET
|
|
|
|
%token <string> LIDENT
|
|
|
|
%token LPAREN
|
|
|
|
%token MATCH
|
1996-04-22 04:15:41 -07:00
|
|
|
%token METHOD
|
2000-09-07 03:57:32 -07:00
|
|
|
%token MINUS
|
|
|
|
%token MINUSDOT
|
1995-05-04 03:15:53 -07:00
|
|
|
%token MINUSGREATER
|
|
|
|
%token MODULE
|
|
|
|
%token MUTABLE
|
2003-04-25 05:27:31 -07:00
|
|
|
%token <nativeint> NATIVEINT
|
1996-04-22 04:15:41 -07:00
|
|
|
%token NEW
|
1998-06-24 12:22:26 -07:00
|
|
|
%token OBJECT
|
1995-05-04 03:15:53 -07:00
|
|
|
%token OF
|
|
|
|
%token OPEN
|
2000-04-11 20:43:25 -07:00
|
|
|
%token <string> OPTLABEL
|
1995-05-04 03:15:53 -07:00
|
|
|
%token OR
|
2003-08-25 06:15:47 -07:00
|
|
|
/* %token PARSER */
|
2000-09-07 03:57:32 -07:00
|
|
|
%token PLUS
|
2009-12-07 08:40:39 -08:00
|
|
|
%token PLUSDOT
|
1995-05-04 03:15:53 -07:00
|
|
|
%token <string> PREFIXOP
|
1996-04-22 04:15:41 -07:00
|
|
|
%token PRIVATE
|
1995-11-13 05:28:09 -08:00
|
|
|
%token QUESTION
|
1995-05-04 03:15:53 -07:00
|
|
|
%token QUOTE
|
|
|
|
%token RBRACE
|
|
|
|
%token RBRACKET
|
|
|
|
%token REC
|
|
|
|
%token RPAREN
|
|
|
|
%token SEMI
|
|
|
|
%token SEMISEMI
|
|
|
|
%token SHARP
|
|
|
|
%token SIG
|
|
|
|
%token STAR
|
|
|
|
%token <string> STRING
|
|
|
|
%token STRUCT
|
|
|
|
%token THEN
|
2000-04-11 20:43:25 -07:00
|
|
|
%token TILDE
|
1995-05-04 03:15:53 -07:00
|
|
|
%token TO
|
|
|
|
%token TRUE
|
|
|
|
%token TRY
|
|
|
|
%token TYPE
|
|
|
|
%token <string> UIDENT
|
|
|
|
%token UNDERSCORE
|
|
|
|
%token VAL
|
1996-04-22 04:15:41 -07:00
|
|
|
%token VIRTUAL
|
1995-05-04 03:15:53 -07:00
|
|
|
%token WHEN
|
|
|
|
%token WHILE
|
|
|
|
%token WITH
|
2012-05-30 07:52:37 -07:00
|
|
|
%token <string * Location.t> COMMENT
|
1995-05-04 03:15:53 -07:00
|
|
|
|
2002-02-05 09:11:33 -08:00
|
|
|
/* Precedences and associativities.
|
|
|
|
|
|
|
|
Tokens and rules have precedences. A reduce/reduce conflict is resolved
|
2003-06-19 11:12:59 -07:00
|
|
|
in favor of the first rule (in source file order). A shift/reduce conflict
|
|
|
|
is resolved by comparing the precedence and associativity of the token to
|
|
|
|
be shifted with those of the rule to be reduced.
|
2002-02-05 09:11:33 -08:00
|
|
|
|
|
|
|
By default, a rule has the precedence of its rightmost terminal (if any).
|
|
|
|
|
|
|
|
When there is a shift/reduce conflict between a rule and a token that
|
|
|
|
have the same precedence, it is resolved using the associativity:
|
|
|
|
if the token is left-associative, the parser will reduce; if
|
|
|
|
right-associative, the parser will shift; if non-associative,
|
|
|
|
the parser will declare a syntax error.
|
|
|
|
|
|
|
|
We will only use associativities with operators of the kind x * x -> x
|
|
|
|
for example, in the rules of the form expr: expr BINOP expr
|
|
|
|
in all other cases, we define two precedences if needed to resolve
|
|
|
|
conflicts.
|
|
|
|
|
|
|
|
The precedences must be listed from low to high.
|
|
|
|
*/
|
|
|
|
|
|
|
|
%nonassoc IN
|
|
|
|
%nonassoc below_SEMI
|
|
|
|
%nonassoc SEMI /* below EQUAL ({lbl=...; lbl=...}) */
|
2003-06-20 08:16:57 -07:00
|
|
|
%nonassoc LET /* above SEMI ( ...; let ... in ...) */
|
2002-02-05 09:11:33 -08:00
|
|
|
%nonassoc below_WITH
|
|
|
|
%nonassoc FUNCTION WITH /* below BAR (match ... with ...) */
|
2003-06-20 08:16:57 -07:00
|
|
|
%nonassoc AND /* above WITH (module rec A: SIG with ... and ...) */
|
2002-02-05 09:11:33 -08:00
|
|
|
%nonassoc THEN /* below ELSE (if ... then ...) */
|
|
|
|
%nonassoc ELSE /* (if ... then ... else ...) */
|
|
|
|
%nonassoc LESSMINUS /* below COLONEQUAL (lbl <- x := e) */
|
|
|
|
%right COLONEQUAL /* expr (e := e := e) */
|
|
|
|
%nonassoc AS
|
|
|
|
%left BAR /* pattern (p|p|p) */
|
|
|
|
%nonassoc below_COMMA
|
|
|
|
%left COMMA /* expr/expr_comma_list (e,e,e) */
|
|
|
|
%right MINUSGREATER /* core_type2 (t -> t -> t) */
|
|
|
|
%right OR BARBAR /* expr (e || e || e) */
|
|
|
|
%right AMPERSAND AMPERAMPER /* expr (e && e && e) */
|
|
|
|
%nonassoc below_EQUAL
|
|
|
|
%left INFIXOP0 EQUAL LESS GREATER /* expr (e OP e OP e) */
|
|
|
|
%right INFIXOP1 /* expr (e OP e OP e) */
|
|
|
|
%right COLONCOLON /* expr (e :: e :: e) */
|
2009-12-07 08:40:39 -08:00
|
|
|
%left INFIXOP2 PLUS PLUSDOT MINUS MINUSDOT /* expr (e OP e OP e) */
|
2002-02-05 09:11:33 -08:00
|
|
|
%left INFIXOP3 STAR /* expr (e OP e OP e) */
|
|
|
|
%right INFIXOP4 /* expr (e OP e OP e) */
|
2009-12-07 08:40:39 -08:00
|
|
|
%nonassoc prec_unary_minus prec_unary_plus /* unary - */
|
2002-02-05 09:11:33 -08:00
|
|
|
%nonassoc prec_constant_constructor /* cf. simple_expr (C versus C x) */
|
|
|
|
%nonassoc prec_constr_appl /* above AS BAR COLONCOLON COMMA */
|
|
|
|
%nonassoc below_SHARP
|
|
|
|
%nonassoc SHARP /* simple_expr/toplevel_directive */
|
|
|
|
%nonassoc below_DOT
|
|
|
|
%nonassoc DOT
|
|
|
|
/* Finally, the first tokens of simple_expr are above everything else. */
|
2010-04-07 20:58:41 -07:00
|
|
|
%nonassoc BACKQUOTE BANG BEGIN CHAR FALSE FLOAT INT INT32 INT64
|
2003-04-29 00:03:36 -07:00
|
|
|
LBRACE LBRACELESS LBRACKET LBRACKETBAR LIDENT LPAREN
|
|
|
|
NEW NATIVEINT PREFIXOP STRING TRUE UIDENT
|
2002-02-05 09:11:33 -08:00
|
|
|
|
1995-05-04 03:15:53 -07:00
|
|
|
|
|
|
|
/* Entry points */
|
|
|
|
|
|
|
|
%start implementation /* for implementation files */
|
|
|
|
%type <Parsetree.structure> implementation
|
|
|
|
%start interface /* for interface files */
|
|
|
|
%type <Parsetree.signature> interface
|
|
|
|
%start toplevel_phrase /* for interactive use */
|
|
|
|
%type <Parsetree.toplevel_phrase> toplevel_phrase
|
1995-11-01 10:12:24 -08:00
|
|
|
%start use_file /* for the #use directive */
|
|
|
|
%type <Parsetree.toplevel_phrase list> use_file
|
2012-05-30 07:52:37 -07:00
|
|
|
%start any_longident
|
|
|
|
%type <Longident.t> any_longident
|
1995-05-04 03:15:53 -07:00
|
|
|
%%
|
|
|
|
|
|
|
|
/* Entry points */
|
|
|
|
|
|
|
|
implementation:
|
1995-09-20 06:34:08 -07:00
|
|
|
structure EOF { $1 }
|
1995-05-04 03:15:53 -07:00
|
|
|
;
|
|
|
|
interface:
|
|
|
|
signature EOF { List.rev $1 }
|
|
|
|
;
|
|
|
|
toplevel_phrase:
|
1997-03-04 02:21:07 -08:00
|
|
|
top_structure SEMISEMI { Ptop_def $1 }
|
2012-12-13 04:48:51 -08:00
|
|
|
| seq_expr SEMISEMI { Ptop_def[mkstrexp $1] }
|
1995-11-01 10:12:24 -08:00
|
|
|
| toplevel_directive SEMISEMI { $1 }
|
1995-05-04 03:15:53 -07:00
|
|
|
| EOF { raise End_of_file }
|
|
|
|
;
|
1997-03-04 02:21:07 -08:00
|
|
|
top_structure:
|
|
|
|
structure_item { [$1] }
|
|
|
|
| structure_item top_structure { $1 :: $2 }
|
|
|
|
;
|
1995-11-01 10:12:24 -08:00
|
|
|
use_file:
|
|
|
|
use_file_tail { $1 }
|
2012-12-13 04:48:51 -08:00
|
|
|
| seq_expr use_file_tail { Ptop_def[mkstrexp $1] :: $2 }
|
1995-11-01 10:12:24 -08:00
|
|
|
;
|
|
|
|
use_file_tail:
|
|
|
|
EOF { [] }
|
|
|
|
| SEMISEMI EOF { [] }
|
2012-12-13 04:48:51 -08:00
|
|
|
| SEMISEMI seq_expr use_file_tail { Ptop_def[mkstrexp $2] :: $3 }
|
1995-11-01 10:12:24 -08:00
|
|
|
| SEMISEMI structure_item use_file_tail { Ptop_def[$2] :: $3 }
|
|
|
|
| SEMISEMI toplevel_directive use_file_tail { $2 :: $3 }
|
|
|
|
| structure_item use_file_tail { Ptop_def[$1] :: $2 }
|
|
|
|
| toplevel_directive use_file_tail { $1 :: $2 }
|
|
|
|
;
|
1995-05-04 03:15:53 -07:00
|
|
|
|
|
|
|
/* Module expressions */
|
|
|
|
|
|
|
|
module_expr:
|
|
|
|
mod_longident
|
2012-05-30 07:52:37 -07:00
|
|
|
{ mkmod(Pmod_ident (mkrhs $1 1)) }
|
1995-05-04 03:15:53 -07:00
|
|
|
| STRUCT structure END
|
1995-09-20 06:34:08 -07:00
|
|
|
{ mkmod(Pmod_structure($2)) }
|
1997-08-22 01:55:41 -07:00
|
|
|
| STRUCT structure error
|
|
|
|
{ unclosed "struct" 1 "end" 3 }
|
1995-05-04 03:15:53 -07:00
|
|
|
| FUNCTOR LPAREN UIDENT COLON module_type RPAREN MINUSGREATER module_expr
|
2012-05-30 07:52:37 -07:00
|
|
|
{ mkmod(Pmod_functor(mkrhs $3 3, $5, $8)) }
|
1995-08-23 04:55:54 -07:00
|
|
|
| module_expr LPAREN module_expr RPAREN
|
|
|
|
{ mkmod(Pmod_apply($1, $3)) }
|
1997-08-22 01:55:41 -07:00
|
|
|
| module_expr LPAREN module_expr error
|
|
|
|
{ unclosed "(" 2 ")" 4 }
|
1995-05-04 03:15:53 -07:00
|
|
|
| LPAREN module_expr COLON module_type RPAREN
|
|
|
|
{ mkmod(Pmod_constraint($2, $4)) }
|
1997-08-22 01:55:41 -07:00
|
|
|
| LPAREN module_expr COLON module_type error
|
|
|
|
{ unclosed "(" 1 ")" 5 }
|
1995-05-04 03:15:53 -07:00
|
|
|
| LPAREN module_expr RPAREN
|
|
|
|
{ $2 }
|
1997-08-22 01:55:41 -07:00
|
|
|
| LPAREN module_expr error
|
|
|
|
{ unclosed "(" 1 ")" 3 }
|
2010-10-21 16:59:33 -07:00
|
|
|
| LPAREN VAL expr RPAREN
|
|
|
|
{ mkmod(Pmod_unpack $3) }
|
2009-10-26 03:53:16 -07:00
|
|
|
| LPAREN VAL expr COLON package_type RPAREN
|
2010-10-21 16:59:33 -07:00
|
|
|
{ mkmod(Pmod_unpack(
|
|
|
|
ghexp(Pexp_constraint($3, Some(ghtyp(Ptyp_package $5)), None)))) }
|
|
|
|
| LPAREN VAL expr COLON package_type COLONGREATER package_type RPAREN
|
|
|
|
{ mkmod(Pmod_unpack(
|
|
|
|
ghexp(Pexp_constraint($3, Some(ghtyp(Ptyp_package $5)),
|
|
|
|
Some(ghtyp(Ptyp_package $7)))))) }
|
|
|
|
| LPAREN VAL expr COLONGREATER package_type RPAREN
|
|
|
|
{ mkmod(Pmod_unpack(
|
|
|
|
ghexp(Pexp_constraint($3, None, Some(ghtyp(Ptyp_package $5)))))) }
|
2010-04-26 11:37:25 -07:00
|
|
|
| LPAREN VAL expr COLON error
|
|
|
|
{ unclosed "(" 1 ")" 5 }
|
2010-10-21 16:59:33 -07:00
|
|
|
| LPAREN VAL expr COLONGREATER error
|
|
|
|
{ unclosed "(" 1 ")" 5 }
|
|
|
|
| LPAREN VAL expr error
|
|
|
|
{ unclosed "(" 1 ")" 4 }
|
1995-05-04 03:15:53 -07:00
|
|
|
;
|
|
|
|
structure:
|
1995-09-20 06:34:08 -07:00
|
|
|
structure_tail { $1 }
|
2012-12-13 04:48:51 -08:00
|
|
|
| seq_expr structure_tail { mkstrexp $1 :: $2 }
|
1995-09-20 06:34:08 -07:00
|
|
|
;
|
|
|
|
structure_tail:
|
1995-05-04 03:15:53 -07:00
|
|
|
/* empty */ { [] }
|
1995-09-20 06:34:08 -07:00
|
|
|
| SEMISEMI { [] }
|
2012-12-13 04:48:51 -08:00
|
|
|
| SEMISEMI seq_expr structure_tail { mkstrexp $2 :: $3 }
|
1995-09-20 06:34:08 -07:00
|
|
|
| SEMISEMI structure_item structure_tail { $2 :: $3 }
|
|
|
|
| structure_item structure_tail { $1 :: $2 }
|
1995-05-04 03:15:53 -07:00
|
|
|
;
|
|
|
|
structure_item:
|
1996-04-04 07:56:46 -08:00
|
|
|
LET rec_flag let_bindings
|
|
|
|
{ match $3 with
|
2011-10-28 14:21:55 -07:00
|
|
|
[{ ppat_desc = Ppat_any; ppat_loc = _ }, exp] -> mkstr(Pstr_eval exp)
|
1996-04-04 07:56:46 -08:00
|
|
|
| _ -> mkstr(Pstr_value($2, List.rev $3)) }
|
2008-01-11 08:13:18 -08:00
|
|
|
| EXTERNAL val_ident COLON core_type EQUAL primitive_declaration
|
2012-05-30 07:52:37 -07:00
|
|
|
{ mkstr(Pstr_primitive(mkrhs $2 2, {pval_type = $4; pval_prim = $6;
|
|
|
|
pval_loc = symbol_rloc ()})) }
|
1995-05-04 03:15:53 -07:00
|
|
|
| TYPE type_declarations
|
1995-10-05 08:18:49 -07:00
|
|
|
{ mkstr(Pstr_type(List.rev $2)) }
|
1995-05-04 03:15:53 -07:00
|
|
|
| EXCEPTION UIDENT constructor_arguments
|
2012-05-30 07:52:37 -07:00
|
|
|
{ mkstr(Pstr_exception(mkrhs $2 2, $3)) }
|
2000-03-12 05:10:29 -08:00
|
|
|
| EXCEPTION UIDENT EQUAL constr_longident
|
2012-05-30 07:52:37 -07:00
|
|
|
{ mkstr(Pstr_exn_rebind(mkrhs $2 2, mkloc $4 (rhs_loc 4))) }
|
1995-05-04 03:15:53 -07:00
|
|
|
| MODULE UIDENT module_binding
|
2012-05-30 07:52:37 -07:00
|
|
|
{ mkstr(Pstr_module(mkrhs $2 2, $3)) }
|
2003-06-19 08:53:53 -07:00
|
|
|
| MODULE REC module_rec_bindings
|
|
|
|
{ mkstr(Pstr_recmodule(List.rev $3)) }
|
1995-05-04 03:15:53 -07:00
|
|
|
| MODULE TYPE ident EQUAL module_type
|
2012-05-30 07:52:37 -07:00
|
|
|
{ mkstr(Pstr_modtype(mkrhs $3 3, $5)) }
|
1995-05-04 03:15:53 -07:00
|
|
|
| OPEN mod_longident
|
2012-05-30 07:52:37 -07:00
|
|
|
{ mkstr(Pstr_open (mkrhs $2 2)) }
|
1998-06-24 12:22:26 -07:00
|
|
|
| CLASS class_declarations
|
1996-04-22 04:15:41 -07:00
|
|
|
{ mkstr(Pstr_class (List.rev $2)) }
|
1998-06-24 12:22:26 -07:00
|
|
|
| CLASS TYPE class_type_declarations
|
|
|
|
{ mkstr(Pstr_class_type (List.rev $3)) }
|
2000-12-01 01:35:00 -08:00
|
|
|
| INCLUDE module_expr
|
|
|
|
{ mkstr(Pstr_include $2) }
|
1995-05-04 03:15:53 -07:00
|
|
|
;
|
|
|
|
module_binding:
|
|
|
|
EQUAL module_expr
|
|
|
|
{ $2 }
|
|
|
|
| COLON module_type EQUAL module_expr
|
|
|
|
{ mkmod(Pmod_constraint($4, $2)) }
|
|
|
|
| LPAREN UIDENT COLON module_type RPAREN module_binding
|
2012-05-30 07:52:37 -07:00
|
|
|
{ mkmod(Pmod_functor(mkrhs $2 2, $4, $6)) }
|
1995-05-04 03:15:53 -07:00
|
|
|
;
|
2003-06-19 08:53:53 -07:00
|
|
|
module_rec_bindings:
|
|
|
|
module_rec_binding { [$1] }
|
|
|
|
| module_rec_bindings AND module_rec_binding { $3 :: $1 }
|
|
|
|
;
|
|
|
|
module_rec_binding:
|
2012-05-30 07:52:37 -07:00
|
|
|
UIDENT COLON module_type EQUAL module_expr { (mkrhs $1 1, $3, $5) }
|
2003-06-19 08:53:53 -07:00
|
|
|
;
|
1995-05-04 03:15:53 -07:00
|
|
|
|
|
|
|
/* Module types */
|
|
|
|
|
|
|
|
module_type:
|
|
|
|
mty_longident
|
2012-05-30 07:52:37 -07:00
|
|
|
{ mkmty(Pmty_ident (mkrhs $1 1)) }
|
1995-05-04 03:15:53 -07:00
|
|
|
| SIG signature END
|
|
|
|
{ mkmty(Pmty_signature(List.rev $2)) }
|
1997-08-22 01:55:41 -07:00
|
|
|
| SIG signature error
|
|
|
|
{ unclosed "sig" 1 "end" 3 }
|
1995-05-04 03:15:53 -07:00
|
|
|
| FUNCTOR LPAREN UIDENT COLON module_type RPAREN MINUSGREATER module_type
|
2002-02-05 09:11:33 -08:00
|
|
|
%prec below_WITH
|
2012-05-30 07:52:37 -07:00
|
|
|
{ mkmty(Pmty_functor(mkrhs $3 3, $5, $8)) }
|
1995-09-28 03:41:50 -07:00
|
|
|
| module_type WITH with_constraints
|
1995-05-04 03:15:53 -07:00
|
|
|
{ mkmty(Pmty_with($1, List.rev $3)) }
|
2010-04-02 05:53:33 -07:00
|
|
|
| MODULE TYPE OF module_expr
|
|
|
|
{ mkmty(Pmty_typeof $4) }
|
1995-05-04 03:15:53 -07:00
|
|
|
| LPAREN module_type RPAREN
|
|
|
|
{ $2 }
|
1997-08-22 01:55:41 -07:00
|
|
|
| LPAREN module_type error
|
|
|
|
{ unclosed "(" 1 ")" 3 }
|
1995-05-04 03:15:53 -07:00
|
|
|
;
|
|
|
|
signature:
|
|
|
|
/* empty */ { [] }
|
|
|
|
| signature signature_item { $2 :: $1 }
|
1995-09-20 06:34:08 -07:00
|
|
|
| signature signature_item SEMISEMI { $2 :: $1 }
|
1995-05-04 03:15:53 -07:00
|
|
|
;
|
|
|
|
signature_item:
|
2008-01-11 08:13:18 -08:00
|
|
|
VAL val_ident COLON core_type
|
2012-05-30 07:52:37 -07:00
|
|
|
{ mksig(Psig_value(mkrhs $2 2, {pval_type = $4; pval_prim = [];
|
|
|
|
pval_loc = symbol_rloc()})) }
|
2008-01-11 08:13:18 -08:00
|
|
|
| EXTERNAL val_ident COLON core_type EQUAL primitive_declaration
|
2012-05-30 07:52:37 -07:00
|
|
|
{ mksig(Psig_value(mkrhs $2 2, {pval_type = $4; pval_prim = $6;
|
|
|
|
pval_loc = symbol_rloc()})) }
|
1995-05-04 03:15:53 -07:00
|
|
|
| TYPE type_declarations
|
1995-10-05 08:18:49 -07:00
|
|
|
{ mksig(Psig_type(List.rev $2)) }
|
1995-05-04 03:15:53 -07:00
|
|
|
| EXCEPTION UIDENT constructor_arguments
|
2012-05-30 07:52:37 -07:00
|
|
|
{ mksig(Psig_exception(mkrhs $2 2, $3)) }
|
1995-05-04 03:15:53 -07:00
|
|
|
| MODULE UIDENT module_declaration
|
2012-05-30 07:52:37 -07:00
|
|
|
{ mksig(Psig_module(mkrhs $2 2, $3)) }
|
2003-06-19 08:53:53 -07:00
|
|
|
| MODULE REC module_rec_declarations
|
|
|
|
{ mksig(Psig_recmodule(List.rev $3)) }
|
1995-05-04 03:15:53 -07:00
|
|
|
| MODULE TYPE ident
|
2012-05-30 07:52:37 -07:00
|
|
|
{ mksig(Psig_modtype(mkrhs $3 3, Pmodtype_abstract)) }
|
1995-05-04 03:15:53 -07:00
|
|
|
| MODULE TYPE ident EQUAL module_type
|
2012-05-30 07:52:37 -07:00
|
|
|
{ mksig(Psig_modtype(mkrhs $3 3, Pmodtype_manifest $5)) }
|
1995-05-04 03:15:53 -07:00
|
|
|
| OPEN mod_longident
|
2012-05-30 07:52:37 -07:00
|
|
|
{ mksig(Psig_open (mkrhs $2 2)) }
|
1995-05-04 03:15:53 -07:00
|
|
|
| INCLUDE module_type
|
1995-10-05 08:18:49 -07:00
|
|
|
{ mksig(Psig_include $2) }
|
1998-06-24 12:22:26 -07:00
|
|
|
| CLASS class_descriptions
|
1996-04-22 04:15:41 -07:00
|
|
|
{ mksig(Psig_class (List.rev $2)) }
|
1998-06-24 12:22:26 -07:00
|
|
|
| CLASS TYPE class_type_declarations
|
|
|
|
{ mksig(Psig_class_type (List.rev $3)) }
|
1995-05-04 03:15:53 -07:00
|
|
|
;
|
|
|
|
|
|
|
|
module_declaration:
|
|
|
|
COLON module_type
|
|
|
|
{ $2 }
|
|
|
|
| LPAREN UIDENT COLON module_type RPAREN module_declaration
|
2012-05-30 07:52:37 -07:00
|
|
|
{ mkmty(Pmty_functor(mkrhs $2 2, $4, $6)) }
|
1995-05-04 03:15:53 -07:00
|
|
|
;
|
2003-06-19 08:53:53 -07:00
|
|
|
module_rec_declarations:
|
|
|
|
module_rec_declaration { [$1] }
|
|
|
|
| module_rec_declarations AND module_rec_declaration { $3 :: $1 }
|
|
|
|
;
|
|
|
|
module_rec_declaration:
|
2012-05-30 07:52:37 -07:00
|
|
|
UIDENT COLON module_type { (mkrhs $1 1, $3) }
|
2003-06-19 08:53:53 -07:00
|
|
|
;
|
1995-05-04 03:15:53 -07:00
|
|
|
|
1998-06-24 12:22:26 -07:00
|
|
|
/* Class expressions */
|
|
|
|
|
|
|
|
class_declarations:
|
|
|
|
class_declarations AND class_declaration { $3 :: $1 }
|
|
|
|
| class_declaration { [$1] }
|
|
|
|
;
|
|
|
|
class_declaration:
|
|
|
|
virtual_flag class_type_parameters LIDENT class_fun_binding
|
2000-09-07 03:57:32 -07:00
|
|
|
{ let params, variance = List.split (fst $2) in
|
|
|
|
{pci_virt = $1; pci_params = params, snd $2;
|
2012-05-30 07:52:37 -07:00
|
|
|
pci_name = mkrhs $3 3; pci_expr = $4; pci_variance = variance;
|
1999-09-08 10:42:36 -07:00
|
|
|
pci_loc = symbol_rloc ()} }
|
1998-06-24 12:22:26 -07:00
|
|
|
;
|
|
|
|
class_fun_binding:
|
|
|
|
EQUAL class_expr
|
|
|
|
{ $2 }
|
|
|
|
| COLON class_type EQUAL class_expr
|
|
|
|
{ mkclass(Pcl_constraint($4, $2)) }
|
1999-11-30 08:07:38 -08:00
|
|
|
| labeled_simple_pattern class_fun_binding
|
|
|
|
{ let (l,o,p) = $1 in mkclass(Pcl_fun(l, o, p, $2)) }
|
1998-06-24 12:22:26 -07:00
|
|
|
;
|
|
|
|
class_type_parameters:
|
2003-03-31 09:11:06 -08:00
|
|
|
/*empty*/ { [], symbol_gloc () }
|
1999-09-08 10:42:36 -07:00
|
|
|
| LBRACKET type_parameter_list RBRACKET { List.rev $2, symbol_rloc () }
|
1998-06-24 12:22:26 -07:00
|
|
|
;
|
|
|
|
class_fun_def:
|
1999-11-30 08:07:38 -08:00
|
|
|
labeled_simple_pattern MINUSGREATER class_expr
|
|
|
|
{ let (l,o,p) = $1 in mkclass(Pcl_fun(l, o, p, $3)) }
|
|
|
|
| labeled_simple_pattern class_fun_def
|
|
|
|
{ let (l,o,p) = $1 in mkclass(Pcl_fun(l, o, p, $2)) }
|
1998-06-24 12:22:26 -07:00
|
|
|
;
|
|
|
|
class_expr:
|
|
|
|
class_simple_expr
|
|
|
|
{ $1 }
|
|
|
|
| FUN class_fun_def
|
|
|
|
{ $2 }
|
1999-11-30 08:07:38 -08:00
|
|
|
| class_simple_expr simple_labeled_expr_list
|
1998-06-24 12:22:26 -07:00
|
|
|
{ mkclass(Pcl_apply($1, List.rev $2)) }
|
|
|
|
| LET rec_flag let_bindings IN class_expr
|
|
|
|
{ mkclass(Pcl_let ($2, List.rev $3, $5)) }
|
|
|
|
;
|
|
|
|
class_simple_expr:
|
|
|
|
LBRACKET core_type_comma_list RBRACKET class_longident
|
2012-05-30 07:52:37 -07:00
|
|
|
{ mkclass(Pcl_constr(mkloc $4 (rhs_loc 4), List.rev $2)) }
|
1998-06-24 12:22:26 -07:00
|
|
|
| class_longident
|
2012-05-30 07:52:37 -07:00
|
|
|
{ mkclass(Pcl_constr(mkrhs $1 1, [])) }
|
1998-06-24 12:22:26 -07:00
|
|
|
| OBJECT class_structure END
|
|
|
|
{ mkclass(Pcl_structure($2)) }
|
|
|
|
| OBJECT class_structure error
|
2003-11-25 00:46:45 -08:00
|
|
|
{ unclosed "object" 1 "end" 3 }
|
1998-06-24 12:22:26 -07:00
|
|
|
| LPAREN class_expr COLON class_type RPAREN
|
|
|
|
{ mkclass(Pcl_constraint($2, $4)) }
|
|
|
|
| LPAREN class_expr COLON class_type error
|
|
|
|
{ unclosed "(" 1 ")" 5 }
|
|
|
|
| LPAREN class_expr RPAREN
|
|
|
|
{ $2 }
|
|
|
|
| LPAREN class_expr error
|
|
|
|
{ unclosed "(" 1 ")" 3 }
|
|
|
|
;
|
|
|
|
class_structure:
|
|
|
|
class_self_pattern class_fields
|
2012-05-30 07:52:37 -07:00
|
|
|
{ { pcstr_pat = $1; pcstr_fields = List.rev $2 } }
|
1998-06-24 12:22:26 -07:00
|
|
|
;
|
|
|
|
class_self_pattern:
|
|
|
|
LPAREN pattern RPAREN
|
2003-04-06 05:45:03 -07:00
|
|
|
{ reloc_pat $2 }
|
1998-06-24 12:22:26 -07:00
|
|
|
| LPAREN pattern COLON core_type RPAREN
|
1998-11-29 09:34:05 -08:00
|
|
|
{ mkpat(Ppat_constraint($2, $4)) }
|
1998-06-24 12:22:26 -07:00
|
|
|
| /* empty */
|
2003-03-31 09:11:06 -08:00
|
|
|
{ ghpat(Ppat_any) }
|
1998-06-24 12:22:26 -07:00
|
|
|
;
|
|
|
|
class_fields:
|
|
|
|
/* empty */
|
|
|
|
{ [] }
|
2012-05-30 07:52:37 -07:00
|
|
|
| class_fields class_field
|
|
|
|
{ $2 :: $1 }
|
|
|
|
;
|
|
|
|
class_field:
|
|
|
|
| INHERIT override_flag class_expr parent_binder
|
|
|
|
{ mkcf (Pcf_inher ($2, $3, $4)) }
|
|
|
|
| VAL virtual_value
|
|
|
|
{ mkcf (Pcf_valvirt $2) }
|
|
|
|
| VAL value
|
|
|
|
{ mkcf (Pcf_val $2) }
|
|
|
|
| virtual_method
|
|
|
|
{ mkcf (Pcf_virt $1) }
|
|
|
|
| concrete_method
|
|
|
|
{ mkcf (Pcf_meth $1) }
|
|
|
|
| CONSTRAINT constrain_field
|
|
|
|
{ mkcf (Pcf_constr $2) }
|
|
|
|
| INITIALIZER seq_expr
|
|
|
|
{ mkcf (Pcf_init $2) }
|
1998-06-24 12:22:26 -07:00
|
|
|
;
|
|
|
|
parent_binder:
|
|
|
|
AS LIDENT
|
|
|
|
{ Some $2 }
|
|
|
|
| /* empty */
|
2006-04-04 19:28:13 -07:00
|
|
|
{ None }
|
|
|
|
;
|
|
|
|
virtual_value:
|
2010-04-07 20:58:41 -07:00
|
|
|
override_flag MUTABLE VIRTUAL label COLON core_type
|
|
|
|
{ if $1 = Override then syntax_error ();
|
2012-05-30 07:52:37 -07:00
|
|
|
mkloc $4 (rhs_loc 4), Mutable, $6 }
|
2006-04-04 19:28:13 -07:00
|
|
|
| VIRTUAL mutable_flag label COLON core_type
|
2012-05-30 07:52:37 -07:00
|
|
|
{ mkrhs $3 3, $2, $5 }
|
1998-06-24 12:22:26 -07:00
|
|
|
;
|
|
|
|
value:
|
2010-04-07 20:58:41 -07:00
|
|
|
override_flag mutable_flag label EQUAL seq_expr
|
2012-05-30 07:52:37 -07:00
|
|
|
{ mkrhs $3 3, $2, $1, $5 }
|
2010-04-07 20:58:41 -07:00
|
|
|
| override_flag mutable_flag label type_constraint EQUAL seq_expr
|
2012-09-10 03:32:49 -07:00
|
|
|
{ mkrhs $3 3, $2, $1, (let (t, t') = $4 in ghexp(Pexp_constraint($6, t, t'))) }
|
1998-06-24 12:22:26 -07:00
|
|
|
;
|
|
|
|
virtual_method:
|
2010-04-07 20:58:41 -07:00
|
|
|
METHOD override_flag PRIVATE VIRTUAL label COLON poly_type
|
|
|
|
{ if $2 = Override then syntax_error ();
|
2012-05-30 07:52:37 -07:00
|
|
|
mkloc $5 (rhs_loc 5), Private, $7 }
|
2010-04-08 00:46:08 -07:00
|
|
|
| METHOD override_flag VIRTUAL private_flag label COLON poly_type
|
|
|
|
{ if $2 = Override then syntax_error ();
|
2012-05-30 07:52:37 -07:00
|
|
|
mkloc $5 (rhs_loc 5), $4, $7 }
|
1998-06-24 12:22:26 -07:00
|
|
|
;
|
|
|
|
concrete_method :
|
2010-04-07 20:58:41 -07:00
|
|
|
METHOD override_flag private_flag label strict_binding
|
2012-05-30 07:52:37 -07:00
|
|
|
{ mkloc $4 (rhs_loc 4), $3, $2, ghexp(Pexp_poly ($5, None)) }
|
2010-04-07 20:58:41 -07:00
|
|
|
| METHOD override_flag private_flag label COLON poly_type EQUAL seq_expr
|
2012-05-30 07:52:37 -07:00
|
|
|
{ mkloc $4 (rhs_loc 4), $3, $2, ghexp(Pexp_poly($8,Some $6)) }
|
2011-11-24 01:02:48 -08:00
|
|
|
| METHOD override_flag private_flag label COLON TYPE lident_list
|
|
|
|
DOT core_type EQUAL seq_expr
|
|
|
|
{ let exp, poly = wrap_type_annotation $7 $9 $11 in
|
2012-05-30 07:52:37 -07:00
|
|
|
mkloc $4 (rhs_loc 4), $3, $2, ghexp(Pexp_poly(exp, Some poly)) }
|
1998-06-24 12:22:26 -07:00
|
|
|
;
|
|
|
|
|
|
|
|
/* Class types */
|
|
|
|
|
|
|
|
class_type:
|
|
|
|
class_signature
|
|
|
|
{ $1 }
|
2000-04-11 20:43:25 -07:00
|
|
|
| QUESTION LIDENT COLON simple_core_type_or_tuple MINUSGREATER class_type
|
2012-05-30 07:52:37 -07:00
|
|
|
{ mkcty(Pcty_fun("?" ^ $2 , mkoption $4, $6)) }
|
2000-04-11 20:43:25 -07:00
|
|
|
| OPTLABEL simple_core_type_or_tuple MINUSGREATER class_type
|
2012-05-30 07:52:37 -07:00
|
|
|
{ mkcty(Pcty_fun("?" ^ $1, mkoption $2, $4)) }
|
2000-04-11 20:43:25 -07:00
|
|
|
| LIDENT COLON simple_core_type_or_tuple MINUSGREATER class_type
|
|
|
|
{ mkcty(Pcty_fun($1, $3, $5)) }
|
1999-11-30 08:07:38 -08:00
|
|
|
| simple_core_type_or_tuple MINUSGREATER class_type
|
|
|
|
{ mkcty(Pcty_fun("", $1, $3)) }
|
1998-06-24 12:22:26 -07:00
|
|
|
;
|
|
|
|
class_signature:
|
|
|
|
LBRACKET core_type_comma_list RBRACKET clty_longident
|
2012-05-30 07:52:37 -07:00
|
|
|
{ mkcty(Pcty_constr (mkloc $4 (rhs_loc 4), List.rev $2)) }
|
1998-06-24 12:22:26 -07:00
|
|
|
| clty_longident
|
2012-05-30 07:52:37 -07:00
|
|
|
{ mkcty(Pcty_constr (mkrhs $1 1, [])) }
|
1998-06-24 12:22:26 -07:00
|
|
|
| OBJECT class_sig_body END
|
|
|
|
{ mkcty(Pcty_signature $2) }
|
|
|
|
| OBJECT class_sig_body error
|
2003-11-25 00:46:45 -08:00
|
|
|
{ unclosed "object" 1 "end" 3 }
|
1998-06-24 12:22:26 -07:00
|
|
|
;
|
|
|
|
class_sig_body:
|
|
|
|
class_self_type class_sig_fields
|
2012-05-30 07:52:37 -07:00
|
|
|
{ { pcsig_self = $1; pcsig_fields = List.rev $2;
|
|
|
|
pcsig_loc = symbol_rloc(); } }
|
1998-06-24 12:22:26 -07:00
|
|
|
;
|
|
|
|
class_self_type:
|
|
|
|
LPAREN core_type RPAREN
|
|
|
|
{ $2 }
|
|
|
|
| /* empty */
|
|
|
|
{ mktyp(Ptyp_any) }
|
|
|
|
;
|
|
|
|
class_sig_fields:
|
|
|
|
/* empty */ { [] }
|
2012-05-30 07:52:37 -07:00
|
|
|
| class_sig_fields class_sig_field { $2 :: $1 }
|
|
|
|
;
|
|
|
|
class_sig_field:
|
|
|
|
INHERIT class_signature { mkctf (Pctf_inher $2) }
|
|
|
|
| VAL value_type { mkctf (Pctf_val $2) }
|
|
|
|
| virtual_method_type { mkctf (Pctf_virt $1) }
|
|
|
|
| method_type { mkctf (Pctf_meth $1) }
|
|
|
|
| CONSTRAINT constrain_field { mkctf (Pctf_cstr $2) }
|
1998-06-24 12:22:26 -07:00
|
|
|
;
|
|
|
|
value_type:
|
2006-04-04 19:28:13 -07:00
|
|
|
VIRTUAL mutable_flag label COLON core_type
|
2012-05-30 07:52:37 -07:00
|
|
|
{ $3, $2, Virtual, $5 }
|
2006-04-04 19:28:13 -07:00
|
|
|
| MUTABLE virtual_flag label COLON core_type
|
2012-05-30 07:52:37 -07:00
|
|
|
{ $3, Mutable, $2, $5 }
|
2006-04-04 19:28:13 -07:00
|
|
|
| label COLON core_type
|
2012-05-30 07:52:37 -07:00
|
|
|
{ $1, Immutable, Concrete, $3 }
|
1998-06-24 12:22:26 -07:00
|
|
|
;
|
|
|
|
method_type:
|
2002-04-18 00:27:47 -07:00
|
|
|
METHOD private_flag label COLON poly_type
|
2012-05-30 07:52:37 -07:00
|
|
|
{ $3, $2, $5 }
|
1998-06-24 12:22:26 -07:00
|
|
|
;
|
2010-04-08 00:46:08 -07:00
|
|
|
virtual_method_type:
|
|
|
|
METHOD PRIVATE VIRTUAL label COLON poly_type
|
2012-05-30 07:52:37 -07:00
|
|
|
{ $4, Private, $6 }
|
2010-04-08 00:46:08 -07:00
|
|
|
| METHOD VIRTUAL private_flag label COLON poly_type
|
2012-05-30 07:52:37 -07:00
|
|
|
{ $4, $3, $6 }
|
2010-04-08 00:46:08 -07:00
|
|
|
;
|
1998-06-24 12:22:26 -07:00
|
|
|
constrain:
|
2012-05-30 07:52:37 -07:00
|
|
|
core_type EQUAL core_type { $1, $3, symbol_rloc() }
|
|
|
|
;
|
|
|
|
constrain_field:
|
|
|
|
core_type EQUAL core_type { $1, $3 }
|
1998-06-24 12:22:26 -07:00
|
|
|
;
|
|
|
|
class_descriptions:
|
|
|
|
class_descriptions AND class_description { $3 :: $1 }
|
|
|
|
| class_description { [$1] }
|
|
|
|
;
|
|
|
|
class_description:
|
2000-04-11 20:43:25 -07:00
|
|
|
virtual_flag class_type_parameters LIDENT COLON class_type
|
2000-09-07 03:57:32 -07:00
|
|
|
{ let params, variance = List.split (fst $2) in
|
|
|
|
{pci_virt = $1; pci_params = params, snd $2;
|
2012-05-30 07:52:37 -07:00
|
|
|
pci_name = mkrhs $3 3; pci_expr = $5; pci_variance = variance;
|
1999-09-08 10:42:36 -07:00
|
|
|
pci_loc = symbol_rloc ()} }
|
1998-06-24 12:22:26 -07:00
|
|
|
;
|
|
|
|
class_type_declarations:
|
|
|
|
class_type_declarations AND class_type_declaration { $3 :: $1 }
|
|
|
|
| class_type_declaration { [$1] }
|
|
|
|
;
|
|
|
|
class_type_declaration:
|
|
|
|
virtual_flag class_type_parameters LIDENT EQUAL class_signature
|
2000-09-07 03:57:32 -07:00
|
|
|
{ let params, variance = List.split (fst $2) in
|
|
|
|
{pci_virt = $1; pci_params = params, snd $2;
|
2012-05-30 07:52:37 -07:00
|
|
|
pci_name = mkrhs $3 3; pci_expr = $5; pci_variance = variance;
|
1999-09-08 10:42:36 -07:00
|
|
|
pci_loc = symbol_rloc ()} }
|
1998-06-24 12:22:26 -07:00
|
|
|
;
|
|
|
|
|
1995-05-04 03:15:53 -07:00
|
|
|
/* Core expressions */
|
|
|
|
|
1997-05-12 08:10:03 -07:00
|
|
|
seq_expr:
|
2002-02-05 09:11:33 -08:00
|
|
|
| expr %prec below_SEMI { $1 }
|
2003-04-06 05:45:03 -07:00
|
|
|
| expr SEMI { reloc_exp $1 }
|
1997-05-12 08:10:03 -07:00
|
|
|
| expr SEMI seq_expr { mkexp(Pexp_sequence($1, $3)) }
|
|
|
|
;
|
1999-11-30 08:07:38 -08:00
|
|
|
labeled_simple_pattern:
|
1999-12-08 00:21:57 -08:00
|
|
|
QUESTION LPAREN label_let_pattern opt_default RPAREN
|
|
|
|
{ ("?" ^ fst $3, $4, snd $3) }
|
2000-04-11 20:43:25 -07:00
|
|
|
| QUESTION label_var
|
1999-11-30 08:07:38 -08:00
|
|
|
{ ("?" ^ fst $2, None, snd $2) }
|
2000-04-11 20:43:25 -07:00
|
|
|
| OPTLABEL LPAREN let_pattern opt_default RPAREN
|
|
|
|
{ ("?" ^ $1, $4, $3) }
|
|
|
|
| OPTLABEL pattern_var
|
|
|
|
{ ("?" ^ $1, None, $2) }
|
|
|
|
| TILDE LPAREN label_let_pattern RPAREN
|
|
|
|
{ (fst $3, None, snd $3) }
|
|
|
|
| TILDE label_var
|
|
|
|
{ (fst $2, None, snd $2) }
|
|
|
|
| LABEL simple_pattern
|
|
|
|
{ ($1, None, $2) }
|
1999-11-30 08:07:38 -08:00
|
|
|
| simple_pattern
|
|
|
|
{ ("", None, $1) }
|
|
|
|
;
|
2000-04-11 20:43:25 -07:00
|
|
|
pattern_var:
|
2012-05-30 07:52:37 -07:00
|
|
|
LIDENT { mkpat(Ppat_var (mkrhs $1 1)) }
|
2006-12-14 20:51:11 -08:00
|
|
|
| UNDERSCORE { mkpat Ppat_any }
|
2000-04-11 20:43:25 -07:00
|
|
|
;
|
1999-12-08 00:21:57 -08:00
|
|
|
opt_default:
|
|
|
|
/* empty */ { None }
|
|
|
|
| EQUAL seq_expr { Some $2 }
|
|
|
|
;
|
|
|
|
label_let_pattern:
|
2000-04-11 20:43:25 -07:00
|
|
|
label_var
|
1999-12-08 00:21:57 -08:00
|
|
|
{ $1 }
|
2000-04-11 20:43:25 -07:00
|
|
|
| label_var COLON core_type
|
1999-12-08 00:21:57 -08:00
|
|
|
{ let (lab, pat) = $1 in (lab, mkpat(Ppat_constraint(pat, $3))) }
|
|
|
|
;
|
2000-04-11 20:43:25 -07:00
|
|
|
label_var:
|
2012-05-30 07:52:37 -07:00
|
|
|
LIDENT { ($1, mkpat(Ppat_var (mkrhs $1 1))) }
|
1999-12-08 00:21:57 -08:00
|
|
|
;
|
2000-04-11 20:43:25 -07:00
|
|
|
let_pattern:
|
|
|
|
pattern
|
|
|
|
{ $1 }
|
|
|
|
| pattern COLON core_type
|
|
|
|
{ mkpat(Ppat_constraint($1, $3)) }
|
1999-11-30 08:07:38 -08:00
|
|
|
;
|
1995-05-04 03:15:53 -07:00
|
|
|
expr:
|
2002-02-05 09:11:33 -08:00
|
|
|
simple_expr %prec below_SHARP
|
1995-05-04 03:15:53 -07:00
|
|
|
{ $1 }
|
2002-02-05 09:11:33 -08:00
|
|
|
| simple_expr simple_labeled_expr_list
|
1995-05-04 03:15:53 -07:00
|
|
|
{ mkexp(Pexp_apply($1, List.rev $2)) }
|
2002-02-05 09:11:33 -08:00
|
|
|
| LET rec_flag let_bindings IN seq_expr
|
1995-05-04 03:15:53 -07:00
|
|
|
{ mkexp(Pexp_let($2, List.rev $3, $5)) }
|
2002-02-05 09:11:33 -08:00
|
|
|
| LET MODULE UIDENT module_binding IN seq_expr
|
2012-05-30 07:52:37 -07:00
|
|
|
{ mkexp(Pexp_letmodule(mkrhs $3 3, $4, $6)) }
|
2009-11-01 13:52:29 -08:00
|
|
|
| LET OPEN mod_longident IN seq_expr
|
2012-05-30 07:52:37 -07:00
|
|
|
{ mkexp(Pexp_open(mkrhs $3 3, $5)) }
|
2002-02-05 09:11:33 -08:00
|
|
|
| FUNCTION opt_bar match_cases
|
1999-11-30 08:07:38 -08:00
|
|
|
{ mkexp(Pexp_function("", None, List.rev $3)) }
|
2002-02-05 09:11:33 -08:00
|
|
|
| FUN labeled_simple_pattern fun_def
|
1999-11-30 08:07:38 -08:00
|
|
|
{ let (l,o,p) = $2 in mkexp(Pexp_function(l, o, [p, $3])) }
|
2009-10-20 00:06:43 -07:00
|
|
|
| FUN LPAREN TYPE LIDENT RPAREN fun_def
|
|
|
|
{ mkexp(Pexp_newtype($4, $6)) }
|
2002-02-05 09:11:33 -08:00
|
|
|
| MATCH seq_expr WITH opt_bar match_cases
|
1995-10-18 08:32:39 -07:00
|
|
|
{ mkexp(Pexp_match($2, List.rev $5)) }
|
2002-02-05 09:11:33 -08:00
|
|
|
| TRY seq_expr WITH opt_bar match_cases
|
1995-10-18 08:32:39 -07:00
|
|
|
{ mkexp(Pexp_try($2, List.rev $5)) }
|
2002-02-05 09:11:33 -08:00
|
|
|
| TRY seq_expr WITH error
|
1997-11-12 04:32:53 -08:00
|
|
|
{ syntax_error() }
|
2002-02-05 09:11:33 -08:00
|
|
|
| expr_comma_list %prec below_COMMA
|
1995-05-04 03:15:53 -07:00
|
|
|
{ mkexp(Pexp_tuple(List.rev $1)) }
|
2002-02-05 09:11:33 -08:00
|
|
|
| constr_longident simple_expr %prec below_SHARP
|
2012-05-30 07:52:37 -07:00
|
|
|
{ mkexp(Pexp_construct(mkrhs $1 1, Some $2, false)) }
|
2002-02-05 09:11:33 -08:00
|
|
|
| name_tag simple_expr %prec below_SHARP
|
1999-11-30 08:07:38 -08:00
|
|
|
{ mkexp(Pexp_variant($1, Some $2)) }
|
2002-02-05 09:11:33 -08:00
|
|
|
| IF seq_expr THEN expr ELSE expr
|
1995-05-04 03:15:53 -07:00
|
|
|
{ mkexp(Pexp_ifthenelse($2, $4, Some $6)) }
|
2002-02-05 09:11:33 -08:00
|
|
|
| IF seq_expr THEN expr
|
1995-05-04 03:15:53 -07:00
|
|
|
{ mkexp(Pexp_ifthenelse($2, $4, None)) }
|
1997-05-12 08:10:03 -07:00
|
|
|
| WHILE seq_expr DO seq_expr DONE
|
1995-05-04 03:15:53 -07:00
|
|
|
{ mkexp(Pexp_while($2, $4)) }
|
1997-05-12 08:10:03 -07:00
|
|
|
| FOR val_ident EQUAL seq_expr direction_flag seq_expr DO seq_expr DONE
|
2012-05-30 07:52:37 -07:00
|
|
|
{ mkexp(Pexp_for(mkrhs $2 2, $4, $6, $5, $8)) }
|
1995-05-04 03:15:53 -07:00
|
|
|
| expr COLONCOLON expr
|
2012-12-08 12:56:07 -08:00
|
|
|
{ mkexp_cons (rhs_loc 2) (ghexp(Pexp_tuple[$1;$3])) (symbol_rloc()) }
|
2005-02-16 06:38:02 -08:00
|
|
|
| LPAREN COLONCOLON RPAREN LPAREN expr COMMA expr RPAREN
|
2012-12-08 12:56:07 -08:00
|
|
|
{ mkexp_cons (rhs_loc 2) (ghexp(Pexp_tuple[$5;$7])) (symbol_rloc()) }
|
1996-04-30 07:53:58 -07:00
|
|
|
| expr INFIXOP0 expr
|
|
|
|
{ mkinfix $1 $2 $3 }
|
1995-05-04 03:15:53 -07:00
|
|
|
| expr INFIXOP1 expr
|
|
|
|
{ mkinfix $1 $2 $3 }
|
|
|
|
| expr INFIXOP2 expr
|
|
|
|
{ mkinfix $1 $2 $3 }
|
|
|
|
| expr INFIXOP3 expr
|
|
|
|
{ mkinfix $1 $2 $3 }
|
|
|
|
| expr INFIXOP4 expr
|
|
|
|
{ mkinfix $1 $2 $3 }
|
2000-09-07 03:57:32 -07:00
|
|
|
| expr PLUS expr
|
|
|
|
{ mkinfix $1 "+" $3 }
|
2009-12-07 08:40:39 -08:00
|
|
|
| expr PLUSDOT expr
|
|
|
|
{ mkinfix $1 "+." $3 }
|
2000-09-07 03:57:32 -07:00
|
|
|
| expr MINUS expr
|
|
|
|
{ mkinfix $1 "-" $3 }
|
|
|
|
| expr MINUSDOT expr
|
|
|
|
{ mkinfix $1 "-." $3 }
|
1995-05-04 03:15:53 -07:00
|
|
|
| expr STAR expr
|
2000-01-07 08:35:15 -08:00
|
|
|
{ mkinfix $1 "*" $3 }
|
1995-05-04 03:15:53 -07:00
|
|
|
| expr EQUAL expr
|
2000-01-07 08:35:15 -08:00
|
|
|
{ mkinfix $1 "=" $3 }
|
1996-04-30 07:53:58 -07:00
|
|
|
| expr LESS expr
|
2000-01-07 08:35:15 -08:00
|
|
|
{ mkinfix $1 "<" $3 }
|
1996-04-30 07:53:58 -07:00
|
|
|
| expr GREATER expr
|
2000-01-07 08:35:15 -08:00
|
|
|
{ mkinfix $1 ">" $3 }
|
1995-05-04 03:15:53 -07:00
|
|
|
| expr OR expr
|
|
|
|
{ mkinfix $1 "or" $3 }
|
1995-12-15 02:20:24 -08:00
|
|
|
| expr BARBAR expr
|
|
|
|
{ mkinfix $1 "||" $3 }
|
1995-05-04 03:15:53 -07:00
|
|
|
| expr AMPERSAND expr
|
|
|
|
{ mkinfix $1 "&" $3 }
|
1995-12-15 02:20:24 -08:00
|
|
|
| expr AMPERAMPER expr
|
|
|
|
{ mkinfix $1 "&&" $3 }
|
1995-05-04 03:15:53 -07:00
|
|
|
| expr COLONEQUAL expr
|
|
|
|
{ mkinfix $1 ":=" $3 }
|
2000-09-07 03:57:32 -07:00
|
|
|
| subtractive expr %prec prec_unary_minus
|
1995-05-04 03:15:53 -07:00
|
|
|
{ mkuminus $1 $2 }
|
2009-12-07 08:40:39 -08:00
|
|
|
| additive expr %prec prec_unary_plus
|
|
|
|
{ mkuplus $1 $2 }
|
1995-05-04 03:15:53 -07:00
|
|
|
| simple_expr DOT label_longident LESSMINUS expr
|
2012-05-30 07:52:37 -07:00
|
|
|
{ mkexp(Pexp_setfield($1, mkrhs $3 3, $5)) }
|
1997-05-12 08:10:03 -07:00
|
|
|
| simple_expr DOT LPAREN seq_expr RPAREN LESSMINUS expr
|
1999-09-08 10:42:36 -07:00
|
|
|
{ mkexp(Pexp_apply(ghexp(Pexp_ident(array_function "Array" "set")),
|
1999-11-30 08:07:38 -08:00
|
|
|
["",$1; "",$4; "",$7])) }
|
1997-05-12 08:10:03 -07:00
|
|
|
| simple_expr DOT LBRACKET seq_expr RBRACKET LESSMINUS expr
|
1999-09-08 10:42:36 -07:00
|
|
|
{ mkexp(Pexp_apply(ghexp(Pexp_ident(array_function "String" "set")),
|
1999-11-30 08:07:38 -08:00
|
|
|
["",$1; "",$4; "",$7])) }
|
2000-02-24 09:42:32 -08:00
|
|
|
| simple_expr DOT LBRACE expr RBRACE LESSMINUS expr
|
|
|
|
{ bigarray_set $1 $4 $7 }
|
1996-04-22 04:15:41 -07:00
|
|
|
| label LESSMINUS expr
|
2012-05-30 07:52:37 -07:00
|
|
|
{ mkexp(Pexp_setinstvar(mkrhs $1 1, $3)) }
|
2002-02-05 09:11:33 -08:00
|
|
|
| ASSERT simple_expr %prec below_SHARP
|
1997-05-13 11:28:25 -07:00
|
|
|
{ mkassert $2 }
|
2002-02-05 09:11:33 -08:00
|
|
|
| LAZY simple_expr %prec below_SHARP
|
2002-01-20 09:39:10 -08:00
|
|
|
{ mkexp (Pexp_lazy ($2)) }
|
2003-11-25 00:46:45 -08:00
|
|
|
| OBJECT class_structure END
|
|
|
|
{ mkexp (Pexp_object($2)) }
|
|
|
|
| OBJECT class_structure error
|
|
|
|
{ unclosed "object" 1 "end" 3 }
|
1995-05-04 03:15:53 -07:00
|
|
|
;
|
|
|
|
simple_expr:
|
|
|
|
val_longident
|
2012-05-30 07:52:37 -07:00
|
|
|
{ mkexp(Pexp_ident (mkrhs $1 1)) }
|
1995-05-04 03:15:53 -07:00
|
|
|
| constant
|
|
|
|
{ mkexp(Pexp_constant $1) }
|
2002-02-05 09:11:33 -08:00
|
|
|
| constr_longident %prec prec_constant_constructor
|
2012-05-30 07:52:37 -07:00
|
|
|
{ mkexp(Pexp_construct(mkrhs $1 1, None, false)) }
|
2002-02-05 09:11:33 -08:00
|
|
|
| name_tag %prec prec_constant_constructor
|
1999-11-30 08:07:38 -08:00
|
|
|
{ mkexp(Pexp_variant($1, None)) }
|
1997-05-12 08:10:03 -07:00
|
|
|
| LPAREN seq_expr RPAREN
|
2003-04-06 05:45:03 -07:00
|
|
|
{ reloc_exp $2 }
|
1997-08-22 01:55:41 -07:00
|
|
|
| LPAREN seq_expr error
|
|
|
|
{ unclosed "(" 1 ")" 3 }
|
1997-05-12 08:10:03 -07:00
|
|
|
| BEGIN seq_expr END
|
2003-04-06 05:45:03 -07:00
|
|
|
{ reloc_exp $2 }
|
2000-01-21 11:01:39 -08:00
|
|
|
| BEGIN END
|
2012-12-08 12:56:07 -08:00
|
|
|
{ mkexp (Pexp_construct (mkloc (Lident "()") (symbol_rloc ()),
|
|
|
|
None, false)) }
|
1997-08-22 01:55:41 -07:00
|
|
|
| BEGIN seq_expr error
|
|
|
|
{ unclosed "begin" 1 "end" 3 }
|
1997-05-12 08:10:03 -07:00
|
|
|
| LPAREN seq_expr type_constraint RPAREN
|
1996-04-22 04:15:41 -07:00
|
|
|
{ let (t, t') = $3 in mkexp(Pexp_constraint($2, t, t')) }
|
1995-05-04 03:15:53 -07:00
|
|
|
| simple_expr DOT label_longident
|
2012-05-30 07:52:37 -07:00
|
|
|
{ mkexp(Pexp_field($1, mkrhs $3 3)) }
|
2010-04-26 11:27:14 -07:00
|
|
|
| mod_longident DOT LPAREN seq_expr RPAREN
|
2012-05-30 07:52:37 -07:00
|
|
|
{ mkexp(Pexp_open(mkrhs $1 1, $4)) }
|
2010-04-26 11:27:14 -07:00
|
|
|
| mod_longident DOT LPAREN seq_expr error
|
|
|
|
{ unclosed "(" 3 ")" 5 }
|
1997-05-12 08:10:03 -07:00
|
|
|
| simple_expr DOT LPAREN seq_expr RPAREN
|
1999-09-08 10:42:36 -07:00
|
|
|
{ mkexp(Pexp_apply(ghexp(Pexp_ident(array_function "Array" "get")),
|
1999-11-30 08:07:38 -08:00
|
|
|
["",$1; "",$4])) }
|
1997-08-22 01:55:41 -07:00
|
|
|
| simple_expr DOT LPAREN seq_expr error
|
|
|
|
{ unclosed "(" 3 ")" 5 }
|
1997-05-12 08:10:03 -07:00
|
|
|
| simple_expr DOT LBRACKET seq_expr RBRACKET
|
1999-09-08 10:42:36 -07:00
|
|
|
{ mkexp(Pexp_apply(ghexp(Pexp_ident(array_function "String" "get")),
|
1999-11-30 08:07:38 -08:00
|
|
|
["",$1; "",$4])) }
|
1997-08-22 01:55:41 -07:00
|
|
|
| simple_expr DOT LBRACKET seq_expr error
|
|
|
|
{ unclosed "[" 3 "]" 5 }
|
2000-02-24 09:42:32 -08:00
|
|
|
| simple_expr DOT LBRACE expr RBRACE
|
|
|
|
{ bigarray_get $1 $4 }
|
|
|
|
| simple_expr DOT LBRACE expr_comma_list error
|
|
|
|
{ unclosed "{" 3 "}" 5 }
|
1998-04-27 08:17:11 -07:00
|
|
|
| LBRACE record_expr RBRACE
|
|
|
|
{ let (exten, fields) = $2 in mkexp(Pexp_record(fields, exten)) }
|
|
|
|
| LBRACE record_expr error
|
2004-05-19 05:15:19 -07:00
|
|
|
{ unclosed "{" 1 "}" 3 }
|
1997-05-13 07:45:28 -07:00
|
|
|
| LBRACKETBAR expr_semi_list opt_semi BARRBRACKET
|
1995-05-04 03:15:53 -07:00
|
|
|
{ mkexp(Pexp_array(List.rev $2)) }
|
1997-08-22 01:55:41 -07:00
|
|
|
| LBRACKETBAR expr_semi_list opt_semi error
|
|
|
|
{ unclosed "[|" 1 "|]" 4 }
|
1995-05-04 03:15:53 -07:00
|
|
|
| LBRACKETBAR BARRBRACKET
|
|
|
|
{ mkexp(Pexp_array []) }
|
1997-05-12 08:10:03 -07:00
|
|
|
| LBRACKET expr_semi_list opt_semi RBRACKET
|
2012-12-08 12:56:07 -08:00
|
|
|
{ reloc_exp (mktailexp (rhs_loc 4) (List.rev $2)) }
|
1997-08-22 01:55:41 -07:00
|
|
|
| LBRACKET expr_semi_list opt_semi error
|
|
|
|
{ unclosed "[" 1 "]" 4 }
|
1995-05-04 03:15:53 -07:00
|
|
|
| PREFIXOP simple_expr
|
1999-11-30 08:07:38 -08:00
|
|
|
{ mkexp(Pexp_apply(mkoperator $1 1, ["",$2])) }
|
2010-04-07 20:58:41 -07:00
|
|
|
| BANG simple_expr
|
|
|
|
{ mkexp(Pexp_apply(mkoperator "!" 1, ["",$2])) }
|
1996-04-22 04:15:41 -07:00
|
|
|
| NEW class_longident
|
2012-05-30 07:52:37 -07:00
|
|
|
{ mkexp(Pexp_new(mkrhs $2 2)) }
|
1998-04-27 08:17:11 -07:00
|
|
|
| LBRACELESS field_expr_list opt_semi GREATERRBRACE
|
1996-04-22 04:15:41 -07:00
|
|
|
{ mkexp(Pexp_override(List.rev $2)) }
|
1998-04-27 08:17:11 -07:00
|
|
|
| LBRACELESS field_expr_list opt_semi error
|
1997-08-22 01:55:41 -07:00
|
|
|
{ unclosed "{<" 1 ">}" 4 }
|
1996-04-22 04:15:41 -07:00
|
|
|
| LBRACELESS GREATERRBRACE
|
|
|
|
{ mkexp(Pexp_override []) }
|
1998-06-24 12:22:26 -07:00
|
|
|
| simple_expr SHARP label
|
|
|
|
{ mkexp(Pexp_send($1, $3)) }
|
2010-10-21 16:59:33 -07:00
|
|
|
| LPAREN MODULE module_expr RPAREN
|
|
|
|
{ mkexp (Pexp_pack $3) }
|
2010-04-06 02:15:57 -07:00
|
|
|
| LPAREN MODULE module_expr COLON package_type RPAREN
|
2010-10-21 16:59:33 -07:00
|
|
|
{ mkexp (Pexp_constraint (ghexp (Pexp_pack $3),
|
|
|
|
Some (ghtyp (Ptyp_package $5)), None)) }
|
2010-04-26 11:37:25 -07:00
|
|
|
| LPAREN MODULE module_expr COLON error
|
|
|
|
{ unclosed "(" 1 ")" 5 }
|
1996-04-22 04:15:41 -07:00
|
|
|
;
|
1999-11-30 08:07:38 -08:00
|
|
|
simple_labeled_expr_list:
|
|
|
|
labeled_simple_expr
|
|
|
|
{ [$1] }
|
|
|
|
| simple_labeled_expr_list labeled_simple_expr
|
|
|
|
{ $2 :: $1 }
|
|
|
|
;
|
|
|
|
labeled_simple_expr:
|
2002-02-05 09:11:33 -08:00
|
|
|
simple_expr %prec below_SHARP
|
1999-11-30 08:07:38 -08:00
|
|
|
{ ("", $1) }
|
|
|
|
| label_expr
|
|
|
|
{ $1 }
|
|
|
|
;
|
|
|
|
label_expr:
|
2002-02-05 09:11:33 -08:00
|
|
|
LABEL simple_expr %prec below_SHARP
|
1999-11-30 08:07:38 -08:00
|
|
|
{ ($1, $2) }
|
2000-04-11 20:43:25 -07:00
|
|
|
| TILDE label_ident
|
|
|
|
{ $2 }
|
|
|
|
| QUESTION label_ident
|
|
|
|
{ ("?" ^ fst $2, snd $2) }
|
2002-02-05 09:11:33 -08:00
|
|
|
| OPTLABEL simple_expr %prec below_SHARP
|
2000-04-11 20:43:25 -07:00
|
|
|
{ ("?" ^ $1, $2) }
|
|
|
|
;
|
|
|
|
label_ident:
|
2012-05-30 07:52:37 -07:00
|
|
|
LIDENT { ($1, mkexp(Pexp_ident(mkrhs (Lident $1) 1))) }
|
1999-11-30 08:07:38 -08:00
|
|
|
;
|
1995-05-04 03:15:53 -07:00
|
|
|
let_bindings:
|
|
|
|
let_binding { [$1] }
|
|
|
|
| let_bindings AND let_binding { $3 :: $1 }
|
|
|
|
;
|
2010-10-17 21:54:24 -07:00
|
|
|
|
|
|
|
lident_list:
|
2011-11-24 01:02:48 -08:00
|
|
|
LIDENT { [$1] }
|
2010-10-17 21:54:24 -07:00
|
|
|
| LIDENT lident_list { $1 :: $2 }
|
2011-11-24 01:02:48 -08:00
|
|
|
;
|
1995-05-04 03:15:53 -07:00
|
|
|
let_binding:
|
2011-12-14 00:59:07 -08:00
|
|
|
val_ident fun_binding
|
|
|
|
{ (mkpatvar $1 1, $2) }
|
|
|
|
| val_ident COLON typevar_list DOT core_type EQUAL seq_expr
|
2012-11-02 19:58:08 -07:00
|
|
|
{ (ghpat(Ppat_constraint(mkpatvar $1 1, ghtyp(Ptyp_poly(List.rev $3,$5)))), $7) }
|
2011-12-14 00:59:07 -08:00
|
|
|
| val_ident COLON TYPE lident_list DOT core_type EQUAL seq_expr
|
2011-11-24 01:02:48 -08:00
|
|
|
{ let exp, poly = wrap_type_annotation $4 $6 $8 in
|
2011-12-14 00:59:07 -08:00
|
|
|
(ghpat(Ppat_constraint(mkpatvar $1 1, poly)), exp) }
|
2002-02-05 09:11:33 -08:00
|
|
|
| pattern EQUAL seq_expr
|
1995-05-05 03:05:18 -07:00
|
|
|
{ ($1, $3) }
|
1995-05-04 03:15:53 -07:00
|
|
|
;
|
|
|
|
fun_binding:
|
2002-04-18 00:27:47 -07:00
|
|
|
strict_binding
|
|
|
|
{ $1 }
|
2002-02-05 09:11:33 -08:00
|
|
|
| type_constraint EQUAL seq_expr
|
2003-04-02 08:03:33 -08:00
|
|
|
{ let (t, t') = $1 in ghexp(Pexp_constraint($3, t, t')) }
|
2002-04-18 00:27:47 -07:00
|
|
|
;
|
|
|
|
strict_binding:
|
|
|
|
EQUAL seq_expr
|
|
|
|
{ $2 }
|
1999-11-30 08:07:38 -08:00
|
|
|
| labeled_simple_pattern fun_binding
|
2003-04-02 08:03:33 -08:00
|
|
|
{ let (l, o, p) = $1 in ghexp(Pexp_function(l, o, [p, $2])) }
|
2009-10-20 00:06:43 -07:00
|
|
|
| LPAREN TYPE LIDENT RPAREN fun_binding
|
|
|
|
{ mkexp(Pexp_newtype($3, $5)) }
|
1995-05-04 03:15:53 -07:00
|
|
|
;
|
|
|
|
match_cases:
|
|
|
|
pattern match_action { [$1, $2] }
|
|
|
|
| match_cases BAR pattern match_action { ($3, $4) :: $1 }
|
|
|
|
;
|
|
|
|
fun_def:
|
2000-01-07 08:35:15 -08:00
|
|
|
match_action { $1 }
|
1999-11-30 08:07:38 -08:00
|
|
|
| labeled_simple_pattern fun_def
|
2003-04-02 08:03:33 -08:00
|
|
|
{ let (l,o,p) = $1 in ghexp(Pexp_function(l, o, [p, $2])) }
|
2009-10-20 00:06:43 -07:00
|
|
|
| LPAREN TYPE LIDENT RPAREN fun_def
|
|
|
|
{ mkexp(Pexp_newtype($3, $5)) }
|
1995-05-04 03:15:53 -07:00
|
|
|
;
|
|
|
|
match_action:
|
1997-05-12 08:10:03 -07:00
|
|
|
MINUSGREATER seq_expr { $2 }
|
2012-12-13 04:48:51 -08:00
|
|
|
| WHEN seq_expr MINUSGREATER seq_expr { ghexp(Pexp_when($2, $4)) }
|
1995-05-04 03:15:53 -07:00
|
|
|
;
|
|
|
|
expr_comma_list:
|
|
|
|
expr_comma_list COMMA expr { $3 :: $1 }
|
|
|
|
| expr COMMA expr { [$3; $1] }
|
|
|
|
;
|
1998-04-27 08:17:11 -07:00
|
|
|
record_expr:
|
2012-06-21 10:00:46 -07:00
|
|
|
simple_expr WITH lbl_expr_list { (Some $1, $3) }
|
|
|
|
| lbl_expr_list { (None, $1) }
|
1998-04-27 08:17:11 -07:00
|
|
|
;
|
1995-05-04 03:15:53 -07:00
|
|
|
lbl_expr_list:
|
2012-06-21 10:00:46 -07:00
|
|
|
lbl_expr { [$1] }
|
|
|
|
| lbl_expr SEMI lbl_expr_list { $1 :: $3 }
|
|
|
|
| lbl_expr SEMI { [$1] }
|
|
|
|
;
|
|
|
|
lbl_expr:
|
2002-02-05 09:11:33 -08:00
|
|
|
label_longident EQUAL expr
|
2012-06-21 10:00:46 -07:00
|
|
|
{ (mkrhs $1 1,$3) }
|
2009-08-27 01:19:08 -07:00
|
|
|
| label_longident
|
2012-06-21 10:00:46 -07:00
|
|
|
{ (mkrhs $1 1, exp_of_label $1 1) }
|
1995-05-04 03:15:53 -07:00
|
|
|
;
|
1998-04-27 08:17:11 -07:00
|
|
|
field_expr_list:
|
2002-02-05 09:11:33 -08:00
|
|
|
label EQUAL expr
|
2012-05-30 07:52:37 -07:00
|
|
|
{ [mkrhs $1 1,$3] }
|
2002-02-05 09:11:33 -08:00
|
|
|
| field_expr_list SEMI label EQUAL expr
|
2012-05-30 07:52:37 -07:00
|
|
|
{ (mkrhs $3 3, $5) :: $1 }
|
1996-04-22 04:15:41 -07:00
|
|
|
;
|
1995-05-04 03:15:53 -07:00
|
|
|
expr_semi_list:
|
2002-02-05 09:11:33 -08:00
|
|
|
expr { [$1] }
|
|
|
|
| expr_semi_list SEMI expr { $3 :: $1 }
|
1995-05-04 03:15:53 -07:00
|
|
|
;
|
1996-04-22 04:15:41 -07:00
|
|
|
type_constraint:
|
1997-05-13 11:28:25 -07:00
|
|
|
COLON core_type { (Some $2, None) }
|
|
|
|
| COLON core_type COLONGREATER core_type { (Some $2, Some $4) }
|
|
|
|
| COLONGREATER core_type { (None, Some $2) }
|
1997-11-12 04:32:53 -08:00
|
|
|
| COLON error { syntax_error() }
|
|
|
|
| COLONGREATER error { syntax_error() }
|
1996-04-22 04:15:41 -07:00
|
|
|
;
|
1995-05-04 03:15:53 -07:00
|
|
|
|
|
|
|
/* Patterns */
|
|
|
|
|
|
|
|
pattern:
|
1995-09-11 01:09:22 -07:00
|
|
|
simple_pattern
|
|
|
|
{ $1 }
|
|
|
|
| pattern AS val_ident
|
2012-05-30 07:52:37 -07:00
|
|
|
{ mkpat(Ppat_alias($1, mkrhs $3 3)) }
|
2012-10-16 07:04:33 -07:00
|
|
|
| pattern AS error
|
|
|
|
{ expecting 3 "identifier" }
|
2002-02-05 09:11:33 -08:00
|
|
|
| pattern_comma_list %prec below_COMMA
|
1995-09-11 01:09:22 -07:00
|
|
|
{ mkpat(Ppat_tuple(List.rev $1)) }
|
|
|
|
| constr_longident pattern %prec prec_constr_appl
|
2012-05-30 07:52:37 -07:00
|
|
|
{ mkpat(Ppat_construct(mkrhs $1 1, Some $2, false)) }
|
1999-11-30 08:07:38 -08:00
|
|
|
| name_tag pattern %prec prec_constr_appl
|
|
|
|
{ mkpat(Ppat_variant($1, Some $2)) }
|
1995-09-11 01:09:22 -07:00
|
|
|
| pattern COLONCOLON pattern
|
2012-12-08 12:56:07 -08:00
|
|
|
{ mkpat_cons (rhs_loc 2) (ghpat(Ppat_tuple[$1;$3])) (symbol_rloc()) }
|
2012-10-16 07:04:33 -07:00
|
|
|
| pattern COLONCOLON error
|
|
|
|
{ expecting 3 "pattern" }
|
2005-02-16 06:38:02 -08:00
|
|
|
| LPAREN COLONCOLON RPAREN LPAREN pattern COMMA pattern RPAREN
|
2012-12-08 12:56:07 -08:00
|
|
|
{ mkpat_cons (rhs_loc 2) (ghpat(Ppat_tuple[$5;$7])) (symbol_rloc()) }
|
2012-10-16 07:04:33 -07:00
|
|
|
| LPAREN COLONCOLON RPAREN LPAREN pattern COMMA pattern error
|
|
|
|
{ unclosed "(" 4 ")" 8 }
|
1995-09-11 01:09:22 -07:00
|
|
|
| pattern BAR pattern
|
|
|
|
{ mkpat(Ppat_or($1, $3)) }
|
2012-10-16 07:04:33 -07:00
|
|
|
| pattern BAR error
|
|
|
|
{ expecting 3 "pattern" }
|
2008-07-09 06:03:38 -07:00
|
|
|
| LAZY simple_pattern
|
|
|
|
{ mkpat(Ppat_lazy $2) }
|
1995-09-11 01:09:22 -07:00
|
|
|
;
|
|
|
|
simple_pattern:
|
2002-02-05 09:11:33 -08:00
|
|
|
val_ident %prec below_EQUAL
|
2012-05-30 07:52:37 -07:00
|
|
|
{ mkpat(Ppat_var (mkrhs $1 1)) }
|
1995-05-04 03:15:53 -07:00
|
|
|
| UNDERSCORE
|
|
|
|
{ mkpat(Ppat_any) }
|
|
|
|
| signed_constant
|
|
|
|
{ mkpat(Ppat_constant $1) }
|
|
|
|
| CHAR DOTDOT CHAR
|
|
|
|
{ mkrangepat $1 $3 }
|
|
|
|
| constr_longident
|
2012-05-30 07:52:37 -07:00
|
|
|
{ mkpat(Ppat_construct(mkrhs $1 1, None, false)) }
|
1999-11-30 08:07:38 -08:00
|
|
|
| name_tag
|
|
|
|
{ mkpat(Ppat_variant($1, None)) }
|
2000-02-21 19:08:08 -08:00
|
|
|
| SHARP type_longident
|
2012-05-30 07:52:37 -07:00
|
|
|
{ mkpat(Ppat_type (mkrhs $2 2)) }
|
2012-06-21 10:07:19 -07:00
|
|
|
| LBRACE lbl_pattern_list RBRACE
|
|
|
|
{ let (fields, closed) = $2 in mkpat(Ppat_record(fields, closed)) }
|
|
|
|
| LBRACE lbl_pattern_list error
|
1997-08-22 01:55:41 -07:00
|
|
|
{ unclosed "{" 1 "}" 4 }
|
1997-05-12 08:10:03 -07:00
|
|
|
| LBRACKET pattern_semi_list opt_semi RBRACKET
|
2012-12-08 12:56:07 -08:00
|
|
|
{ reloc_pat (mktailpat (rhs_loc 4) (List.rev $2)) }
|
1997-08-22 01:55:41 -07:00
|
|
|
| LBRACKET pattern_semi_list opt_semi error
|
1998-04-06 02:16:54 -07:00
|
|
|
{ unclosed "[" 1 "]" 4 }
|
|
|
|
| LBRACKETBAR pattern_semi_list opt_semi BARRBRACKET
|
|
|
|
{ mkpat(Ppat_array(List.rev $2)) }
|
|
|
|
| LBRACKETBAR BARRBRACKET
|
|
|
|
{ mkpat(Ppat_array []) }
|
|
|
|
| LBRACKETBAR pattern_semi_list opt_semi error
|
|
|
|
{ unclosed "[|" 1 "|]" 4 }
|
1995-05-04 03:15:53 -07:00
|
|
|
| LPAREN pattern RPAREN
|
2003-04-06 05:45:03 -07:00
|
|
|
{ reloc_pat $2 }
|
1997-08-22 01:55:41 -07:00
|
|
|
| LPAREN pattern error
|
|
|
|
{ unclosed "(" 1 ")" 3 }
|
1995-05-04 03:15:53 -07:00
|
|
|
| LPAREN pattern COLON core_type RPAREN
|
|
|
|
{ mkpat(Ppat_constraint($2, $4)) }
|
1997-08-22 01:55:41 -07:00
|
|
|
| LPAREN pattern COLON core_type error
|
|
|
|
{ unclosed "(" 1 ")" 5 }
|
2012-10-16 07:04:33 -07:00
|
|
|
| LPAREN pattern COLON error
|
|
|
|
{ expecting 4 "type" }
|
2010-10-21 16:59:33 -07:00
|
|
|
| LPAREN MODULE UIDENT RPAREN
|
2012-05-30 07:52:37 -07:00
|
|
|
{ mkpat(Ppat_unpack (mkrhs $3 3)) }
|
2010-10-21 16:59:33 -07:00
|
|
|
| LPAREN MODULE UIDENT COLON package_type RPAREN
|
2012-05-30 07:52:37 -07:00
|
|
|
{ mkpat(Ppat_constraint(mkpat(Ppat_unpack (mkrhs $3 3)),ghtyp(Ptyp_package $5))) }
|
2010-10-21 16:59:33 -07:00
|
|
|
| LPAREN MODULE UIDENT COLON package_type error
|
|
|
|
{ unclosed "(" 1 ")" 6 }
|
1995-05-04 03:15:53 -07:00
|
|
|
;
|
1995-09-11 01:09:22 -07:00
|
|
|
|
1995-05-04 03:15:53 -07:00
|
|
|
pattern_comma_list:
|
|
|
|
pattern_comma_list COMMA pattern { $3 :: $1 }
|
|
|
|
| pattern COMMA pattern { [$3; $1] }
|
2012-10-16 07:04:33 -07:00
|
|
|
| pattern COMMA error { expecting 3 "pattern" }
|
1995-05-04 03:15:53 -07:00
|
|
|
;
|
|
|
|
pattern_semi_list:
|
|
|
|
pattern { [$1] }
|
|
|
|
| pattern_semi_list SEMI pattern { $3 :: $1 }
|
|
|
|
;
|
|
|
|
lbl_pattern_list:
|
2012-06-21 10:07:19 -07:00
|
|
|
lbl_pattern { [$1], Closed }
|
|
|
|
| lbl_pattern SEMI { [$1], Closed }
|
|
|
|
| lbl_pattern SEMI UNDERSCORE opt_semi { [$1], Open }
|
|
|
|
| lbl_pattern SEMI lbl_pattern_list { let (fields, closed) = $3 in $1 :: fields, closed }
|
|
|
|
;
|
|
|
|
lbl_pattern:
|
|
|
|
label_longident EQUAL pattern
|
|
|
|
{ (mkrhs $1 1,$3) }
|
|
|
|
| label_longident
|
|
|
|
{ (mkrhs $1 1, pat_of_label $1 1) }
|
2009-09-12 05:41:07 -07:00
|
|
|
;
|
2010-01-22 04:48:24 -08:00
|
|
|
|
1995-07-25 04:38:42 -07:00
|
|
|
/* Primitive declarations */
|
|
|
|
|
|
|
|
primitive_declaration:
|
|
|
|
STRING { [$1] }
|
|
|
|
| STRING primitive_declaration { $1 :: $2 }
|
|
|
|
;
|
|
|
|
|
1995-05-04 03:15:53 -07:00
|
|
|
/* Type declarations */
|
|
|
|
|
|
|
|
type_declarations:
|
|
|
|
type_declaration { [$1] }
|
|
|
|
| type_declarations AND type_declaration { $3 :: $1 }
|
|
|
|
;
|
2003-02-27 22:59:19 -08:00
|
|
|
|
1995-05-04 03:15:53 -07:00
|
|
|
type_declaration:
|
2010-09-20 22:30:25 -07:00
|
|
|
optional_type_parameters LIDENT type_kind constraints
|
2000-09-07 03:57:32 -07:00
|
|
|
{ let (params, variance) = List.split $1 in
|
2007-10-09 03:29:37 -07:00
|
|
|
let (kind, private_flag, manifest) = $3 in
|
2012-05-30 07:52:37 -07:00
|
|
|
(mkrhs $2 2, {ptype_params = params;
|
1997-02-20 12:39:02 -08:00
|
|
|
ptype_cstrs = List.rev $4;
|
1995-09-26 13:23:29 -07:00
|
|
|
ptype_kind = kind;
|
2007-10-09 03:29:37 -07:00
|
|
|
ptype_private = private_flag;
|
1995-09-26 13:23:29 -07:00
|
|
|
ptype_manifest = manifest;
|
2000-09-07 03:57:32 -07:00
|
|
|
ptype_variance = variance;
|
2011-10-28 14:21:55 -07:00
|
|
|
ptype_loc = symbol_rloc() }) }
|
1995-05-04 03:15:53 -07:00
|
|
|
;
|
1998-06-24 12:22:26 -07:00
|
|
|
constraints:
|
|
|
|
constraints CONSTRAINT constrain { $3 :: $1 }
|
|
|
|
| /* empty */ { [] }
|
|
|
|
;
|
1995-05-04 03:15:53 -07:00
|
|
|
type_kind:
|
|
|
|
/*empty*/
|
2007-10-09 03:29:37 -07:00
|
|
|
{ (Ptype_abstract, Public, None) }
|
2003-05-23 07:29:47 -07:00
|
|
|
| EQUAL core_type
|
2007-10-09 03:29:37 -07:00
|
|
|
{ (Ptype_abstract, Public, Some $2) }
|
2009-01-25 14:46:15 -08:00
|
|
|
| EQUAL PRIVATE core_type
|
|
|
|
{ (Ptype_abstract, Private, Some $3) }
|
2003-05-23 07:29:47 -07:00
|
|
|
| EQUAL constructor_declarations
|
2007-10-09 03:29:37 -07:00
|
|
|
{ (Ptype_variant(List.rev $2), Public, None) }
|
2003-05-23 07:29:47 -07:00
|
|
|
| EQUAL PRIVATE constructor_declarations
|
2007-10-09 03:29:37 -07:00
|
|
|
{ (Ptype_variant(List.rev $3), Private, None) }
|
2003-04-29 00:03:36 -07:00
|
|
|
| EQUAL private_flag BAR constructor_declarations
|
2007-10-09 03:29:37 -07:00
|
|
|
{ (Ptype_variant(List.rev $4), $2, None) }
|
2003-04-29 00:03:36 -07:00
|
|
|
| EQUAL private_flag LBRACE label_declarations opt_semi RBRACE
|
2007-10-09 03:29:37 -07:00
|
|
|
{ (Ptype_record(List.rev $4), $2, None) }
|
2003-05-23 07:29:47 -07:00
|
|
|
| EQUAL core_type EQUAL private_flag opt_bar constructor_declarations
|
2007-10-09 03:29:37 -07:00
|
|
|
{ (Ptype_variant(List.rev $6), $4, Some $2) }
|
2003-05-23 07:29:47 -07:00
|
|
|
| EQUAL core_type EQUAL private_flag LBRACE label_declarations opt_semi RBRACE
|
2007-10-09 03:29:37 -07:00
|
|
|
{ (Ptype_record(List.rev $6), $4, Some $2) }
|
1995-05-04 03:15:53 -07:00
|
|
|
;
|
2010-09-20 22:30:25 -07:00
|
|
|
optional_type_parameters:
|
|
|
|
/*empty*/ { [] }
|
|
|
|
| optional_type_parameter { [$1] }
|
|
|
|
| LPAREN optional_type_parameter_list RPAREN { List.rev $2 }
|
|
|
|
;
|
|
|
|
optional_type_parameter:
|
2012-05-30 07:52:37 -07:00
|
|
|
type_variance QUOTE ident { Some (mkrhs $3 3), $1 }
|
2010-11-07 23:53:23 -08:00
|
|
|
| type_variance UNDERSCORE { None, $1 }
|
2010-09-20 22:30:25 -07:00
|
|
|
;
|
|
|
|
optional_type_parameter_list:
|
|
|
|
optional_type_parameter { [$1] }
|
|
|
|
| optional_type_parameter_list COMMA optional_type_parameter { $3 :: $1 }
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
|
|
|
1995-05-04 03:15:53 -07:00
|
|
|
type_parameters:
|
|
|
|
/*empty*/ { [] }
|
|
|
|
| type_parameter { [$1] }
|
|
|
|
| LPAREN type_parameter_list RPAREN { List.rev $2 }
|
|
|
|
;
|
|
|
|
type_parameter:
|
2012-05-30 07:52:37 -07:00
|
|
|
type_variance QUOTE ident { mkrhs $3 3, $1 }
|
2000-09-07 03:57:32 -07:00
|
|
|
;
|
|
|
|
type_variance:
|
|
|
|
/* empty */ { false, false }
|
|
|
|
| PLUS { true, false }
|
|
|
|
| MINUS { false, true }
|
1995-05-04 03:15:53 -07:00
|
|
|
;
|
|
|
|
type_parameter_list:
|
|
|
|
type_parameter { [$1] }
|
|
|
|
| type_parameter_list COMMA type_parameter { $3 :: $1 }
|
|
|
|
;
|
|
|
|
constructor_declarations:
|
|
|
|
constructor_declaration { [$1] }
|
|
|
|
| constructor_declarations BAR constructor_declaration { $3 :: $1 }
|
|
|
|
;
|
|
|
|
constructor_declaration:
|
2010-12-03 09:20:18 -08:00
|
|
|
|
2011-11-29 07:49:25 -08:00
|
|
|
| constr_ident generalized_constructor_arguments
|
|
|
|
{ let arg_types,ret_type = $2 in
|
2012-07-30 11:04:46 -07:00
|
|
|
(mkrhs $1 1, arg_types,ret_type, symbol_rloc()) }
|
1995-05-04 03:15:53 -07:00
|
|
|
;
|
2010-09-12 22:28:30 -07:00
|
|
|
|
1995-05-04 03:15:53 -07:00
|
|
|
constructor_arguments:
|
|
|
|
/*empty*/ { [] }
|
|
|
|
| OF core_type_list { List.rev $2 }
|
|
|
|
;
|
2010-09-12 22:28:30 -07:00
|
|
|
|
|
|
|
generalized_constructor_arguments:
|
2010-12-03 09:20:18 -08:00
|
|
|
/*empty*/ { ([],None) }
|
|
|
|
| OF core_type_list { (List.rev $2,None) }
|
2011-11-29 07:49:25 -08:00
|
|
|
| COLON core_type_list MINUSGREATER simple_core_type
|
|
|
|
{ (List.rev $2,Some $4) }
|
|
|
|
| COLON simple_core_type { ([],Some $2) }
|
2010-09-12 22:28:30 -07:00
|
|
|
;
|
|
|
|
|
|
|
|
|
2010-12-03 09:20:18 -08:00
|
|
|
|
1995-05-04 03:15:53 -07:00
|
|
|
label_declarations:
|
|
|
|
label_declaration { [$1] }
|
|
|
|
| label_declarations SEMI label_declaration { $3 :: $1 }
|
|
|
|
;
|
|
|
|
label_declaration:
|
2012-05-30 07:52:37 -07:00
|
|
|
mutable_flag label COLON poly_type { (mkrhs $2 2, $1, $4, symbol_rloc()) }
|
1995-05-04 03:15:53 -07:00
|
|
|
;
|
|
|
|
|
1995-09-28 03:41:50 -07:00
|
|
|
/* "with" constraints (additional type equations over signature components) */
|
|
|
|
|
|
|
|
with_constraints:
|
|
|
|
with_constraint { [$1] }
|
|
|
|
| with_constraints AND with_constraint { $3 :: $1 }
|
|
|
|
;
|
|
|
|
with_constraint:
|
2005-03-22 19:08:37 -08:00
|
|
|
TYPE type_parameters label_longident with_type_binder core_type constraints
|
2000-09-07 03:57:32 -07:00
|
|
|
{ let params, variance = List.split $2 in
|
2012-05-30 07:52:37 -07:00
|
|
|
(mkrhs $3 3, Pwith_type {ptype_params = List.map (fun x -> Some x) params;
|
1997-02-20 12:39:02 -08:00
|
|
|
ptype_cstrs = List.rev $6;
|
2007-10-09 03:29:37 -07:00
|
|
|
ptype_kind = Ptype_abstract;
|
1995-10-01 06:39:43 -07:00
|
|
|
ptype_manifest = Some $5;
|
2007-10-09 03:29:37 -07:00
|
|
|
ptype_private = $4;
|
2000-09-07 03:57:32 -07:00
|
|
|
ptype_variance = variance;
|
1999-09-08 10:42:36 -07:00
|
|
|
ptype_loc = symbol_rloc()}) }
|
1995-09-28 03:41:50 -07:00
|
|
|
/* used label_longident instead of type_longident to disallow
|
|
|
|
functor applications in type path */
|
2010-04-17 07:45:12 -07:00
|
|
|
| TYPE type_parameters label_longident COLONEQUAL core_type
|
|
|
|
{ let params, variance = List.split $2 in
|
2012-05-30 07:52:37 -07:00
|
|
|
(mkrhs $3 3, Pwith_typesubst {ptype_params = List.map (fun x -> Some x) params;
|
2010-04-17 07:45:12 -07:00
|
|
|
ptype_cstrs = [];
|
|
|
|
ptype_kind = Ptype_abstract;
|
|
|
|
ptype_manifest = Some $5;
|
|
|
|
ptype_private = Public;
|
|
|
|
ptype_variance = variance;
|
|
|
|
ptype_loc = symbol_rloc()}) }
|
1995-10-01 06:39:43 -07:00
|
|
|
| MODULE mod_longident EQUAL mod_ext_longident
|
2012-05-30 07:52:37 -07:00
|
|
|
{ (mkrhs $2 2, Pwith_module (mkrhs $4 4)) }
|
2010-04-17 07:45:12 -07:00
|
|
|
| MODULE mod_longident COLONEQUAL mod_ext_longident
|
2012-05-30 07:52:37 -07:00
|
|
|
{ (mkrhs $2 2, Pwith_modsubst (mkrhs $4 4)) }
|
1995-09-28 03:41:50 -07:00
|
|
|
;
|
2005-03-22 19:08:37 -08:00
|
|
|
with_type_binder:
|
2007-10-09 03:29:37 -07:00
|
|
|
EQUAL { Public }
|
|
|
|
| EQUAL PRIVATE { Private }
|
2005-03-22 19:08:37 -08:00
|
|
|
;
|
1995-09-28 03:41:50 -07:00
|
|
|
|
2002-04-18 00:27:47 -07:00
|
|
|
/* Polymorphic types */
|
|
|
|
|
|
|
|
typevar_list:
|
2002-07-23 07:12:03 -07:00
|
|
|
QUOTE ident { [$2] }
|
|
|
|
| typevar_list QUOTE ident { $3 :: $1 }
|
2002-04-18 00:27:47 -07:00
|
|
|
;
|
|
|
|
poly_type:
|
2002-07-23 07:12:03 -07:00
|
|
|
core_type
|
|
|
|
{ mktyp(Ptyp_poly([], $1)) }
|
|
|
|
| typevar_list DOT core_type
|
|
|
|
{ mktyp(Ptyp_poly(List.rev $1, $3)) }
|
2002-04-18 00:27:47 -07:00
|
|
|
;
|
|
|
|
|
1995-05-04 03:15:53 -07:00
|
|
|
/* Core types */
|
|
|
|
|
|
|
|
core_type:
|
1999-11-30 08:07:38 -08:00
|
|
|
core_type2
|
1995-05-04 03:15:53 -07:00
|
|
|
{ $1 }
|
2000-09-07 03:57:32 -07:00
|
|
|
| core_type2 AS QUOTE ident
|
|
|
|
{ mktyp(Ptyp_alias($1, $4)) }
|
1995-05-04 03:15:53 -07:00
|
|
|
;
|
1999-11-30 08:07:38 -08:00
|
|
|
core_type2:
|
|
|
|
simple_core_type_or_tuple
|
|
|
|
{ $1 }
|
2001-09-25 02:54:18 -07:00
|
|
|
| QUESTION LIDENT COLON core_type2 MINUSGREATER core_type2
|
2012-05-30 07:52:37 -07:00
|
|
|
{ mktyp(Ptyp_arrow("?" ^ $2 , mkoption $4, $6)) }
|
2002-02-01 04:26:09 -08:00
|
|
|
| OPTLABEL core_type2 MINUSGREATER core_type2
|
2012-05-30 07:52:37 -07:00
|
|
|
{ mktyp(Ptyp_arrow("?" ^ $1 , mkoption $2, $4)) }
|
2002-02-01 04:26:09 -08:00
|
|
|
| LIDENT COLON core_type2 MINUSGREATER core_type2
|
2000-04-11 20:43:25 -07:00
|
|
|
{ mktyp(Ptyp_arrow($1, $3, $5)) }
|
2002-02-01 04:26:09 -08:00
|
|
|
| core_type2 MINUSGREATER core_type2
|
1999-11-30 08:07:38 -08:00
|
|
|
{ mktyp(Ptyp_arrow("", $1, $3)) }
|
|
|
|
;
|
1996-04-22 04:15:41 -07:00
|
|
|
|
1995-05-04 03:15:53 -07:00
|
|
|
simple_core_type:
|
2002-02-05 09:11:33 -08:00
|
|
|
simple_core_type2 %prec below_SHARP
|
2001-09-25 02:54:18 -07:00
|
|
|
{ $1 }
|
2002-02-05 09:11:33 -08:00
|
|
|
| LPAREN core_type_comma_list RPAREN %prec below_SHARP
|
2001-09-25 02:54:18 -07:00
|
|
|
{ match $2 with [sty] -> sty | _ -> raise Parse_error }
|
|
|
|
;
|
|
|
|
simple_core_type2:
|
1995-05-04 03:15:53 -07:00
|
|
|
QUOTE ident
|
|
|
|
{ mktyp(Ptyp_var $2) }
|
1997-02-11 10:24:47 -08:00
|
|
|
| UNDERSCORE
|
|
|
|
{ mktyp(Ptyp_any) }
|
1997-03-07 14:26:29 -08:00
|
|
|
| type_longident
|
2012-05-30 07:52:37 -07:00
|
|
|
{ mktyp(Ptyp_constr(mkrhs $1 1, [])) }
|
2002-02-05 09:11:33 -08:00
|
|
|
| simple_core_type2 type_longident
|
2012-05-30 07:52:37 -07:00
|
|
|
{ mktyp(Ptyp_constr(mkrhs $2 2, [$1])) }
|
2002-02-05 09:11:33 -08:00
|
|
|
| LPAREN core_type_comma_list RPAREN type_longident
|
2012-05-30 07:52:37 -07:00
|
|
|
{ mktyp(Ptyp_constr(mkrhs $4 4, List.rev $2)) }
|
1997-03-07 14:26:29 -08:00
|
|
|
| LESS meth_list GREATER
|
|
|
|
{ mktyp(Ptyp_object $2) }
|
|
|
|
| LESS GREATER
|
|
|
|
{ mktyp(Ptyp_object []) }
|
1999-11-30 08:07:38 -08:00
|
|
|
| SHARP class_longident opt_present
|
2012-05-30 07:52:37 -07:00
|
|
|
{ mktyp(Ptyp_class(mkrhs $2 2, [], $3)) }
|
2002-02-05 09:11:33 -08:00
|
|
|
| simple_core_type2 SHARP class_longident opt_present
|
2012-05-30 07:52:37 -07:00
|
|
|
{ mktyp(Ptyp_class(mkrhs $3 3, [$1], $4)) }
|
1999-11-30 08:07:38 -08:00
|
|
|
| LPAREN core_type_comma_list RPAREN SHARP class_longident opt_present
|
2012-05-30 07:52:37 -07:00
|
|
|
{ mktyp(Ptyp_class(mkrhs $5 5, List.rev $2, $6)) }
|
2001-09-25 02:54:18 -07:00
|
|
|
| LBRACKET tag_field RBRACKET
|
|
|
|
{ mktyp(Ptyp_variant([$2], true, None)) }
|
2006-04-16 16:28:22 -07:00
|
|
|
/* PR#3835: this is not LR(1), would need lookahead=2
|
|
|
|
| LBRACKET simple_core_type2 RBRACKET
|
|
|
|
{ mktyp(Ptyp_variant([$2], true, None)) }
|
|
|
|
*/
|
2001-09-25 02:54:18 -07:00
|
|
|
| LBRACKET BAR row_field_list RBRACKET
|
|
|
|
{ mktyp(Ptyp_variant(List.rev $3, true, None)) }
|
|
|
|
| LBRACKET row_field BAR row_field_list RBRACKET
|
|
|
|
{ mktyp(Ptyp_variant($2 :: List.rev $4, true, None)) }
|
2003-12-18 05:16:22 -08:00
|
|
|
| LBRACKETGREATER opt_bar row_field_list RBRACKET
|
|
|
|
{ mktyp(Ptyp_variant(List.rev $3, false, None)) }
|
|
|
|
| LBRACKETGREATER RBRACKET
|
2003-03-12 05:39:36 -08:00
|
|
|
{ mktyp(Ptyp_variant([], false, None)) }
|
2000-06-11 07:34:10 -07:00
|
|
|
| LBRACKETLESS opt_bar row_field_list RBRACKET
|
2001-09-25 02:54:18 -07:00
|
|
|
{ mktyp(Ptyp_variant(List.rev $3, true, Some [])) }
|
2000-06-11 07:34:10 -07:00
|
|
|
| LBRACKETLESS opt_bar row_field_list GREATER name_tag_list RBRACKET
|
2001-09-25 02:54:18 -07:00
|
|
|
{ mktyp(Ptyp_variant(List.rev $3, true, Some (List.rev $5))) }
|
2009-10-26 03:53:16 -07:00
|
|
|
| LPAREN MODULE package_type RPAREN
|
|
|
|
{ mktyp(Ptyp_package $3) }
|
|
|
|
;
|
|
|
|
package_type:
|
2012-05-30 07:52:37 -07:00
|
|
|
mty_longident { (mkrhs $1 1, []) }
|
|
|
|
| mty_longident WITH package_type_cstrs { (mkrhs $1 1, $3) }
|
2011-07-20 02:17:07 -07:00
|
|
|
;
|
2009-10-26 03:53:16 -07:00
|
|
|
package_type_cstr:
|
2012-05-30 07:52:37 -07:00
|
|
|
TYPE label_longident EQUAL core_type { (mkrhs $2 2, $4) }
|
2009-10-26 03:53:16 -07:00
|
|
|
;
|
|
|
|
package_type_cstrs:
|
|
|
|
package_type_cstr { [$1] }
|
|
|
|
| package_type_cstr AND package_type_cstrs { $1::$3 }
|
1999-11-30 08:07:38 -08:00
|
|
|
;
|
|
|
|
row_field_list:
|
2000-01-07 08:35:15 -08:00
|
|
|
row_field { [$1] }
|
|
|
|
| row_field_list BAR row_field { $3 :: $1 }
|
1999-11-30 08:07:38 -08:00
|
|
|
;
|
|
|
|
row_field:
|
2001-09-25 02:54:18 -07:00
|
|
|
tag_field { $1 }
|
|
|
|
| simple_core_type2 { Rinherit $1 }
|
|
|
|
;
|
|
|
|
tag_field:
|
|
|
|
name_tag OF opt_ampersand amper_type_list
|
|
|
|
{ Rtag ($1, $3, List.rev $4) }
|
|
|
|
| name_tag
|
|
|
|
{ Rtag ($1, true, []) }
|
1999-11-30 08:07:38 -08:00
|
|
|
;
|
|
|
|
opt_ampersand:
|
2000-01-07 08:35:15 -08:00
|
|
|
AMPERSAND { true }
|
|
|
|
| /* empty */ { false }
|
1999-11-30 08:07:38 -08:00
|
|
|
;
|
|
|
|
amper_type_list:
|
2000-01-07 08:35:15 -08:00
|
|
|
core_type { [$1] }
|
|
|
|
| amper_type_list AMPERSAND core_type { $3 :: $1 }
|
1999-11-30 08:07:38 -08:00
|
|
|
;
|
|
|
|
opt_present:
|
2003-12-18 05:16:22 -08:00
|
|
|
LBRACKETGREATER name_tag_list RBRACKET { List.rev $2 }
|
2000-01-07 08:35:15 -08:00
|
|
|
| /* empty */ { [] }
|
1999-11-30 08:07:38 -08:00
|
|
|
;
|
|
|
|
name_tag_list:
|
2000-01-07 08:35:15 -08:00
|
|
|
name_tag { [$1] }
|
|
|
|
| name_tag_list name_tag { $2 :: $1 }
|
1996-04-22 04:15:41 -07:00
|
|
|
;
|
1999-11-30 08:07:38 -08:00
|
|
|
simple_core_type_or_tuple:
|
2001-09-25 02:54:18 -07:00
|
|
|
simple_core_type { $1 }
|
|
|
|
| simple_core_type STAR core_type_list
|
|
|
|
{ mktyp(Ptyp_tuple($1 :: List.rev $3)) }
|
1999-11-30 08:07:38 -08:00
|
|
|
;
|
1995-05-04 03:15:53 -07:00
|
|
|
core_type_comma_list:
|
2001-09-25 02:54:18 -07:00
|
|
|
core_type { [$1] }
|
1995-05-04 03:15:53 -07:00
|
|
|
| core_type_comma_list COMMA core_type { $3 :: $1 }
|
|
|
|
;
|
|
|
|
core_type_list:
|
|
|
|
simple_core_type { [$1] }
|
|
|
|
| core_type_list STAR simple_core_type { $3 :: $1 }
|
|
|
|
;
|
1996-04-22 04:15:41 -07:00
|
|
|
meth_list:
|
1997-05-13 07:45:28 -07:00
|
|
|
field SEMI meth_list { $1 :: $3 }
|
|
|
|
| field opt_semi { [$1] }
|
|
|
|
| DOTDOT { [mkfield Pfield_var] }
|
1996-04-22 04:15:41 -07:00
|
|
|
;
|
|
|
|
field:
|
2002-04-18 00:27:47 -07:00
|
|
|
label COLON poly_type { mkfield(Pfield($1, $3)) }
|
1996-04-22 04:15:41 -07:00
|
|
|
;
|
|
|
|
label:
|
1997-05-13 07:45:28 -07:00
|
|
|
LIDENT { $1 }
|
1996-04-22 04:15:41 -07:00
|
|
|
;
|
1995-05-04 03:15:53 -07:00
|
|
|
|
|
|
|
/* Constants */
|
|
|
|
|
|
|
|
constant:
|
|
|
|
INT { Const_int $1 }
|
|
|
|
| CHAR { Const_char $1 }
|
|
|
|
| STRING { Const_string $1 }
|
|
|
|
| FLOAT { Const_float $1 }
|
2003-04-25 05:27:31 -07:00
|
|
|
| INT32 { Const_int32 $1 }
|
|
|
|
| INT64 { Const_int64 $1 }
|
|
|
|
| NATIVEINT { Const_nativeint $1 }
|
1995-05-04 03:15:53 -07:00
|
|
|
;
|
|
|
|
signed_constant:
|
|
|
|
constant { $1 }
|
2000-09-07 03:57:32 -07:00
|
|
|
| MINUS INT { Const_int(- $2) }
|
2003-04-25 05:27:31 -07:00
|
|
|
| MINUS FLOAT { Const_float("-" ^ $2) }
|
|
|
|
| MINUS INT32 { Const_int32(Int32.neg $2) }
|
|
|
|
| MINUS INT64 { Const_int64(Int64.neg $2) }
|
|
|
|
| MINUS NATIVEINT { Const_nativeint(Nativeint.neg $2) }
|
2009-12-01 01:57:02 -08:00
|
|
|
| PLUS INT { Const_int $2 }
|
|
|
|
| PLUS FLOAT { Const_float $2 }
|
|
|
|
| PLUS INT32 { Const_int32 $2 }
|
|
|
|
| PLUS INT64 { Const_int64 $2 }
|
|
|
|
| PLUS NATIVEINT { Const_nativeint $2 }
|
1995-05-04 03:15:53 -07:00
|
|
|
;
|
2009-12-01 01:57:02 -08:00
|
|
|
|
1995-05-04 03:15:53 -07:00
|
|
|
/* Identifiers and long identifiers */
|
|
|
|
|
|
|
|
ident:
|
|
|
|
UIDENT { $1 }
|
|
|
|
| LIDENT { $1 }
|
|
|
|
;
|
|
|
|
val_ident:
|
|
|
|
LIDENT { $1 }
|
|
|
|
| LPAREN operator RPAREN { $2 }
|
2012-10-16 07:04:33 -07:00
|
|
|
| LPAREN operator error { unclosed "(" 1 ")" 3 }
|
|
|
|
| LPAREN error { expecting 2 "operator" }
|
1995-05-04 03:15:53 -07:00
|
|
|
;
|
|
|
|
operator:
|
|
|
|
PREFIXOP { $1 }
|
1996-04-30 07:53:58 -07:00
|
|
|
| INFIXOP0 { $1 }
|
1995-05-04 03:15:53 -07:00
|
|
|
| INFIXOP1 { $1 }
|
|
|
|
| INFIXOP2 { $1 }
|
|
|
|
| INFIXOP3 { $1 }
|
|
|
|
| INFIXOP4 { $1 }
|
2010-04-07 20:58:41 -07:00
|
|
|
| BANG { "!" }
|
2000-09-07 03:57:32 -07:00
|
|
|
| PLUS { "+" }
|
2009-12-07 08:40:39 -08:00
|
|
|
| PLUSDOT { "+." }
|
2000-09-07 03:57:32 -07:00
|
|
|
| MINUS { "-" }
|
|
|
|
| MINUSDOT { "-." }
|
1995-05-04 03:15:53 -07:00
|
|
|
| STAR { "*" }
|
|
|
|
| EQUAL { "=" }
|
1996-04-30 07:53:58 -07:00
|
|
|
| LESS { "<" }
|
|
|
|
| GREATER { ">" }
|
1995-05-04 03:15:53 -07:00
|
|
|
| OR { "or" }
|
1995-12-15 02:20:24 -08:00
|
|
|
| BARBAR { "||" }
|
1995-05-04 03:15:53 -07:00
|
|
|
| AMPERSAND { "&" }
|
1995-12-15 02:20:24 -08:00
|
|
|
| AMPERAMPER { "&&" }
|
1995-05-04 03:15:53 -07:00
|
|
|
| COLONEQUAL { ":=" }
|
|
|
|
;
|
|
|
|
constr_ident:
|
|
|
|
UIDENT { $1 }
|
1999-12-06 09:16:59 -08:00
|
|
|
/* | LBRACKET RBRACKET { "[]" } */
|
1995-05-04 03:15:53 -07:00
|
|
|
| LPAREN RPAREN { "()" }
|
|
|
|
| COLONCOLON { "::" }
|
2005-02-16 06:38:02 -08:00
|
|
|
/* | LPAREN COLONCOLON RPAREN { "::" } */
|
1995-05-04 03:15:53 -07:00
|
|
|
| FALSE { "false" }
|
|
|
|
| TRUE { "true" }
|
|
|
|
;
|
2000-01-07 08:35:15 -08:00
|
|
|
|
1995-05-04 03:15:53 -07:00
|
|
|
val_longident:
|
|
|
|
val_ident { Lident $1 }
|
|
|
|
| mod_longident DOT val_ident { Ldot($1, $3) }
|
|
|
|
;
|
|
|
|
constr_longident:
|
2002-02-05 09:11:33 -08:00
|
|
|
mod_longident %prec below_DOT { $1 }
|
1995-05-04 03:15:53 -07:00
|
|
|
| LBRACKET RBRACKET { Lident "[]" }
|
|
|
|
| LPAREN RPAREN { Lident "()" }
|
|
|
|
| FALSE { Lident "false" }
|
|
|
|
| TRUE { Lident "true" }
|
|
|
|
;
|
|
|
|
label_longident:
|
|
|
|
LIDENT { Lident $1 }
|
|
|
|
| mod_longident DOT LIDENT { Ldot($1, $3) }
|
|
|
|
;
|
|
|
|
type_longident:
|
|
|
|
LIDENT { Lident $1 }
|
1995-08-23 04:55:54 -07:00
|
|
|
| mod_ext_longident DOT LIDENT { Ldot($1, $3) }
|
1995-05-04 03:15:53 -07:00
|
|
|
;
|
|
|
|
mod_longident:
|
|
|
|
UIDENT { Lident $1 }
|
|
|
|
| mod_longident DOT UIDENT { Ldot($1, $3) }
|
|
|
|
;
|
1995-08-23 04:55:54 -07:00
|
|
|
mod_ext_longident:
|
|
|
|
UIDENT { Lident $1 }
|
|
|
|
| mod_ext_longident DOT UIDENT { Ldot($1, $3) }
|
2009-07-15 07:06:37 -07:00
|
|
|
| mod_ext_longident LPAREN mod_ext_longident RPAREN { lapply $1 $3 }
|
1995-08-23 04:55:54 -07:00
|
|
|
;
|
1995-05-04 03:15:53 -07:00
|
|
|
mty_longident:
|
|
|
|
ident { Lident $1 }
|
1995-08-23 04:55:54 -07:00
|
|
|
| mod_ext_longident DOT ident { Ldot($1, $3) }
|
1996-04-22 04:15:41 -07:00
|
|
|
;
|
1998-06-24 12:22:26 -07:00
|
|
|
clty_longident:
|
|
|
|
LIDENT { Lident $1 }
|
|
|
|
| mod_ext_longident DOT LIDENT { Ldot($1, $3) }
|
|
|
|
;
|
1996-04-22 04:15:41 -07:00
|
|
|
class_longident:
|
|
|
|
LIDENT { Lident $1 }
|
1997-05-11 14:48:21 -07:00
|
|
|
| mod_longident DOT LIDENT { Ldot($1, $3) }
|
1996-04-22 04:15:41 -07:00
|
|
|
;
|
2012-05-30 07:52:37 -07:00
|
|
|
any_longident:
|
|
|
|
val_ident { Lident $1 }
|
|
|
|
| mod_ext_longident DOT val_ident { Ldot ($1, $3) }
|
|
|
|
| mod_ext_longident { $1 }
|
|
|
|
| LBRACKET RBRACKET { Lident "[]" }
|
|
|
|
| LPAREN RPAREN { Lident "()" }
|
|
|
|
| FALSE { Lident "false" }
|
|
|
|
| TRUE { Lident "true" }
|
2012-09-10 03:32:49 -07:00
|
|
|
;
|
1995-05-04 03:15:53 -07:00
|
|
|
|
1995-11-01 10:12:24 -08:00
|
|
|
/* Toplevel directives */
|
|
|
|
|
|
|
|
toplevel_directive:
|
|
|
|
SHARP ident { Ptop_dir($2, Pdir_none) }
|
|
|
|
| SHARP ident STRING { Ptop_dir($2, Pdir_string $3) }
|
|
|
|
| SHARP ident INT { Ptop_dir($2, Pdir_int $3) }
|
|
|
|
| SHARP ident val_longident { Ptop_dir($2, Pdir_ident $3) }
|
1999-12-03 02:26:08 -08:00
|
|
|
| SHARP ident FALSE { Ptop_dir($2, Pdir_bool false) }
|
|
|
|
| SHARP ident TRUE { Ptop_dir($2, Pdir_bool true) }
|
1995-11-01 10:12:24 -08:00
|
|
|
;
|
|
|
|
|
1995-05-04 03:15:53 -07:00
|
|
|
/* Miscellaneous */
|
|
|
|
|
1999-11-30 08:07:38 -08:00
|
|
|
name_tag:
|
2000-01-07 08:35:15 -08:00
|
|
|
BACKQUOTE ident { $2 }
|
1999-11-30 08:07:38 -08:00
|
|
|
;
|
1995-05-04 03:15:53 -07:00
|
|
|
rec_flag:
|
|
|
|
/* empty */ { Nonrecursive }
|
|
|
|
| REC { Recursive }
|
|
|
|
;
|
|
|
|
direction_flag:
|
|
|
|
TO { Upto }
|
|
|
|
| DOWNTO { Downto }
|
|
|
|
;
|
1996-04-22 04:15:41 -07:00
|
|
|
private_flag:
|
1997-05-11 14:48:21 -07:00
|
|
|
/* empty */ { Public }
|
|
|
|
| PRIVATE { Private }
|
1996-04-22 04:15:41 -07:00
|
|
|
;
|
1995-05-04 03:15:53 -07:00
|
|
|
mutable_flag:
|
|
|
|
/* empty */ { Immutable }
|
|
|
|
| MUTABLE { Mutable }
|
|
|
|
;
|
1996-04-22 04:15:41 -07:00
|
|
|
virtual_flag:
|
1997-05-11 14:48:21 -07:00
|
|
|
/* empty */ { Concrete }
|
|
|
|
| VIRTUAL { Virtual }
|
1996-04-22 04:15:41 -07:00
|
|
|
;
|
2010-04-07 20:58:41 -07:00
|
|
|
override_flag:
|
|
|
|
/* empty */ { Fresh }
|
|
|
|
| BANG { Override }
|
|
|
|
;
|
1995-10-18 08:32:39 -07:00
|
|
|
opt_bar:
|
1997-05-11 14:48:21 -07:00
|
|
|
/* empty */ { () }
|
|
|
|
| BAR { () }
|
1996-04-22 04:15:41 -07:00
|
|
|
;
|
1997-05-12 08:10:03 -07:00
|
|
|
opt_semi:
|
|
|
|
| /* empty */ { () }
|
|
|
|
| SEMI { () }
|
|
|
|
;
|
2000-09-07 03:57:32 -07:00
|
|
|
subtractive:
|
2001-07-12 05:54:24 -07:00
|
|
|
| MINUS { "-" }
|
2000-09-07 03:57:32 -07:00
|
|
|
| MINUSDOT { "-." }
|
|
|
|
;
|
2009-12-07 08:40:39 -08:00
|
|
|
additive:
|
|
|
|
| PLUS { "+" }
|
|
|
|
| PLUSDOT { "+." }
|
|
|
|
;
|
1995-05-04 03:15:53 -07:00
|
|
|
%%
|