;;
let var_uri_of_id id interp =
- match interp id with
- None -> raise (UnknownIdentifier id)
- | Some (CicTextualParser0.VarUri uri) -> uri
- | Some _ -> raise TheLeftHandSideOfAnExplicitNamedSubstitutionMustBeAVariable
+ let module CTP0 = CicTextualParser0 in
+ match interp (CicTextualParser0.Id id) with
+ None -> raise (UnknownIdentifier id)
+ | Some (CTP0.Uri (CTP0.VarUri uri)) -> uri
+ | Some _ -> raise TheLeftHandSideOfAnExplicitNamedSubstitutionMustBeAVariable
;;
let indty_uri_of_id id interp =
- match interp id with
- None -> raise (UnknownIdentifier id)
- | Some (CicTextualParser0.IndTyUri (uri,tyno)) -> (uri,tyno)
- | Some _ -> raise InductiveTypeURIExpected
+ let module CTP0 = CicTextualParser0 in
+ match interp (CicTextualParser0.Id id) with
+ None -> raise (UnknownIdentifier id)
+ | Some (CTP0.Uri (CTP0.IndTyUri (uri,tyno))) -> (uri,tyno)
+ | Some _ -> raise InductiveTypeURIExpected
+ ;;
+
+ let mk_implicit () =
+ let newmeta = new_meta () in
+ let new_canonical_context = [] in
+ let irl =
+ identity_relocation_list_for_metavariable new_canonical_context
+ in
+ CicTextualParser0.metasenv :=
+ [newmeta, new_canonical_context, Sort Type ;
+ newmeta+1, new_canonical_context, Meta (newmeta,irl);
+ newmeta+2, new_canonical_context, Meta (newmeta+1,irl)
+ ] @ !CicTextualParser0.metasenv ;
+ [], function _ -> Meta (newmeta+2,irl)
;;
%}
%token <string> ID
%token <UriManager.uri> VARURI
%token <UriManager.uri * int> INDTYURI
%token <UriManager.uri * int * int> INDCONURI
-%token ALIAS
%token LPAREN RPAREN PROD LAMBDA COLON DOT SET PROP TYPE CAST IMPLICIT NONE
%token LETIN FIX COFIX SEMICOLON LCURLY RCURLY CASE ARROW LBRACKET RBRACKET EOF
%right ARROW
%start main
-%type <string list * ((string -> CicTextualParser0.uri option) -> Cic.term)> main
+%type <CicTextualParser0.interpretation_domain_item list * (CicTextualParser0.interpretation -> Cic.term)> main
%%
main:
- expr EOF { $1 }
+ | EOF { raise CicTextualParser0.Eof } /* FG: was never raised */
+ | expr EOF { $1 }
+ | expr SEMICOLON { $1 } /* FG: to read several terms in a row
+ * Do we need to clear some static variables?
+ */
;
expr2:
CONURI exp_named_subst
with
Not_found ->
let dom1,mk_exp_named_subst = deoptionize_exp_named_subst $2 in
- let dom = union dom1 [$1] in
+ let dom = union dom1 [CicTextualParser0.Id $1] in
dom,
function interp ->
- match interp $1 with
+ match interp (CicTextualParser0.Id $1) with
None -> raise (UnknownIdentifier $1)
- | Some uri -> term_of_uri uri (mk_exp_named_subst interp)
+ | Some (CicTextualParser0.Uri uri) ->
+ term_of_uri uri (mk_exp_named_subst interp)
+ | Some CicTextualParser0.Implicit ->
+ (*CSC: not very clean; to maximize code reusage *)
+ snd (mk_implicit ()) ""
+ | Some (CicTextualParser0.Term mk_term) ->
+ (mk_term interp)
}
| CASE LPAREN expr COLON INDTYURI SEMICOLON expr RPAREN LCURLY branches RCURLY
{ let dom1,mk_expr1 = $3 in
let dom2,mk_expr2 = $7 in
let dom3,mk_expr3 = $10 in
- let dom = union dom1 (union dom2 dom3) in
+ let dom = (union dom1 (union dom2 dom3)) in
dom,
function interp ->
MutCase
{ let dom1,mk_expr1 = $3 in
let dom2,mk_expr2 = $7 in
let dom3,mk_expr3 = $10 in
- let dom = union [$5] (union dom1 (union dom2 dom3)) in
+ let dom = union [CicTextualParser0.Id $5] (union dom1 (union dom2 dom3)) in
dom,
function interp ->
let uri,typeno = indty_uri_of_id $5 interp in
CoFix (idx,fixfuns)
}
| IMPLICIT
- { let newmeta = new_meta () in
- let new_canonical_context = [] in
- let irl =
- identity_relocation_list_for_metavariable new_canonical_context
- in
- CicTextualParser0.metasenv :=
- [newmeta, new_canonical_context, Sort Type ;
- newmeta+1, new_canonical_context, Meta (newmeta,irl);
- newmeta+2, new_canonical_context, Meta (newmeta+1,irl)
- ] @ !CicTextualParser0.metasenv ;
- [], function _ -> Meta (newmeta+2,irl)
- }
+ { mk_implicit () }
| SET { [], function _ -> Sort Set }
| PROP { [], function _ -> Sort Prop }
| TYPE { [], function _ -> Sort Type }
{ let dom,mk_substitutionlist = $3 in
dom, function interp -> Meta ($1, mk_substitutionlist interp)
}
- | LPAREN expr expr exprlist RPAREN
- { let dom1,mk_expr1 = $2 in
- let dom2,mk_expr2 = $3 in
- let dom3,mk_exprlist = $4 in
- let dom = union dom1 (union dom2 dom3) in
- dom,
- function interp ->
- Appl ([mk_expr1 interp ; mk_expr2 interp]@(mk_exprlist interp))
+ | LPAREN expr exprlist RPAREN
+ { let length,dom2,mk_exprlist = $3 in
+ match length with
+ 0 -> $2
+ | _ ->
+ let dom1,mk_expr1 = $2 in
+ let dom = union dom1 dom2 in
+ dom,
+ function interp ->
+ Appl ((mk_expr1 interp)::(mk_exprlist interp))
}
;
exp_named_subst :
dom, function interp -> [$1, mk_expr interp] }
| ID LETIN expr2
{ let dom1,mk_expr = $3 in
- let dom = union [$1] dom1 in
+ let dom = union [CicTextualParser0.Id $1] dom1 in
dom, function interp -> [var_uri_of_id $1 interp, mk_expr interp] }
| VARURI LETIN expr2 SEMICOLON named_substs
{ let dom1,mk_expr = $3 in
| ID LETIN expr2 SEMICOLON named_substs
{ let dom1,mk_expr = $3 in
let dom2,mk_named_substs = $5 in
- let dom = union [$1] (union dom1 dom2) in
+ let dom = union [CicTextualParser0.Id $1] (union dom1 dom2) in
dom,
function interp ->
(var_uri_of_id $1 interp, mk_expr interp)::(mk_named_substs interp)
let dom,mk_expr = $1 in
Anonymous, (dom, function interp -> mk_expr interp)
}
- | LPAREN expr RPAREN ARROW
- { CicTextualParser0.binders := (Some Anonymous)::!CicTextualParser0.binders ;
- let dom,mk_expr = $2 in
- Anonymous, (dom, function interp -> mk_expr interp)
- }
| PROD ID DOT
{ CicTextualParser0.binders := (Some (Name $2))::!CicTextualParser0.binders;
let newmeta = new_meta () in
;
exprlist:
- { [], function _ -> [] }
+ { 0, [], function _ -> [] }
| expr exprlist
{ let dom1,mk_expr = $1 in
- let dom2,mk_exprlist = $2 in
+ let length,dom2,mk_exprlist = $2 in
let dom = union dom1 dom2 in
- dom, function interp -> (mk_expr interp)::(mk_exprlist interp)
+ length+1, dom, function interp -> (mk_expr interp)::(mk_exprlist interp)
}
;
exprseplist: