#ifndef _SPHO_TP_H #define _SPHO_TP_H /* base defs */ #define SPHO_KONST_S_SZ 128 #define SPHO_KONST_K_TRUE 0x43445 /* don't change!!!!! */ #define SPHO_KONST_K_FALSE 0x66a57 /* don't change!1! */ struct spho_konst { const char *s; int k; }; const struct spho_konst SPHO_K_TRUE_V = { "True", SPHO_KONST_K_TRUE }; const struct spho_konst SPHO_K_FALSE_V = { "False", SPHO_KONST_K_FALSE }; #define SPHO_K_TRUE (&SPHO_K_TRUE_V) #define SPHO_K_FALSE (&SPHO_K_FALSE_V) struct spho_var { struct spho_nom nom; STAILQ_ENTRY(spho_var) next; }; STAILQ_HEAD(spho_var_l, spho_var); struct spho_bind { struct spho_nom nom; struct spho_tpop *op; }; struct spho_tpop { struct spho_var_l params; struct spho_tp *def; }; struct spho_rec { struct spho_nom mnom; struct spho_tp *tp; }; /* type data */ struct tp_bin_data { struct spho_tp *left; struct spho_tp *right; }; struct tp_box_data { struct spho_tp *inr; }; struct tp_forall_data { struct spho_var *var; struct spho_tp *inr; }; struct tp_bappl_data { struct spho_bind *bind; struct spho_tp_l *args; }; struct tp_konst_data { const struct spho_konst *k; }; struct tp_var_data { struct spho_var *v; }; struct tp_nominal_data { struct spho_nom *n; }; struct tp_record_data { struct spho_rec *r; }; /* type data union */ union tp_data { struct tp_bin_data binop; struct tp_box_data box; struct tp_forall_data fa; struct tp_bappl_data bappl; struct tp_konst_data konst; struct tp_var_data var; struct tp_nominal_data nom; struct tp_record_data rec; }; #define SPHO_TP_FORM_UNKNOWN 0x00 #define SPHO_TP_FORM_DISJ 0x10 #define SPHO_TP_FORM_CONJ 0x11 #define SPHO_TP_FORM_IMPL 0x12 #define SPHO_TP_FORM_BOX 0x13 #define SPHO_TP_FORM_ARROW 0x14 #define SPHO_TP_FORM_FORALL 0x15 #define SPHO_TP_FORM_BAPPL 0x16 #define SPHO_TP_FORM_FALSE 0x20 #define SPHO_TP_FORM_TRUE 0x21 #define SPHO_TP_FORM_VAR 0x22 #define SPHO_TP_FORM_NOM 0x23 #define SPHO_TP_FORM_REC 0x23 // #define SPHO_TP_FORM_SUB 0x96 #define SPHO_TP_FORM_IS_VALID(f) \ (f) >= SPHO_TP_FORM_DISJ && (f) <= SPHO_TP_FORM_BAPPL || \ (f) >= SPHO_TP_FORM_FALSE && (f) <= SPHO_TP_FORM_NOM || \ (f) == SPHO_TP_FORM_REC /* sappho type */ struct spho_tp { struct spho_scope *sc; int form; union tp_data data; STAILQ_ENTRY(spho_tp) next; }; STAILQ_HEAD(spho_tp_l, spho_tp); #define SPHO_TP_ERR(tp, err) SPHO_ERR((tp)->sc->ctx, (err)) struct spho_var *spho_var_create(struct spho_scope *, char *, size_t); struct spho_var *spho_var_get(struct spho_scope *, char *, size_t); //struct spho_tp *spho_tp_create_disj(struct spho_scope *, struct spho_tp *, // struct spho_tp *, struct spho_tp *); //struct spho_tp *spho_tp_create_conj(struct spho_scope *, struct spho_tp *, // struct spho_tp *, struct spho_tp *); //struct spho_tp *spho_tp_create_impl(struct spho_scope *, struct spho_tp *, // struct spho_tp *, struct spho_tp *); //struct spho_tp *spho_tp_create_box(struct spho_scope *, struct spho_tp *, // struct spho_tp *); //struct spho_tp *spho_tp_create_arrow(struct spho_scope *, struct spho_tp *, // struct spho_tp *); //struct spho_tp *spho_tp_create_forall(struct spho_scope *, struct spho_name *, // struct spho_tp *); //struct spho_tp *spho_tp_create_const(struct spho_scope *, struct spho_const *); //struct spho_tp *spho_tp_create_nominal(struct spho_scope *, // struct spho_nom *); //struct spho_tp *spho_tp_create_var(struct spho_scope *, struct spho_var *); //struct spho_tp *spho_tp_create_record(struct spho_scope *, struct spho_rec *); //struct spho_tp *spho_tp_create_sub(struct spho_scope *, struct spho_tp *, // struct spho_tp *); void spho_tp_destroy(struct spho_tp*); void spho_tp_free(struct spho_tp *); #endif