diff options
| author | herbelin | 1999-12-11 01:25:22 +0000 |
|---|---|---|
| committer | herbelin | 1999-12-11 01:25:22 +0000 |
| commit | 20445e418ffee0c0dc1398c80af4a2b75abe9ac3 (patch) | |
| tree | c019077ca3898406ef9f251b26dba4ec06d24d2d /parsing | |
| parent | d73ae1a52442841ec8c067de7048db977b299a85 (diff) | |
Intégration initiale du Cases
git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/coq/trunk@234 85f007b7-540e-0410-9357-904b9bb8a0f7
Diffstat (limited to 'parsing')
| -rwxr-xr-x | parsing/ast.ml | 9 | ||||
| -rwxr-xr-x | parsing/ast.mli | 1 | ||||
| -rw-r--r-- | parsing/astterm.ml | 41 | ||||
| -rw-r--r-- | parsing/g_cases.ml4 | 19 | ||||
| -rw-r--r-- | parsing/pretty.ml | 4 | ||||
| -rw-r--r-- | parsing/termast.ml | 10 |
6 files changed, 58 insertions, 26 deletions
diff --git a/parsing/ast.ml b/parsing/ast.ml index f0fed61983..e7c6cb23c7 100755 --- a/parsing/ast.ml +++ b/parsing/ast.ml @@ -322,6 +322,15 @@ let rec occur_var_ast s = function | Id _ | Str _ | Num _ | Path _ -> false | Dynamic _ -> (* Hum... what to do here *) false +let rec replace_var_ast s1 s2 = function + | Node(loc,op,args) -> Node (loc,op, List.map (replace_var_ast s1 s2) args) + | Nvar(loc,s) as a -> if s = s1 then Nvar (loc,s2) else a + | Slam(loc,None,body) -> Slam(loc,None,replace_var_ast s1 s2 body) + | Slam(loc,Some s,body) as a -> if s=s1 then a else + Slam(loc,Some s,replace_var_ast s1 s2 body) + | Id _ | Str _ | Num _ | Path _ as a -> a + | Dynamic _ as a -> (* Hum... what to do here *) a + exception No_match of string let no_match_loc (loc,s) = Stdpp.raise_with_loc loc (No_match s) diff --git a/parsing/ast.mli b/parsing/ast.mli index 4dacd24536..f40bc78b97 100755 --- a/parsing/ast.mli +++ b/parsing/ast.mli @@ -90,6 +90,7 @@ val alpha_eq : Coqast.t * Coqast.t -> bool val alpha_eq_val : v * v -> bool val occur_var_ast : string -> Coqast.t -> bool +val replace_var_ast : string -> string -> Coqast.t -> Coqast.t val bind_env : env -> string -> v -> env val ast_match : env -> pat -> Coqast.t -> env diff --git a/parsing/astterm.ml b/parsing/astterm.ml index 1e7b897ad7..68cd5482d9 100644 --- a/parsing/astterm.ml +++ b/parsing/astterm.ml @@ -156,24 +156,38 @@ let destruct_binder = function | Node(_,"BINDER",c::idl) -> List.map (fun id -> (id_of_string (nvar_of_ast id),c)) idl | _ -> anomaly "BINDER is expected" - -let rec dbize_pattern env = function + +let merge_aliases p = function + | a, Anonymous -> a, p + | Anonymous, a -> a, p + | Name id1, (Name id2 as na) -> + let s1 = string_of_id id1 in + let s2 = string_of_id id2 in + warning ("Alias variable "^s1^" is merged with "^s2); + na, replace_var_ast s1 s2 p + +let rec dbize_pattern env aliasopt = function | Node(_,"PATTAS",[Nvar (loc,s); p]) -> - (match name_of_nvar s with - | Anonymous -> dbize_pattern env p - | Name id -> - let (ids,p') = dbize_pattern env p in (id::ids,PatAs (loc,id,p'))) + let aliasopt',p' = merge_aliases p (aliasopt,name_of_nvar s) in + dbize_pattern env aliasopt' p' + | Nvar(loc,s) -> + (match maybe_constructor env s with + | Some c -> + let ids = match aliasopt with Anonymous -> [] | Name id -> [id] in + (ids,PatCstr (loc,c,[],aliasopt)) + | None -> + (match name_of_nvar s with + | Anonymous -> ([], PatVar (loc,Anonymous)) + | Name id as name -> ([id], PatVar (loc,name)))) | Node(_,"PATTCONSTRUCT", Nvar(loc,s)::((_::_) as pl)) -> (match maybe_constructor env s with | Some c -> - let (idsl,pl') = List.split (List.map (dbize_pattern env) pl) in - (List.flatten idsl,PatCstr (loc,c,pl')) + let ids = match aliasopt with Anonymous -> [] | Name id -> [id] in + let (idsl,pl') = + List.split (List.map (dbize_pattern env Anonymous) pl) in + (List.flatten (ids::idsl),PatCstr (loc,c,pl',aliasopt)) | None -> user_err_loc (loc,"dbize_pattern",mssg_hd_is_not_constructor s)) - | Nvar(loc,s) -> - (match name_of_nvar s with - | Anonymous -> ([], PatVar (loc,Anonymous)) - | Name id as name -> ([id], PatVar (loc,name))) | _ -> anomaly "dbize: badly-formed ast for Cases pattern" let rec dbize_fix = function @@ -309,7 +323,8 @@ let dbize k sigma = and dbize_eqn n env = function | Node(loc,"EQN",rhs::lhs) -> - let (idsl,pl) = List.split (List.map (dbize_pattern env) lhs) in + let (idsl,pl) = + List.split (List.map (dbize_pattern env Anonymous) lhs) in let ids = List.flatten idsl in (* Linearity implies the order in ids is irrelevant *) check_linearity loc ids; diff --git a/parsing/g_cases.ml4 b/parsing/g_cases.ml4 index 0b45dd3e47..a6dcbffe71 100644 --- a/parsing/g_cases.ml4 +++ b/parsing/g_cases.ml4 @@ -9,10 +9,12 @@ GEXTEND Gram [ [ -> [] | p = pattern; pl = pattern_list -> p :: pl ] ] ; +(* lsimple_pattern: [ [ c = simple_pattern2 -> c ] ] ; - simple_pattern: +*) + pattern: [ [ id = ident -> id | "("; p = lsimple_pattern; ")" -> p ] ] ; @@ -21,18 +23,19 @@ GEXTEND Gram | p = simple_pattern; pl = simple_pattern_list -> p :: pl ] ] ; - (* The XTRA"!" means we want to override the implicit arg mecanism of bdize, - since params are not given in patterns *) - simple_pattern2: - [ [ p = simple_pattern; lp = pattern_list -> - <:ast< (PATTCONSTRUCT $p ($LIST $lp)) >> - | p = simple_pattern; "as"; id = ident -> <:ast< (PATTAS $id $p) >> + lsimple_pattern: + [ [ id = ident; lp = ne_pattern_list -> + <:ast< (PATTCONSTRUCT $id ($LIST $lp)) >> + | p = pattern; "as"; id = ident -> <:ast< (PATTAS $id $p)>> | c1 = simple_pattern; ","; c2 = simple_pattern -> - <:ast< (PATTCONSTRUCT pair $c1 $c2) >> ] ] + <:ast< (PATTCONSTRUCT pair $c1 $c2) >> + | "("; p = lsimple_pattern; ")" -> p ] ] ; +(* pattern: [ [ p = simple_pattern -> p ] ] ; +*) ne_pattern_list: [ [ c1 = pattern; cl = ne_pattern_list -> c1 :: cl | c1 = pattern -> [c1] ] ] diff --git a/parsing/pretty.ml b/parsing/pretty.ml index 848a2132ec..e0277761d0 100644 --- a/parsing/pretty.ml +++ b/parsing/pretty.ml @@ -452,8 +452,8 @@ let print_opaque_name name = anomaly "print_opaque_name" | DOPN(MutInd (sp,_),_) as x -> print_mutual sp (Global.lookup_mind sp) - | DOPN(MutConstruct _,_) as x -> - let ty = Typeops.type_of_constructor env sigma x in + | DOPN(MutConstruct cstr_sp,a) as x -> + let ty = Typeops.type_of_constructor env sigma (cstr_sp,a) in print_typed_value(x, ty) | VAR id -> let a = snd(lookup_sign id sign) in diff --git a/parsing/termast.ml b/parsing/termast.ml index bbc9e368cc..cfe85f7fda 100644 --- a/parsing/termast.ml +++ b/parsing/termast.ml @@ -68,10 +68,14 @@ let ast_of_ref = function let rec ast_of_pattern = function (* loc is thrown away for printing *) | PatVar (loc,Name id) -> nvar (string_of_id id) | PatVar (loc,Anonymous) -> nvar "_" - | PatCstr(loc,cstr,args) -> + | PatCstr(loc,cstr,args,Name id) -> + ope("PATTAS", + [nvar (string_of_id id); + ope("PATTCONSTRUCT", + (ast_of_constructor cstr)::List.map ast_of_pattern args)]) + | PatCstr(loc,cstr,args,Anonymous) -> ope("PATTCONSTRUCT", (ast_of_constructor cstr)::List.map ast_of_pattern args) - | PatAs(loc,id,p) -> ope("PATTAS",[nvar (string_of_id id); ast_of_pattern p]) (* Nouvelle version de renommage des variables (DEC 98) *) (* This is the algorithm to display distinct bound variables @@ -800,7 +804,7 @@ and detype_eqn avoid env constr_id construct_params branch = buildrec new_ids (pat::patlist) new_avoid new_env (l,new_b) | [] , rhs -> - (ids, [PatCstr(dummy_loc, constr_id, List.rev patlist)], + (ids, [PatCstr(dummy_loc, constr_id, List.rev patlist,Anonymous)], detype avoid env rhs) in buildrec [] [] avoid env (construct_params,branch) |
