#ifndef _MSPH_TREE_H #define _MSPH_TREE_H #include #include "msph/common.h" #include "msph/token.h" /* * TYPES: * Conj * Disj * Impl * Arrow * Box * (Sub) * Forall * * True * False * Var * Nominal * * Record * * DEFINITIONS/DIRECTIVES: * Type definition (type A[X..] = T) * Nominal definition (nominal N) * Member definition (member mname : T) * * { * member a: A * member b: B * } * * Subtyping assert (assert A <: B, asserts that A <: B) * * EXTRA DEFINITIONS * Class definition (class C[...] { ... }, shorthand) * * EXPRESSIONS * Conj * Disj * Impl * Arrow * Box * (Sub) * Forall * * True * False * Var * Nominal * * Trait ({ ... }, creates scoping) */ #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_NAME 0x0043 #define MSPH_TREE_APPL 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_IDENT 0x0100 struct msph_tree { int type; struct msph_tree *parent; }; 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 tr; struct msph_ctx *ctx; STAILQ_HEAD(msph_tree_unit_l, msph_tree_unit) head; }; struct msph_tree_unit { struct msph_tree tr; char name[MSPH_NAME_LEN]; struct msph_tree_body *body; STAILQ_ENTRY(msph_tree_unit) entries; }; struct msph_tree_text { struct msph_tree tr; struct msph_text_pos pos; }; struct msph_tree_body { struct msph_tree tr; STAILQ_HEAD(msph_tree_dir_l, msph_tree_dir) head; }; struct msph_tree_dir { struct msph_tree tr; STAILQ_ENTRY(msph_tree_dir) entries; }; struct msph_tree_tpdef { struct msph_tree_dir dir; struct msph_tree_ident *id; struct msph_tree_tpexpr *tp; }; struct msph_tree_nomindecl { struct msph_tree_dir dir; struct msph_tree_ident *id; }; struct msph_tree_membdecl { struct msph_tree_dir dir; struct msph_tree_ident *id; struct msph_tree_tpexpr *tp; }; struct msph_tree_assert { struct msph_tree_dir dir; struct msph_tree_tpexpr *ltp; struct msph_tree_tpexpr *rtp; }; struct msph_tree_tpexpr { struct msph_tree tr; STAILQ_ENTRY(msph_tree_tpexpr) entries; }; struct msph_tree_true { struct msph_tree_tpexpr tp; }; struct msph_tree_false { struct msph_tree_tpexpr tp; }; struct msph_tree_name { struct msph_tree_tpexpr tp; struct msph_tree_ident *id; }; struct msph_tree_appl { struct msph_tree_tpexpr tp; struct msph_tree_ident *id; STAILQ_HEAD(msph_tree_tpexpr_l, msph_tree_tpexpr) head; }; struct msph_tree_trait { struct msph_tree_tpexpr tp; struct msph_tree_body *body; }; struct msph_tree_conj { struct msph_tree_tpexpr tp; struct msph_tree_tpexpr *ltp; struct msph_tree_tpexpr *rtp; }; struct msph_tree_disj { struct msph_tree_tpexpr tp; struct msph_tree_tpexpr *ltp; struct msph_tree_tpexpr *rtp; }; struct msph_tree_impl { struct msph_tree_tpexpr tp; struct msph_tree_tpexpr *ltp; struct msph_tree_tpexpr *rtp; }; struct msph_tree_arrow { struct msph_tree_tpexpr tp; struct msph_tree_tpexpr *ltp; struct msph_tree_tpexpr *rtp; }; struct msph_tree_box { struct msph_tree_tpexpr tp; struct msph_tree_tpexpr *inner; }; struct msph_tree_forall { struct msph_tree_tpexpr tp; struct msph_tree_ident *ident; struct msph_tree_tpexpr *inner; }; struct msph_tree_paren { struct msph_tree_tpexpr tp; struct msph_tree_tpexpr *inner; }; struct msph_tree_ident { struct msph_tree tr; char str[MSPH_IDENT_LEN]; STAILQ_ENTRY(msph_tree_ident) entries; }; struct msph_tree_root *msph_tree_makeroot(struct msph_ctx *); int msph_tree_parse(struct msph_token_stream *, struct msph_tree_root *); ssize_t msph_tree_fprint(FILE *, struct msph_tree *); #endif