#ifndef _MSPH_TREE_H #define _MSPH_TREE_H #include #include "msph/common.h" #include "msph/token.h" /* tree decorations */ struct msph_decor { struct spho_scope *sc; struct spho_tp *tp; struct spho_nom *nom; }; #define MSPH_TREE_ROOT 0x0000 #define MSPH_TREE_UNIT 0x0001 #define MSPH_TREE_BODY 0x0010 #define MSPH_TREE_DIR 0x0020 #define MSPH_TREE_TPDEF 0x0021 #define MSPH_TREE_NOMINDECL 0x0022 #define MSPH_TREE_MEMBDECL 0x0023 #define MSPH_TREE_ASSERT 0x0024 #define MSPH_TREE_TPEXPR 0x0040 #define MSPH_TREE_TRUE 0x0041 #define MSPH_TREE_FALSE 0x0042 #define MSPH_TREE_TPNAME 0x0043 #define MSPH_TREE_TPAPPL 0x0044 #define MSPH_TREE_TRAIT 0x0045 #define MSPH_TREE_CONJ 0x0046 #define MSPH_TREE_DISJ 0x0047 #define MSPH_TREE_IMPL 0x0048 #define MSPH_TREE_ARROW 0x0049 #define MSPH_TREE_BOX 0x004a #define MSPH_TREE_FORALL 0x004b #define MSPH_TREE_PAREN 0x004c #define MSPH_TREE_SUBT 0x004d #define MSPH_TREE_IDENT 0x0100 #define MSPH_TREE_NAMEDECL 0x0101 #define MSPH_TREE_NAMEREF 0x0102 #define MSPH_TREE_FLAG_OFFSET 16 #define MSPH_TREE_FLAG_SCOPE (1 << (MSPH_TREE_FLAG_OFFSET)) #define MSPH_TREE_FLAG_TP (1 << (MSPH_TREE_FLAG_OFFSET + 1)) #define MSPH_TREE_FLAG_NOM (1 << (MSPH_TREE_FLAG_OFFSET + 2)) #define MSPH_TREE_MASK_FLAGS ((~0x0u) << MSPH_TREE_FLAG_OFFSET) #define MSPH_TREE_MASK_ID ((~0x0u) ^ MSPH_TREE_MASK_FLAGS) #define ADD_FLAG(tree, flag) \ do { \ TREE(tree)->type |= flag; \ } while (0) #define HAS_FLAG(tree, flag) (TREE(tree)->type & (flag)) #define TREE(tree) ((struct msph_tree *)tree) #define TEXT(tree) ((struct msph_tree_text *)tree) #define IDENT(tree) ((struct msph_tree_ident *)tree) #define TPEXPR(tree) ((struct msph_tree_tpexpr *)tree) #define HAS_SCOPE(tree) HAS_FLAG((tree), MSPH_TREE_FLAG_SCOPE) #define HAS_TP(tree) HAS_FLAG((tree), MSPH_TREE_FLAG_TP) #define HAS_NOM(tree) HAS_FLAG((tree), MSPH_TREE_FLAG_NOM) #define HAS_PARAMS(tpdef) (! STAILQ_EMPTY(&(tpdef)->params)) #define TREE_ID(tree) (((struct msph_tree *)tree)->type & \ MSPH_TREE_MASK_ID) #define DECOR(tree) (TREE(tree)->decor) #define SCOPE(tree) (TREE(tree)->decor.sc) #define TP(tree) (TREE(tree)->decor.tp) #define NOM(tree) (TREE(tree)->decor.nom) #define DECOR_INIT(tree) \ do { \ DECOR(tree) = (struct msph_decor) { NULL, NULL, NULL }; \ } while (0) struct msph_tree { unsigned int type; struct msph_tree *parent; struct msph_decor decor; }; struct msph_tree_text { struct msph_tree hd_tr; struct msph_text_pos pos; }; struct msph_tree_ident { struct msph_tree_text hd_txt; char str[MSPH_IDENT_LEN]; }; struct msph_tree_root; struct msph_tree_text; struct msph_tree_body; struct msph_tree_dir; struct msph_tree_tpdef; struct msph_tree_nomindecl; struct msph_tree_assert; struct msph_tree_ident; struct msph_tree_tpexpr; struct msph_tree_root { struct msph_tree hd_tr; struct msph_ctx *ctx; STAILQ_HEAD(msph_tree_unit_l, msph_tree_unit) head; }; struct msph_tree_unit { struct msph_tree hd_tr; char name[MSPH_NAME_LEN]; struct msph_tree_body *body; STAILQ_ENTRY(msph_tree_unit) entries; }; struct msph_tree_body { struct msph_tree hd_tr; STAILQ_HEAD(msph_tree_dir_l, msph_tree_dir) head; }; struct msph_tree_dir { struct msph_tree_text hd_txt; STAILQ_ENTRY(msph_tree_dir) entries; }; struct msph_tree_tpdef { struct msph_tree_dir hd_dir; struct msph_tree_namedecl *name; STAILQ_HEAD(msph_tree_namedecl_l, msph_tree_namedecl) params; struct msph_tree_tpexpr *tp; }; struct msph_tree_nomindecl { struct msph_tree_dir hd_dir; struct msph_tree_namedecl *name; }; struct msph_tree_membdecl { struct msph_tree_dir hd_dir; struct msph_tree_namedecl *name; struct msph_tree_tpexpr *tp; }; struct msph_tree_assert { struct msph_tree_dir hd_dir; struct msph_tree_tpexpr *tp; }; struct msph_tree_namedecl { struct msph_tree_ident hd_id; STAILQ_ENTRY(msph_tree_namedecl) entries; }; struct msph_tree_tpexpr { struct msph_tree_text hd_txt; STAILQ_ENTRY(msph_tree_tpexpr) entries; }; struct msph_tree_true { struct msph_tree_tpexpr hd_tpe; }; struct msph_tree_false { struct msph_tree_tpexpr hd_tpe; }; struct msph_tree_nameref { struct msph_tree_ident hd_id; }; struct msph_tree_tpname { struct msph_tree_tpexpr hd_tpe; struct msph_tree_nameref *name; }; struct msph_tree_tpappl { struct msph_tree_tpexpr hd_tpe; struct msph_tree_nameref *name; STAILQ_HEAD(msph_tree_tpexpr_l, msph_tree_tpexpr) args; }; struct msph_tree_trait { struct msph_tree_tpexpr hd_tpe; struct msph_tree_body *body; }; /* XXX should probably merge all binary type ops into one */ struct msph_tree_conj { struct msph_tree_tpexpr hd_tpe; struct msph_tree_tpexpr *ltp; struct msph_tree_tpexpr *rtp; }; struct msph_tree_disj { struct msph_tree_tpexpr hd_tpe; struct msph_tree_tpexpr *ltp; struct msph_tree_tpexpr *rtp; }; struct msph_tree_impl { struct msph_tree_tpexpr hd_tpe; struct msph_tree_tpexpr *ltp; struct msph_tree_tpexpr *rtp; }; struct msph_tree_subt { struct msph_tree_tpexpr hd_tpe; struct msph_tree_tpexpr *ltp; struct msph_tree_tpexpr *rtp; }; struct msph_tree_arrow { struct msph_tree_tpexpr hd_tpe; struct msph_tree_tpexpr *ltp; struct msph_tree_tpexpr *rtp; }; struct msph_tree_box { struct msph_tree_tpexpr hd_tpe; struct msph_tree_tpexpr *inner; }; struct msph_tree_forall { struct msph_tree_tpexpr hd_tpe; struct msph_tree_namedecl *name; struct msph_tree_tpexpr *inner; }; struct msph_tree_paren { struct msph_tree_tpexpr hd_tpe; struct msph_tree_tpexpr *inner; }; struct msph_tree_root *msph_tree_makeroot(struct msph_ctx *); #define MSPH_PARSE_PREFIX 1 #define MSPH_PARSE_INFIX 2 int msph_tree_parse(struct msph_token_stream *, struct msph_tree_root *, int); ssize_t msph_tree_fprint(FILE *, struct msph_tree *); #endif