aboutsummaryrefslogtreecommitdiff
path: root/src/cffc.hff
diff options
context:
space:
mode:
authorlemon <lsof@mailbox.org>2022-08-14 11:16:03 +0200
committerlemon <lsof@mailbox.org>2022-08-14 11:16:03 +0200
commit0d1e125832d0fd8ca31c5f782e7c3db774ae5a02 (patch)
treee4622f75a8307d8ee1970f8bd6cc92766582f0ba /src/cffc.hff
parentc129f77ad724aa940b53a125de0e1e4de0ca7240 (diff)
woa
Diffstat (limited to 'src/cffc.hff')
-rw-r--r--src/cffc.hff131
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;