#![allow(non_camel_case_types, dead_code, non_upper_case_globals, improper_ctypes)] // Auto-generated Rust bindings from assembly source unsafe extern "C" { pub unsafe fn parse_func(ast: *mut Ast) -> u64; pub unsafe fn parse_args(ast: *mut Ast) -> (*const u64, usize); pub unsafe fn parse_primary_expr(ast: *mut Ast) -> (u64, bool); pub unsafe fn parse_binary_expr(ast: *mut Ast, precedence: u8) -> (u64, bool); pub unsafe fn parse_expr(ast: *mut Ast) -> u64; pub unsafe fn parse_statement(ast: *mut Ast) -> u64; pub unsafe fn parse_block(ast: *mut Ast) -> u64; pub unsafe fn parse_type(ast: *mut Ast) -> Type; pub unsafe fn parse_prefix_expr(ast: *mut Ast) -> (u64, bool); pub unsafe fn parse_assignment(ast: *mut Ast) -> (u64, bool); pub unsafe fn ast_parse_let(ast: *mut Ast) -> (u64, bool); pub unsafe fn symkey_cmp(a: *const SymKey, b: *const SymKey) -> i32; pub unsafe fn ast_build_symtable(ast: *mut Ast, root_index: u64, symtable: *mut core::mem::MaybeUninit); pub unsafe fn ast_walk_for_each(ast: *mut Ast, start_index: u64, ctx: *mut (), for_each: unsafe extern "C" fn(ctx: *mut (), *mut Ast, node_index: u64, scope: u64)); pub unsafe fn ast_resolve_var_refs(ast: *mut Ast, ctx: *mut SymbolTable, root_index: u64); pub unsafe fn codegen_function(ast: *const CodegenCtx, func_idx: u64) -> (); pub unsafe fn vec_extend(vec: *mut BlobVec, elements: *const u8, count: usize) -> (); } pub const SYM_KEY_SCOPE: u8 = 1; pub const SYM_KEY_SCOPE_NAME: u8 = 2; pub const SYM_KEY_PARENT_SCOPE: u8 = 3; pub const SYM_KEY_START_LOCALS: u8 = 4; pub const SYM_KEY_ARG: u8 = 5; pub const SYM_KEY_VAR: u8 = 6; pub const SYM_KEY_END_LOCALS: u8 = 7; pub const AST_FUNCTION: u8 = 1; pub const AST_BLOCK: u8 = 2; pub const AST_VARIABLE: u8 = 3; pub const AST_NUMBER: u8 = 4; pub const AST_BINARY_OP: u8 = 5; pub const AST_RETURN_STATEMENT: u8 = 6; pub const AST_VALUE_TO_PLACE: u8 = 7; pub const AST_PLACE_TO_VALUE: u8 = 8; pub const AST_ASSIGNMENT: u8 = 9; pub const AST_DEREF: u8 = 10; pub const AST_ADDRESS_OF: u8 = 11; pub const AST_VAR_DECL: u8 = 12; pub const AST_VAR_REF: u8 = 13; pub const AST_ARG: u8 = 14; pub const TYPE_VOID: u8 = 1; pub const TYPE_BOOL: u8 = 2; pub const TYPE_I32: u8 = 3; pub const TYPE_U32: u8 = 4; pub const TYPE_STR: u8 = 5; pub const TYPE_POINTER: u8 = 6; pub const TOKEN_EOF: u8 = 0; pub const TOKEN_LET: u8 = 1; pub const TOKEN_IF: u8 = 2; pub const TOKEN_ELSE: u8 = 3; pub const TOKEN_FN: u8 = 4; pub const TOKEN_RETURN: u8 = 5; pub const TOKEN_LOOP: u8 = 6; pub const TOKEN_BREAK: u8 = 7; pub const TOKEN_CONTINUE: u8 = 8; pub const TOKEN_TRUE: u8 = 9; pub const TOKEN_FALSE: u8 = 10; pub const TOKEN_BOOL: u8 = 11; pub const TOKEN_ARROW: u8 = 12; pub const TOKEN_I32: u8 = 13; pub const TOKEN_U32: u8 = 14; pub const TOKEN_EQUALS: u8 = 15; pub const TOKEN_PLUS: u8 = 16; pub const TOKEN_MINUS: u8 = 17; pub const TOKEN_RPARENS: u8 = 18; pub const TOKEN_LPARENS: u8 = 19; pub const TOKEN_RBRACE: u8 = 20; pub const TOKEN_LBRACE: u8 = 21; pub const TOKEN_COLON: u8 = 22; pub const TOKEN_SEMI: u8 = 23; pub const TOKEN_COMMA: u8 = 24; pub const TOKEN_PIPE: u8 = 25; pub const TOKEN_AMP: u8 = 26; pub const TOKEN_EQEQ: u8 = 27; pub const TOKEN_LBRACKET: u8 = 28; pub const TOKEN_RBRACKET: u8 = 29; pub const TOKEN_VOID: u8 = 30; pub const TOKEN_SLASH: u8 = 31; pub const TOKEN_STAR: u8 = 32; pub const TOKEN_U8: u8 = 33; pub const TOKEN_I8: u8 = 34; pub const TOKEN_U16: u8 = 35; pub const TOKEN_I16: u8 = 36; pub const TOKEN_U64: u8 = 37; pub const TOKEN_I64: u8 = 38; pub const TOKEN_USIZE: u8 = 39; pub const TOKEN_ISIZE: u8 = 40; pub const TOKEN_F32: u8 = 41; pub const TOKEN_F64: u8 = 42; pub const TOKEN_IDENT: u8 = 43; pub const TOKEN_NUMBER: u8 = 44; pub const TOKEN_STRING: u8 = 45; pub const TOKEN_COMMENT: u8 = 46; #[repr(C)] #[derive(Debug)] pub struct Ast { pub nodes: Vec, } #[repr(C)] #[derive(Debug)] pub struct AstNode { pub kind: u8, pub data: *const (), pub extra: usize, pub span: u64, } #[repr(C)] #[derive(Debug)] pub struct AstArgument { pub name: *const u8, pub name_len: usize, pub arg_type: Type, } #[repr(C)] #[derive(Debug)] pub struct Type { pub kind: u8, pub data: u64, } #[repr(C)] #[derive(Debug)] pub struct AstFunction { pub name: *const u8, pub name_len: usize, pub args: *const u64, pub args_len: usize, pub return_type: Type, pub body: u64, } #[repr(C)] #[derive(Debug)] pub struct AstVarRef { pub resolved: u64, pub name: *const u8, pub name_len: usize, } #[repr(C)] #[derive(Debug)] pub struct BinaryExpr { pub left: u64, pub operator: u8, pub right: u64, } #[repr(C)] #[derive(Debug)] pub struct AstVarDecl { pub name: *const u8, pub name_len: usize, pub var_type: Type, } #[repr(C)] #[derive(Debug)] pub struct AstAssignment { pub variable: u64, pub expr: u64, } #[repr(C)] #[derive(Debug)] pub struct SymbolTable { pub symtable: Vec, } #[repr(C)] #[derive(Debug)] pub struct SymKey { pub kind: u8, pub scope_index: u64, pub span: u64, pub ident: *const u8, pub ident_len: usize, } #[repr(C)] #[derive(Debug)] pub struct SymEntry { pub key: SymKey, pub index: u64, pub extra: u64, } #[repr(C)] #[derive(Debug)] pub struct CodegenCtx { pub ast: *const Ast, pub text: Vec, } #[repr(C)] #[derive(Debug)] pub struct BlobVec { pub data: *mut u8, pub len: usize, pub cap: usize, pub elem_size: usize, pub drop: Option, } use super::vec::Vec;