diff options
Diffstat (limited to 'src/cffc.hff')
| -rw-r--r-- | src/cffc.hff | 131 |
1 files changed, 131 insertions, 0 deletions
diff --git a/src/cffc.hff b/src/cffc.hff new file mode 100644 index 0000000..dcb91f7 --- /dev/null +++ b/src/cffc.hff @@ -0,0 +1,131 @@ +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<int>, + peektok Option<Tok>, +} + +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; |