import "libc.hff"; import "mem.hff"; import "option.hff"; /// Types struct Type; struct Decl; struct Expr; struct Env; struct Loc { fileid i16, col i16, line int, idx isize, } #[lax] enum TokT : i32 { // !sorted kw_and, kw_as, kw_break, kw_case, kw_const, kw_continue, kw_def, kw_defmacro, kw_do, kw_else, kw_enum, kw_extern, kw_fn, kw_for, kw_if, kw_import, kw_let, kw_not, kw_or, kw_return, kw_sizeof, kw_static, kw_struct, kw_switch, kw_typedef, kw_typeof, kw_union, kw_while, NUM_KEYWORDS, int = -100, flo, bool, str, chr, null, ident, macident, gensym, type, label, strify, eof, } def NUM_KEYWORDS = TokT:NUM_KEYWORDS; struct Tok { t TokT, loc Loc, ty *const Type, u union { int i64, uint u64, flo f64, bool bool, str [#]const u8, ident *const u8, }, } struct Type { size usize, align usize, konst bool, id uint, u enum union { Void, Bool, Int struct { sgn bool }, Flo, Ptr *Type, Arr struct { child *Type, length i64 }, Slice *Type, } } struct Parser { fp *FILE, alloc *Allocator, curfile *const u8, tokloc Loc, curloc Loc, eof bool, peekchr Option, peektok Option, } struct Decl { name *const u8, } struct DeclList { link *DeclList, decl Decl, } struct Targ { name *const u8, ptrsize u8, intsize u8, longsize u8, longalign u8, llongsize u8, llongalign u8, sizesize u8, f64align u8, valistsize u8, valistalign u8, charsigned bool, shortenum bool, } // parse.cff extern fn parser_init(*Parser, path *const u8) void; extern fn parse(*Parser) [#]Decl; // fmt.cff extern fn vpfmt(proc *fn(u8, *void) void, parg *void, fmt *const u8, va_list) void; extern fn pfmt(proc *fn(u8, *void) void, parg *void, fmt *const u8, ...) void; extern fn vefmt(fmt *const u8, ap va_list) void; extern fn efmt(fmt *const u8, ...) void; // .. util.cff .. extern fn fatal(*Parser, Loc, fmt *const u8, ...) void; // type.cff // env.cff extern fn mkenv(parent *Env, alloc *Allocator) *Env; extern fn envput(*Env, *const Decl) *Decl; // targ.cff extern static g_targ *const Targ; extern fn targ_ini(name *const u8) bool;