15 struct |
15 struct |
16 |
16 |
17 open ThyParse; |
17 open ThyParse; |
18 |
18 |
19 |
19 |
20 (** subtype **) |
20 (** typedef **) |
21 |
21 |
22 fun mk_subtype_decl (((((opt_name, vs), t), mx), rhs), wt) = |
22 fun mk_typedef_decl (((((opt_name, vs), t), mx), rhs), wt) = |
23 let |
23 let |
24 val name' = if_none opt_name t; |
24 val name' = if_none opt_name t; |
25 val name = strip_quotes name'; |
25 val name = strip_quotes name'; |
26 in |
26 in |
27 (cat_lines [name', mk_triple (t, mk_list vs, mx), rhs, wt], |
27 (cat_lines [name', mk_triple (t, mk_list vs, mx), rhs, wt], |
28 [name ^ "_def", "Rep_" ^ name, "Rep_" ^ name ^ "_inverse", |
28 [name ^ "_def", "Rep_" ^ name, "Rep_" ^ name ^ "_inverse", |
29 "Abs_" ^ name ^ "_inverse"]) |
29 "Abs_" ^ name ^ "_inverse"]) |
30 end; |
30 end; |
31 |
31 |
32 val subtype_decl = |
32 val typedef_decl = |
33 optional ("(" $$-- name --$$ ")" >> Some) None -- |
33 optional ("(" $$-- name --$$ ")" >> Some) None -- |
34 type_args -- name -- opt_infix --$$ "=" -- string -- opt_witness |
34 type_args -- name -- opt_infix --$$ "=" -- string -- opt_witness |
35 >> mk_subtype_decl; |
35 >> mk_typedef_decl; |
36 |
36 |
37 |
37 |
38 |
38 |
39 (** (co)inductive **) |
39 (** (co)inductive **) |
40 |
40 |
189 (** sections **) |
189 (** sections **) |
190 |
190 |
191 val user_keywords = ["intrs", "monos", "con_defs", "|"]; |
191 val user_keywords = ["intrs", "monos", "con_defs", "|"]; |
192 |
192 |
193 val user_sections = |
193 val user_sections = |
194 [axm_section "subtype" "|> Subtype.add_subtype" subtype_decl, |
194 [axm_section "typedef" "|> Typedef.add_typedef" typedef_decl, |
195 ("inductive", inductive_decl ""), |
195 ("inductive", inductive_decl ""), |
196 ("coinductive", inductive_decl "Co"), |
196 ("coinductive", inductive_decl "Co"), |
197 ("datatype", datatype_decl), |
197 ("datatype", datatype_decl), |
198 ("primrec", primrec_decl)]; |
198 ("primrec", primrec_decl)]; |
199 |
199 |