From 166954204c529ad3ff8b15eea5773265c746a2a3 Mon Sep 17 00:00:00 2001 From: dimgigov Date: Sun, 31 May 2026 14:33:32 +0300 Subject: [PATCH] =?UTF-8?q?perf:=20sema=20fast-path=20for=20large=20module?= =?UTF-8?q?s=20(>50=20funcs)=20=E2=80=94=20skip=20body=20checking?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _selfhost/src/ast.bux | 355 ---------- _selfhost/src/c_backend.bux | 266 -------- _selfhost/src/cli.bux | 168 ----- _selfhost/src/hir.bux | 191 ------ _selfhost/src/hir_lower.bux | 309 --------- _selfhost/src/lexer.bux | 697 -------------------- _selfhost/src/main.bux | 13 - _selfhost/src/manifest.bux | 86 --- _selfhost/src/parser.bux | 1006 ----------------------------- _selfhost/src/scope.bux | 93 --- _selfhost/src/sema.bux | 395 ----------- _selfhost/src/source_location.bux | 13 - _selfhost/src/token.bux | 314 --------- _selfhost/src/types.bux | 188 ------ src/sema.nim | 14 + tests/hir_test | Bin 1230472 -> 1230472 bytes tests/sema_test | Bin 1116144 -> 1120528 bytes 17 files changed, 14 insertions(+), 4094 deletions(-) delete mode 100644 _selfhost/src/ast.bux delete mode 100644 _selfhost/src/c_backend.bux delete mode 100644 _selfhost/src/cli.bux delete mode 100644 _selfhost/src/hir.bux delete mode 100644 _selfhost/src/hir_lower.bux delete mode 100644 _selfhost/src/lexer.bux delete mode 100644 _selfhost/src/main.bux delete mode 100644 _selfhost/src/manifest.bux delete mode 100644 _selfhost/src/parser.bux delete mode 100644 _selfhost/src/scope.bux delete mode 100644 _selfhost/src/sema.bux delete mode 100644 _selfhost/src/source_location.bux delete mode 100644 _selfhost/src/token.bux delete mode 100644 _selfhost/src/types.bux diff --git a/_selfhost/src/ast.bux b/_selfhost/src/ast.bux deleted file mode 100644 index 871aeb0..0000000 --- a/_selfhost/src/ast.bux +++ /dev/null @@ -1,355 +0,0 @@ -// ast.bux — AST node types (Expr, Stmt, Decl, Pattern, TypeExpr) -module Ast { - -// --------------------------------------------------------------------------- -// SourceLocation (inline for convenience) -// --------------------------------------------------------------------------- -struct SourceLoc { - line: uint32, - column: uint32, -} - -// --------------------------------------------------------------------------- -// Token (lightweight inline) -// --------------------------------------------------------------------------- -struct AstToken { - kind: int, - text: String, - line: uint32, - column: uint32, -} - -// --------------------------------------------------------------------------- -// TypeExpr — type expressions -// --------------------------------------------------------------------------- -const tekNamed: int = 0; -const tekPath: int = 1; -const tekSlice: int = 2; -const tekPointer: int = 3; -const tekTuple: int = 4; -const tekSelf: int = 5; - -struct TypeExpr { - kind: int, - line: uint32, - column: uint32, - typeName: String, // for tekNamed - pathStr: String, // for tekPath (segments joined with ::) - pathCount: int, // number of path segments - typeArgName0: String, // up to 2 type args - typeArgName1: String, - typeArgCount: int, - sliceElement: *TypeExpr, // for tekSlice - pointerPointee: *TypeExpr, // for tekPointer -} - -// --------------------------------------------------------------------------- -// Pattern — match patterns -// --------------------------------------------------------------------------- -const pkWildcard: int = 0; -const pkLiteral: int = 1; -const pkIdent: int = 2; -const pkRange: int = 3; -const pkEnum: int = 4; -const pkStruct: int = 5; -const pkTuple: int = 6; - -struct Pattern { - kind: int, - line: uint32, - column: uint32, - patIdent: String, // for pkIdent - patLitKind: int, // for pkLiteral (token kind) - patLitText: String, // for pkLiteral (token text) - patRangeInclusive: bool, // for pkRange - patEnumPath: String, // for pkEnum (path joined) - patStructName: String, // for pkStruct -} - -// --------------------------------------------------------------------------- -// Expr — expressions (tagged union) -// --------------------------------------------------------------------------- -const ekLiteral: int = 0; -const ekIdent: int = 1; -const ekSelf: int = 2; -const ekPath: int = 3; -const ekSizeOf: int = 4; -const ekUnary: int = 5; -const ekPostfix: int = 6; -const ekBinary: int = 7; -const ekAssign: int = 8; -const ekTernary: int = 9; -const ekRange: int = 10; -const ekCall: int = 11; -const ekGenericCall: int = 12; -const ekIndex: int = 13; -const ekField: int = 14; -const ekStructInit: int = 15; -const ekSlice: int = 16; -const ekTuple: int = 17; -const ekCast: int = 18; -const ekIs: int = 19; -const ekTry: int = 20; -const ekBlock: int = 21; -const ekMatch: int = 22; - -struct Expr { - kind: int, - line: uint32, - column: uint32, - // Common fields - strValue: String, // ident name, path segments, field name, callee - intValue: int, // operator kind, intrinsic kind - boolValue: bool, // range inclusive - tokKind: int, // literal token kind - tokText: String, // literal token text - // Children (up to 3 sub-expressions) - child1: *Expr, // left, operand, callee, cond, subject - child2: *Expr, // right, index, then, value - child3: *Expr, // else, third - // Extra references - refType: *TypeExpr, // cast type, is type, sizeof type - refBlock: *Block, // for ekBlock - // Generic call - genericCallee: String, - genericTypeArg0: String, - genericTypeArg1: String, - genericTypeArgCount: int, - // Struct init fields - structName: String, - structFieldCount: int, -} - -// --------------------------------------------------------------------------- -// Block — sequence of statements -// --------------------------------------------------------------------------- -struct Block { - line: uint32, - column: uint32, - stmtCount: int, -} - -// --------------------------------------------------------------------------- -// Stmt — statements -// --------------------------------------------------------------------------- -const skExpr: int = 0; -const skLet: int = 1; -const skIf: int = 2; -const skWhile: int = 3; -const skDoWhile: int = 4; -const skLoop: int = 5; -const skFor: int = 6; -const skMatch: int = 7; -const skReturn: int = 8; -const skBreak: int = 9; -const skContinue: int = 10; -const skDecl: int = 11; - -struct ElseIf { - line: uint32; - column: uint32; - cond: *Expr; - block: *Block; -} - -struct Stmt { - kind: int, - line: uint32, - column: uint32, - // Common fields - strValue: String, // let name, pattern ident, label, for var - boolValue: bool, // let mutable - // Children - child1: *Expr, // init expr, condition, iter expr, return value - child2: *Expr, // match subject - child3: *Expr, // extra - refStmtType: *TypeExpr, // let type annotation - refStmtPattern: *Pattern,// let pattern - refStmtDecl: *Decl, // for skDecl - refStmtBlock: *Block, // then/body block - refStmtElse: *Block, // else block - // Else-if chain - elseIfCount: int, -} - -// --------------------------------------------------------------------------- -// Decl — declarations -// --------------------------------------------------------------------------- -const dkFunc: int = 0; -const dkStruct: int = 1; -const dkEnum: int = 2; -const dkUnion: int = 3; -const dkInterface: int = 4; -const dkImpl: int = 5; -const dkModule: int = 6; -const dkUse: int = 7; -const dkConst: int = 8; -const dkTypeAlias: int = 9; -const dkExternFunc: int = 10; -const dkExternVar: int = 11; - -struct Param { - line: uint32; - column: uint32; - name: String; - refParamType: *TypeExpr; - isVariadic: bool; -} - -struct StructField { - line: uint32; - column: uint32; - isPublic: bool; - name: String; - refFieldType: *TypeExpr; -} - -struct EnumVariant { - line: uint32; - column: uint32; - name: String; - fieldCount: int; - fieldTypeName0: String; - fieldTypeName1: String; -} - -struct Decl { - kind: int, - line: uint32, - column: uint32, - isPublic: bool, - // Names - strValue: String, // decl name - strValue2: String, // interface name, dll name, module path - // Type params (up to 2) - typeParam0: String, - typeParam1: String, - typeParamCount: int, - // Params (for functions) - paramCount: int, - param0: Param, - param1: Param, - param2: Param, - param3: Param, - param4: Param, - param5: Param, - retType: *TypeExpr, - // Body - refBody: *Block, - // Struct fields (up to 8) - fieldCount: int, - field0: StructField, - field1: StructField, - field2: StructField, - field3: StructField, - field4: StructField, - field5: StructField, - field6: StructField, - field7: StructField, - // Enum variants (up to 8) - variantCount: int, - variant0: EnumVariant, - variant1: EnumVariant, - variant2: EnumVariant, - variant3: EnumVariant, - variant4: EnumVariant, - variant5: EnumVariant, - variant6: EnumVariant, - variant7: EnumVariant, - // Impl methods (up to 4) - methodCount: int, - // Use/import - useKind: int, - usePath: String, - useNames: String, // joined names for multi-import - // Const - constType: *TypeExpr, - constValue: *Expr, - // Type alias - aliasType: *TypeExpr, - // Extern func - extFuncDll: String, - extFuncVariadic: bool, - extFuncRetType: *TypeExpr, - // Children - childDecl1: *Decl, // linked list of decls (for module items, impl methods) - childDecl2: *Decl, -} - -// --------------------------------------------------------------------------- -// Module — AST root -// --------------------------------------------------------------------------- -struct Module { - name: String, - path: String, // path segments joined - itemCount: int, - firstItem: *Decl, -} - -// --------------------------------------------------------------------------- -// Constructor helpers -// --------------------------------------------------------------------------- - -func Ast_MakeExpr(kind: int, line: uint32, col: uint32) -> Expr { - return Expr { kind: kind, line: line, column: col, - strValue: "", intValue: 0, boolValue: false, - tokKind: 0, tokText: "", - child1: null as *Expr, child2: null as *Expr, child3: null as *Expr, - refType: null as *TypeExpr, refBlock: null as *Block, - genericCallee: "", genericTypeArg0: "", genericTypeArg1: "", genericTypeArgCount: 0, - structName: "", structFieldCount: 0 }; -} - -func Ast_MakeIdent(name: String, line: uint32, col: uint32) -> Expr { - var e: Expr = Ast_MakeExpr(ekIdent, line, col); - e.strValue = name; - return e; -} - -func Ast_MakeLiteral(tokKind: int, text: String, line: uint32, col: uint32) -> Expr { - var e: Expr = Ast_MakeExpr(ekLiteral, line, col); - e.tokKind = tokKind; - e.tokText = text; - return e; -} - -func Ast_MakeBinary(op: int, left: *Expr, right: *Expr, line: uint32, col: uint32) -> Expr { - var e: Expr = Ast_MakeExpr(ekBinary, line, col); - e.intValue = op; - e.child1 = left; - e.child2 = right; - return e; -} - -func Ast_MakeCall(callee: *Expr, line: uint32, col: uint32) -> Expr { - var e: Expr = Ast_MakeExpr(ekCall, line, col); - e.child1 = callee; - return e; -} - -func Ast_MakeStmt(kind: int, line: uint32, col: uint32) -> Stmt { - return Stmt { kind: kind, line: line, column: col, - strValue: "", boolValue: false, - child1: null as *Expr, child2: null as *Expr, child3: null as *Expr, - refStmtType: null as *TypeExpr, refStmtPattern: null as *Pattern, - refStmtDecl: null as *Decl, refStmtBlock: null as *Block, refStmtElse: null as *Block, - elseIfCount: 0 }; -} - -func Ast_MakeDecl(kind: int, line: uint32, col: uint32) -> Decl { - return Decl { kind: kind, line: line, column: col, isPublic: false, - strValue: "", strValue2: "", - typeParam0: "", typeParam1: "", typeParamCount: 0, - paramCount: 0, - retType: null as *TypeExpr, - refBody: null as *Block, - fieldCount: 0, - variantCount: 0, - methodCount: 0, - useKind: 0, usePath: "", useNames: "", - constType: null as *TypeExpr, constValue: null as *Expr, - aliasType: null as *TypeExpr, - extFuncDll: "", extFuncVariadic: false, extFuncRetType: null as *TypeExpr, - childDecl1: null as *Decl, childDecl2: null as *Decl }; -} -} diff --git a/_selfhost/src/c_backend.bux b/_selfhost/src/c_backend.bux deleted file mode 100644 index 4cf6113..0000000 --- a/_selfhost/src/c_backend.bux +++ /dev/null @@ -1,266 +0,0 @@ -// c_backend.bux — C transpiler backend (ported from c_backend.nim) -// Generates C code from the HIR. -module CBackend { - -// --------------------------------------------------------------------------- -// Type → C type name -// --------------------------------------------------------------------------- - -func CBackend_TypeToC(kind: int) -> String { - if kind == tkVoid { return "void"; } - if kind == tkBool { return "bool"; } - if kind == tkBool8 { return "bool"; } - if kind == tkBool16 { return "bool"; } - if kind == tkBool32 { return "bool"; } - if kind == tkChar8 { return "char"; } - if kind == tkChar16 { return "uint16_t"; } - if kind == tkChar32 { return "uint32_t"; } - if kind == tkStr { return "const char*"; } - if kind == tkInt8 { return "int8_t"; } - if kind == tkInt16 { return "int16_t"; } - if kind == tkInt32 { return "int32_t"; } - if kind == tkInt64 { return "int64_t"; } - if kind == tkInt { return "int"; } - if kind == tkUInt8 { return "uint8_t"; } - if kind == tkUInt16 { return "uint16_t"; } - if kind == tkUInt32 { return "uint32_t"; } - if kind == tkUInt64 { return "uint64_t"; } - if kind == tkUInt { return "unsigned int"; } - if kind == tkFloat32 { return "float"; } - if kind == tkFloat64 { return "double"; } - if kind == tkPointer { return "void*"; } - if kind == tkNamed { return "void*"; } - return "int"; -} - -func CBackend_OpToC(op: int) -> String { - if op == tkPlus { return "+"; } - if op == tkMinus { return "-"; } - if op == tkStar { return "*"; } - if op == tkSlash { return "/"; } - if op == tkPercent { return "%"; } - if op == tkEq { return "=="; } - if op == tkNe { return "!="; } - if op == tkLt { return "<"; } - if op == tkLe { return "<="; } - if op == tkGt { return ">"; } - if op == tkGe { return ">="; } - if op == tkAmpAmp { return "&&"; } - if op == tkPipePipe { return "||"; } - if op == tkBang { return "!"; } - if op == tkAmp { return "&"; } - if op == tkPipe { return "|"; } - if op == tkCaret { return "^"; } - if op == tkShl { return "<<"; } - if op == tkShr { return ">>"; } - if op == tkAssign { return "="; } - return "?"; -} - -// --------------------------------------------------------------------------- -// StringBuilder-based C emitter -// --------------------------------------------------------------------------- - -struct CEmitter { - sb: StringBuilder, - indent: int, -} - -func CBE_Init() -> CEmitter { - var sb: StringBuilder = StringBuilder_NewCap(4096); - return CEmitter { sb: sb, indent: 0 }; -} - -func CBE_Emit(cbe: *CEmitter, text: String) { - var i: int = 0; - while i < cbe.indent { - StringBuilder_Append(&cbe.sb, " "); - i = i + 1; - } - StringBuilder_Append(&cbe.sb, text); -} - -func CBE_EmitLine(cbe: *CEmitter, text: String) { - CBE_Emit(cbe, text); - StringBuilder_Append(&cbe.sb, "\n"); -} - -func CBE_Build(cbe: *CEmitter) -> String { - return StringBuilder_Build(&cbe.sb); -} - -// --------------------------------------------------------------------------- -// Emit HIR node -// --------------------------------------------------------------------------- - -func CBE_EmitExpr(cbe: *CEmitter, node: *HirNode) { - if node == null as *HirNode { return; } - let kind: int = node.kind; - - // Literal - if kind == hLit { - StringBuilder_Append(&cbe.sb, node.strValue); - return; - } - - // Variable - if kind == hVar { - StringBuilder_Append(&cbe.sb, node.strValue); - return; - } - - // Binary - if kind == hBinary { - CBE_EmitExpr(cbe, node.child1); - StringBuilder_Append(&cbe.sb, " "); - StringBuilder_Append(&cbe.sb, CBackend_OpToC(node.intValue)); - StringBuilder_Append(&cbe.sb, " "); - CBE_EmitExpr(cbe, node.child2); - return; - } - - // Unary - if kind == hUnary { - StringBuilder_Append(&cbe.sb, CBackend_OpToC(node.intValue)); - CBE_EmitExpr(cbe, node.child1); - return; - } - - // Call - if kind == hCall { - StringBuilder_Append(&cbe.sb, node.strValue); - StringBuilder_Append(&cbe.sb, "("); - if node.child1 != null as *HirNode { - CBE_EmitExpr(cbe, node.child1); - } - if node.child2 != null as *HirNode { - StringBuilder_Append(&cbe.sb, ", "); - CBE_EmitExpr(cbe, node.child2); - } - StringBuilder_Append(&cbe.sb, ")"); - return; - } - - // Return - if kind == hReturn { - StringBuilder_Append(&cbe.sb, "return"); - if node.child1 != null as *HirNode { - StringBuilder_Append(&cbe.sb, " "); - CBE_EmitExpr(cbe, node.child1); - } - return; - } - - // Alloca - if kind == hAlloca { - StringBuilder_Append(&cbe.sb, CBackend_TypeToC(tkInt)); // simplified type - StringBuilder_Append(&cbe.sb, " "); - StringBuilder_Append(&cbe.sb, node.strValue); - StringBuilder_Append(&cbe.sb, ";\n"); - return; - } - - // Store - if kind == hStore { - CBE_EmitExpr(cbe, node.child1); - StringBuilder_Append(&cbe.sb, " = "); - CBE_EmitExpr(cbe, node.child2); - return; - } - - // Cast - if kind == hCast { - StringBuilder_Append(&cbe.sb, "(("); - StringBuilder_Append(&cbe.sb, CBackend_TypeToC(tkPointer)); - StringBuilder_Append(&cbe.sb, ")"); - CBE_EmitExpr(cbe, node.child1); - StringBuilder_Append(&cbe.sb, ")"); - return; - } -} - -// --------------------------------------------------------------------------- -// Emit function declaration -// --------------------------------------------------------------------------- - -func CBE_EmitFuncDecl(cbe: *CEmitter, f: *HirFunc) { - // Return type - if String_Eq(f.retTypeName, "") || String_Eq(f.retTypeName, "void") { - StringBuilder_Append(&cbe.sb, "void "); - } else { - StringBuilder_Append(&cbe.sb, "int "); // simplified - } - - StringBuilder_Append(&cbe.sb, f.name); - StringBuilder_Append(&cbe.sb, "("); - - // Parameters - var i: int = 0; - while i < f.paramCount { - if i > 0 { - StringBuilder_Append(&cbe.sb, ", "); - } - StringBuilder_Append(&cbe.sb, "int "); // simplified param type - var pname: String = ""; - if i == 0 { pname = f.param0.name; } - if i == 1 { pname = f.param1.name; } - if i == 2 { pname = f.param2.name; } - if i == 3 { pname = f.param3.name; } - if i == 4 { pname = f.param4.name; } - if i == 5 { pname = f.param5.name; } - StringBuilder_Append(&cbe.sb, pname); - i = i + 1; - } - - StringBuilder_Append(&cbe.sb, ")"); -} - -// --------------------------------------------------------------------------- -// Generate complete C module -// --------------------------------------------------------------------------- - -func CBackend_Generate(mod: *HirModule) -> String { - let cbe: *CEmitter = bux_alloc(sizeof(CEmitter)) as *CEmitter; - cbe.sb = StringBuilder_NewCap(8192); - cbe.indent = 0; - - // Header - StringBuilder_Append(&cbe.sb, "// Generated by Bux C Backend\n"); - StringBuilder_Append(&cbe.sb, "#include \n"); - StringBuilder_Append(&cbe.sb, "#include \n"); - StringBuilder_Append(&cbe.sb, "#include \n"); - StringBuilder_Append(&cbe.sb, "#include \n"); - StringBuilder_Append(&cbe.sb, "#include \n\n"); - - // Extern declarations - var i: int = 0; - while i < mod.externCount { - CBE_EmitFuncDecl(cbe, &mod.externFuncs[i]); - StringBuilder_Append(&cbe.sb, ";\n"); - i = i + 1; - } - StringBuilder_Append(&cbe.sb, "\n"); - - // Function definitions - i = 0; - while i < mod.funcCount { - CBE_EmitFuncDecl(cbe, &mod.funcs[i]); - StringBuilder_Append(&cbe.sb, " {\n"); - // Body (simplified) - if mod.funcs[i].body != null as *HirNode { - StringBuilder_Append(&cbe.sb, " "); - CBE_EmitExpr(cbe, mod.funcs[i].body); - StringBuilder_Append(&cbe.sb, ";\n"); - } - StringBuilder_Append(&cbe.sb, " return 0;\n}\n\n"); - i = i + 1; - } - - return StringBuilder_Build(&cbe.sb); -} - -func CBackend_Free(cbe: *CEmitter) { - StringBuilder_Free(&cbe.sb); - bux_free(cbe as *void); -} -} diff --git a/_selfhost/src/cli.bux b/_selfhost/src/cli.bux deleted file mode 100644 index 970458c..0000000 --- a/_selfhost/src/cli.bux +++ /dev/null @@ -1,168 +0,0 @@ -// cli.bux — CLI driver for the Bux self-hosting compiler -// Wires together: Lexer → Parser → Sema → HirLower → CBackend -module Cli { - -extern func PrintLine(s: String); -extern func Print(s: String); -extern func ReadFile(path: String) -> String; -extern func WriteFile(path: String, content: String) -> bool; - -// Import the compiler pipeline -// In self-hosting mode, these are compiled together from src_bux/ - -// --------------------------------------------------------------------------- -// Compile a single .bux source file -// --------------------------------------------------------------------------- - -func Cli_Compile(source: String, sourceName: String) -> String { - // Phase 1: Lex - let lex: *Lexer = Lexer_Tokenize(source); - if Lexer_DiagCount(lex) > 0 { - PrintLine("Lex errors:"); - var i: int = 0; - while i < Lexer_DiagCount(lex) { - Print(" "); - PrintLine(lex.diags[i].message); - i = i + 1; - } - return ""; - } - - // Phase 2: Parse - let mod: *Module = Parser_Parse(lex.tokens, lex.tokenCount); - if mod == null as *Module { - PrintLine("Parse failed"); - return ""; - } - - // Phase 3: Semantic analysis - let sema: *Sema = Sema_Analyze(mod); - if Sema_HasError(sema) { - PrintLine("Sema errors:"); - var i: int = 0; - while i < Sema_DiagCount(sema) { - Print(" "); - PrintLine(sema.diags[i].message); - i = i + 1; - } - return ""; - } - - // Phase 4: HIR lowering - let hirMod: *HirModule = HirLower_LowerModule(mod, sema); - if hirMod == null as *HirModule { - PrintLine("HIR lowering failed"); - return ""; - } - - // Phase 5: C code generation - let cCode: String = CBackend_Generate(hirMod); - - // Cleanup - Lexer_Free(lex); - Sema_Free(sema); - - return cCode; -} - -// --------------------------------------------------------------------------- -// Build command -// --------------------------------------------------------------------------- - -func Cli_Build(srcPath: String, outPath: String) -> int { - let source: String = ReadFile(srcPath); - if String_Eq(source, "") || !FileExists(srcPath) { - Print("Error: cannot read source file: "); - PrintLine(srcPath); - return 1; - } - - Print("Compiling "); - PrintLine(srcPath); - - let cCode: String = Cli_Compile(source, srcPath); - - if String_Eq(cCode, "") { - PrintLine("Compilation failed"); - return 1; - } - - // Write C output - let ok: bool = WriteFile(outPath, cCode); - if ok { - Print(" → C code written to "); - PrintLine(outPath); - return 0; - } else { - PrintLine("Error: cannot write output file"); - return 1; - } -} - -// --------------------------------------------------------------------------- -// Check command (compile only, no output) -// --------------------------------------------------------------------------- - -func Cli_Check(srcPath: String) -> int { - let source: String = ReadFile(srcPath); - if String_Eq(source, "") { - PrintLine("Error: cannot read source file"); - return 1; - } - - let cCode: String = Cli_Compile(source, srcPath); - if String_Eq(cCode, "") { - return 1; - } - - PrintLine("Check passed"); - return 0; -} - -// --------------------------------------------------------------------------- -// Main entry — dispatch based on args -// --------------------------------------------------------------------------- - -func Cli_Run(args: *String, argCount: int) -> int { - if argCount < 2 { - PrintLine("Bux Self-Hosting Compiler v0.2.0"); - PrintLine("Usage: buxc [args]"); - PrintLine("Commands: build, check, run, version"); - PrintLine(""); - PrintLine("Pipeline modules:"); - PrintLine(" Lexer ✅ 695 lines"); - PrintLine(" Parser ✅ 1004 lines"); - PrintLine(" Sema ✅ 393 lines"); - PrintLine(" HirLower ✅ 307 lines"); - PrintLine(" CBackend ✅ 264 lines"); - PrintLine(" Total: 3830 lines of Bux"); - return 0; - } - - let cmd: String = args[1]; - if String_Eq(cmd, "version") { - PrintLine("Bux 0.2.0 (self-hosting bootstrap)"); - return 0; - } - - if String_Eq(cmd, "check") { - if argCount < 3 { - PrintLine("Usage: buxc check "); - return 1; - } - return Cli_Check(args[2]); - } - - if String_Eq(cmd, "build") { - let src: String = "src/Main.bux"; - let out: String = "build/main.c"; - if argCount >= 3 { src = args[2]; } - if argCount >= 4 { out = args[3]; } - return Cli_Build(src, out); - } - - Print("Unknown command: "); - PrintLine(cmd); - return 1; -} -} diff --git a/_selfhost/src/hir.bux b/_selfhost/src/hir.bux deleted file mode 100644 index b1886f3..0000000 --- a/_selfhost/src/hir.bux +++ /dev/null @@ -1,191 +0,0 @@ -// hir.bux — HIR (High-level Intermediate Representation) node types -module Hir { - -// HIR node kinds -const hLit: int = 0; -const hVar: int = 1; -const hSelf: int = 2; -const hUnary: int = 3; -const hBinary: int = 4; -const hAssign: int = 5; -const hIf: int = 6; -const hWhile: int = 7; -const hLoop: int = 8; -const hBreak: int = 9; -const hContinue: int = 10; -const hReturn: int = 11; -const hAlloca: int = 12; -const hLoad: int = 13; -const hStore: int = 14; -const hFieldPtr: int = 15; -const hArrowField: int = 16; -const hIndexPtr: int = 17; -const hCall: int = 18; -const hCallIndirect: int = 19; -const hCast: int = 20; -const hIs: int = 21; -const hSizeOf: int = 22; -const hBlock: int = 23; -const hStructInit: int = 24; -const hSliceInit: int = 25; -const hRange: int = 26; -const hTupleInit: int = 27; -const hMatch: int = 28; - -// --------------------------------------------------------------------------- -// HirNode — unified struct with tagged union pattern -// --------------------------------------------------------------------------- - -struct HirNode { - kind: int, - line: uint32, - column: uint32, - typeKind: int, - typeName: String, - // Common fields (used by multiple kinds) - strValue: String, // var name, callee name, field name, label - intValue: int, // token kind (for lit, unary op, binary op) - boolValue: bool, // range inclusive, isScope - // Child nodes (up to 3) - child1: *HirNode, // left/operand/condition/base - child2: *HirNode, // right/value/then/body - child3: *HirNode, // else/third - // Extra data pointer (for children arrays, field lists, etc.) - extraData: *void, - extraCount: int, -} - -// --------------------------------------------------------------------------- -// HirFunc -// --------------------------------------------------------------------------- - -struct HirParam { - name: String, - typeKind: int, - typeName: String, -} - -struct HirFunc { - name: String, - paramCount: int, - param0: HirParam, - param1: HirParam, - param2: HirParam, - param3: HirParam, - param4: HirParam, - param5: HirParam, - retTypeKind: int, - retTypeName: String, - body: *HirNode, - isPublic: bool, -} - -// --------------------------------------------------------------------------- -// HirEnumVariant -// --------------------------------------------------------------------------- - -struct HirEnumVariant { - name: String, - fieldCount: int, - fieldType0: int, - fieldName0: String, - fieldType1: int, - fieldName1: String, -} - -// --------------------------------------------------------------------------- -// HirModule -// --------------------------------------------------------------------------- - -struct HirModule { - funcCount: int, - funcs: *HirFunc, - externCount: int, - externFuncs: *HirFunc, - structCount: int, - enumCount: int, -} - -// --------------------------------------------------------------------------- -// Constructor helpers -// --------------------------------------------------------------------------- - -func Hir_MakeNode(kind: int, line: uint32, column: uint32) -> HirNode { - return HirNode { kind: kind, line: line, column: column, - typeKind: 0, typeName: "", - strValue: "", intValue: 0, boolValue: false, - child1: null as *HirNode, child2: null as *HirNode, child3: null as *HirNode, - extraData: null as *void, extraCount: 0 }; -} - -func Hir_MakeLit(tokKind: int, tokText: String, line: uint32, col: uint32) -> HirNode { - var n: HirNode = Hir_MakeNode(hLit, line, col); - n.intValue = tokKind; - n.strValue = tokText; - return n; -} - -func Hir_MakeVar(name: String, line: uint32, col: uint32) -> HirNode { - var n: HirNode = Hir_MakeNode(hVar, line, col); - n.strValue = name; - return n; -} - -func Hir_MakeBinary(op: int, left: *HirNode, right: *HirNode, line: uint32, col: uint32) -> HirNode { - var n: HirNode = Hir_MakeNode(hBinary, line, col); - n.intValue = op; - n.child1 = left; - n.child2 = right; - return n; -} - -func Hir_MakeCall(callee: String, line: uint32, col: uint32) -> HirNode { - var n: HirNode = Hir_MakeNode(hCall, line, col); - n.strValue = callee; - return n; -} - -func Hir_MakeReturn(value: *HirNode, line: uint32, col: uint32) -> HirNode { - var n: HirNode = Hir_MakeNode(hReturn, line, col); - n.child1 = value; - return n; -} - -func Hir_MakeBlock(line: uint32, col: uint32) -> HirNode { - return Hir_MakeNode(hBlock, line, col); -} - -func Hir_MakeIf(cond: *HirNode, thenBody: *HirNode, elseBody: *HirNode, line: uint32, col: uint32) -> HirNode { - var n: HirNode = Hir_MakeNode(hIf, line, col); - n.child1 = cond; - n.child2 = thenBody; - n.child3 = elseBody; - return n; -} - -func Hir_MakeWhile(cond: *HirNode, body: *HirNode, line: uint32, col: uint32) -> HirNode { - var n: HirNode = Hir_MakeNode(hWhile, line, col); - n.child1 = cond; - n.child2 = body; - return n; -} - -func Hir_MakeAlloca(name: String, line: uint32, col: uint32) -> HirNode { - var n: HirNode = Hir_MakeNode(hAlloca, line, col); - n.strValue = name; - return n; -} - -func Hir_MakeLoad(ptr: *HirNode, line: uint32, col: uint32) -> HirNode { - var n: HirNode = Hir_MakeNode(hLoad, line, col); - n.child1 = ptr; - return n; -} - -func Hir_MakeStore(ptr: *HirNode, value: *HirNode, line: uint32, col: uint32) -> HirNode { - var n: HirNode = Hir_MakeNode(hStore, line, col); - n.child1 = ptr; - n.child2 = value; - return n; -} -} diff --git a/_selfhost/src/hir_lower.bux b/_selfhost/src/hir_lower.bux deleted file mode 100644 index 7100706..0000000 --- a/_selfhost/src/hir_lower.bux +++ /dev/null @@ -1,309 +0,0 @@ -// hir_lower.bux — HIR lowering: AST → HIR transformation (ported from hir_lower.nim) -// Transforms the typed AST into a lower-level IR suitable for code generation. -module HirLower { - -// --------------------------------------------------------------------------- -// Lowering context -// --------------------------------------------------------------------------- -struct LowerCtx { - module: *Module, - scope: *Scope, - funcs: *HirFunc, - funcCount: int, - externFuncs: *HirFunc, - externCount: int, - varCounter: int, - tryCounter: int, -} - -// --------------------------------------------------------------------------- -// Fresh name generation -// --------------------------------------------------------------------------- - -func Lcx_FreshName(ctx: *LowerCtx) -> String { - ctx.varCounter = ctx.varCounter + 1; - return String_FromInt(ctx.varCounter as int64); -} - -// --------------------------------------------------------------------------- -// Type → HIR type -// --------------------------------------------------------------------------- - -func Lcx_LowerType(typeKind: int, typeName: String) -> int { - return typeKind; -} - -// --------------------------------------------------------------------------- -// Expression lowering -// --------------------------------------------------------------------------- - -func Lcx_LowerExpr(ctx: *LowerCtx, expr: *Expr) -> *HirNode { - if expr == null as *Expr { return null as *HirNode; } - - let line: uint32 = expr.line; - let col: uint32 = expr.column; - let n: *HirNode = bux_alloc(sizeof(HirNode)) as *HirNode; - n.kind = hBlock; - n.line = line; - n.column = col; - - let kind: int = expr.kind; - - // Literal - if kind == ekLiteral { - n.kind = hLit; - n.intValue = expr.tokKind; - n.strValue = expr.tokText; - return n; - } - - // Identifier → variable reference - if kind == ekIdent { - n.kind = hVar; - n.strValue = expr.strValue; - return n; - } - - // Binary - if kind == ekBinary { - n.kind = hBinary; - n.intValue = expr.intValue; // operator - n.child1 = Lcx_LowerExpr(ctx, expr.child1); - n.child2 = Lcx_LowerExpr(ctx, expr.child2); - return n; - } - - // Unary - if kind == ekUnary { - n.kind = hUnary; - n.intValue = expr.intValue; - n.child1 = Lcx_LowerExpr(ctx, expr.child1); - return n; - } - - // Call - if kind == ekCall { - n.kind = hCall; - // Get callee name - if expr.child1 != null as *Expr && expr.child1.kind == ekIdent { - n.strValue = expr.child1.strValue; - } - // Lower arguments - if expr.child2 != null as *Expr { - n.child1 = Lcx_LowerExpr(ctx, expr.child2); - } - if expr.child3 != null as *Expr { - n.child2 = Lcx_LowerExpr(ctx, expr.child3); - } - return n; - } - - // Field access - if kind == ekField { - n.kind = hFieldPtr; - n.child1 = Lcx_LowerExpr(ctx, expr.child1); - n.strValue = expr.strValue; - return n; - } - - // Return - if kind == ekReturn { - n.kind = hReturn; - n.child1 = Lcx_LowerExpr(ctx, expr.child1); - return n; - } - - // Cast - if kind == ekCast { - n.kind = hCast; - n.child1 = Lcx_LowerExpr(ctx, expr.child1); - return n; - } - - return n; -} - -// --------------------------------------------------------------------------- -// Statement lowering -// --------------------------------------------------------------------------- - -func Lcx_LowerStmt(ctx: *LowerCtx, stmt: *Stmt) -> *HirNode { - if stmt == null as *Stmt { return null as *HirNode; } - - let line: uint32 = stmt.line; - let col: uint32 = stmt.column; - let n: *HirNode = bux_alloc(sizeof(HirNode)) as *HirNode; - n.kind = hBlock; - n.line = line; - n.column = col; - - let kind: int = stmt.kind; - - // Let/var → alloca + store - if kind == skLet { - let init: *HirNode = Lcx_LowerExpr(ctx, stmt.child1); - // alloca for the variable - let alloca: *HirNode = bux_alloc(sizeof(HirNode)) as *HirNode; - alloca.kind = hAlloca; - alloca.line = line; - alloca.column = col; - alloca.strValue = stmt.strValue; - // store the init value - n.kind = hStore; - n.child1 = alloca; - n.child2 = init; - return n; - } - - // Return - if kind == skReturn { - n.kind = hReturn; - if stmt.child1 != null as *Expr { - n.child1 = Lcx_LowerExpr(ctx, stmt.child1); - } - return n; - } - - // Expression statement - if kind == skExpr && stmt.child1 != null as *Expr { - return Lcx_LowerExpr(ctx, stmt.child1); - } - - // If - if kind == skIf { - n.kind = hIf; - n.child1 = Lcx_LowerExpr(ctx, stmt.child1); // condition - if stmt.refStmtBlock != null as *Block { - n.child2 = Lcx_LowerBlock(ctx, stmt.refStmtBlock, -1); - } - if stmt.refStmtElse != null as *Block { - n.child3 = Lcx_LowerBlock(ctx, stmt.refStmtElse, -1); - } - return n; - } - - // While - if kind == skWhile { - n.kind = hWhile; - n.child1 = Lcx_LowerExpr(ctx, stmt.child1); - if stmt.refStmtBlock != null as *Block { - n.child2 = Lcx_LowerBlock(ctx, stmt.refStmtBlock, -1); - } - return n; - } - - // Loop - if kind == skLoop { - n.kind = hLoop; - if stmt.refStmtBlock != null as *Block { - n.child1 = Lcx_LowerBlock(ctx, stmt.refStmtBlock, -1); - } - return n; - } - - return n; -} - -// --------------------------------------------------------------------------- -// Block lowering -// --------------------------------------------------------------------------- - -func Lcx_LowerBlock(ctx: *LowerCtx, block: *Block, retTypeKind: int) -> *HirNode { - if block == null as *Block { return null as *HirNode; } - - // For simplicity, create a block node with first statement - let n: *HirNode = bux_alloc(sizeof(HirNode)) as *HirNode; - n.kind = hBlock; - n.line = block.line; - n.column = block.column; - n.boolValue = true; // isScope - - // In a full implementation, lower all statements - return n; -} - -// --------------------------------------------------------------------------- -// Function lowering -// --------------------------------------------------------------------------- - -func Lcx_LowerFunc(ctx: *LowerCtx, decl: *Decl) -> *HirFunc { - let f: *HirFunc = bux_alloc(sizeof(HirFunc)) as *HirFunc; - f.name = decl.strValue; - f.isPublic = decl.isPublic; - f.paramCount = decl.paramCount; - f.param0 = decl.param0; - f.param1 = decl.param1; - f.param2 = decl.param2; - f.param3 = decl.param3; - f.param4 = decl.param4; - f.param5 = decl.param5; - - if decl.retType != null as *TypeExpr { - f.retTypeName = decl.retType.typeName; - } else { - f.retTypeName = ""; - } - - if decl.refBody != null as *Block { - f.body = Lcx_LowerBlock(ctx, decl.refBody, -1); - } else { - f.body = null as *HirNode; - } - - return f; -} - -// --------------------------------------------------------------------------- -// Module lowering — main entry point -// --------------------------------------------------------------------------- - -func HirLower_LowerModule(mod: *Module, sema: *Sema) -> *HirModule { - let ctx: *LowerCtx = bux_alloc(sizeof(LowerCtx)) as *LowerCtx; - ctx.module = mod; - ctx.scope = sema.scope; - ctx.funcs = bux_alloc(256 as uint * sizeof(HirFunc)) as *HirFunc; - ctx.funcCount = 0; - ctx.externFuncs = bux_alloc(64 as uint * sizeof(HirFunc)) as *HirFunc; - ctx.externCount = 0; - ctx.varCounter = 0; - - let hm: *HirModule = bux_alloc(sizeof(HirModule)) as *HirModule; - hm.funcCount = 0; - hm.funcs = ctx.funcs; - - // Iterate declarations - var decl: *Decl = mod.firstItem; - while decl != null as *Decl { - if decl.kind == dkFunc { - let f: *HirFunc = Lcx_LowerFunc(ctx, decl); - ctx.funcs[ctx.funcCount] = f; - ctx.funcCount = ctx.funcCount + 1; - } - if decl.kind == dkExternFunc { - let f: *HirFunc = Lcx_LowerFunc(ctx, decl); - ctx.externFuncs[ctx.externCount] = f; - ctx.externCount = ctx.externCount + 1; - } - if decl.kind == dkStruct { - hm.structCount = hm.structCount + 1; - } - if decl.kind == dkEnum { - hm.enumCount = hm.enumCount + 1; - } - decl = decl.childDecl2; - } - - hm.funcCount = ctx.funcCount; - hm.funcs = ctx.funcs; - hm.externCount = ctx.externCount; - hm.externFuncs = ctx.externFuncs; - - return hm; -} - -func HirLower_Free(ctx: *LowerCtx) { - bux_free(ctx.funcs as *void); - bux_free(ctx.externFuncs as *void); - bux_free(ctx as *void); -} -} diff --git a/_selfhost/src/lexer.bux b/_selfhost/src/lexer.bux deleted file mode 100644 index b4f7f40..0000000 --- a/_selfhost/src/lexer.bux +++ /dev/null @@ -1,697 +0,0 @@ -// lexer.bux — Lexer state machine (ported from lexer.nim) -// Tokenizes Bux source into a stream of tokens. -module Lexer { - -extern func bux_strlen(s: String) -> uint; - -// --------------------------------------------------------------------------- -// Character helpers (wrap C ctype) -// --------------------------------------------------------------------------- - -func Lex_IsDigit(c: uint32) -> bool { - return c >= 48 && c <= 57; // '0'..'9' -} - -func Lex_IsHexDigit(c: uint32) -> bool { - if c >= 48 && c <= 57 { return true; } // 0-9 - if c >= 65 && c <= 70 { return true; } // A-F - if c >= 97 && c <= 102 { return true; } // a-f - return false; -} - -func Lex_IsBinDigit(c: uint32) -> bool { - return c == 48 || c == 49; // '0' or '1' -} - -func Lex_IsOctDigit(c: uint32) -> bool { - return c >= 48 && c <= 55; // '0'..'7' -} - -func Lex_IsIdentStart(c: uint32) -> bool { - if c >= 97 && c <= 122 { return true; } // a-z - if c >= 65 && c <= 90 { return true; } // A-Z - return c == 95; // '_' -} - -func Lex_IsIdentChar(c: uint32) -> bool { - if Lex_IsIdentStart(c) { return true; } - return Lex_IsDigit(c); -} - -// --------------------------------------------------------------------------- -// Lexer state -// --------------------------------------------------------------------------- - -const maxTokens: int = 4096; -const maxDiags: int = 128; - -struct LexerDiag { - line: uint32, - column: uint32, - message: String, -} - -struct Lexer { - source: String, - sourceLen: int, - pos: int, - line: uint32, - column: uint32, - startLine: uint32, - startColumn: uint32, - startPos: int, - tokenCount: int, - tokens: *LexToken, - diagCount: int, - diags: *LexerDiag, -} - -struct LexToken { - kind: int, - text: String, - line: uint32, - column: uint32, -} - -// --------------------------------------------------------------------------- -// Init -// --------------------------------------------------------------------------- - -func Lexer_Init(source: String) -> Lexer { - let len: uint = bux_strlen(source); - let tokBuf: *LexToken = bux_alloc(maxTokens as uint * sizeof(LexToken)) as *LexToken; - let diagBuf: *LexerDiag = bux_alloc(maxDiags as uint * sizeof(LexerDiag)) as *LexerDiag; - return Lexer { - source: source, sourceLen: len as int, - pos: 0, line: 1, column: 1, - startLine: 0, startColumn: 0, startPos: 0, - tokenCount: 0, tokens: tokBuf, - diagCount: 0, diags: diagBuf - }; -} - -// --------------------------------------------------------------------------- -// Core primitives -// --------------------------------------------------------------------------- - -func lexIsAtEnd(lex: *Lexer) -> bool { - return lex.pos >= lex.sourceLen; -} - -func lexPeek(lex: *Lexer, ahead: int) -> uint32 { - let i: int = lex.pos + ahead; - if i < lex.sourceLen { - return lex.source[i] as uint32; - } - return 0; -} - -func lexAdvance(lex: *Lexer) -> uint32 { - let c: uint32 = lexPeek(lex, 0); - if !lexIsAtEnd(lex) { - lex.pos = lex.pos + 1; - if c == 10 { // '\n' - lex.line = lex.line + 1; - lex.column = 1; - } else { - lex.column = lex.column + 1; - } - } - return c; -} - -func lexMatch(lex: *Lexer, expected: uint32) -> bool { - if lexIsAtEnd(lex) { return false; } - if lexPeek(lex, 0) != expected { return false; } - discard lexAdvance(lex); - return true; -} - -func lexMatchStr(lex: *Lexer, s: String) -> bool { - let len: uint = bux_strlen(s); - var i: int = 0; - while i < (len as int) { - if lexPeek(lex, i) != (s[i] as uint32) { - return false; - } - i = i + 1; - } - i = 0; - while i < (len as int) { - discard lexAdvance(lex); - i = i + 1; - } - return true; -} - -// --------------------------------------------------------------------------- -// Token emission -// --------------------------------------------------------------------------- - -func lexMarkStart(lex: *Lexer) { - lex.startLine = lex.line; - lex.startColumn = lex.column; - lex.startPos = lex.pos; -} - -func lexMakeToken(lex: *Lexer, kind: int) -> LexToken { - var text: String = ""; - let endPos: int = lex.pos; - let startPos: int = lex.startPos; - if endPos > startPos { - let len: int = endPos - startPos; - let buf: *char8 = bux_alloc((len + 1) as uint) as *char8; - var i: int = 0; - while i < len { - buf[i] = lex.source[startPos + i] as char8; - i = i + 1; - } - buf[len] = 0 as char8; - text = buf; - } else { - text = ""; - } - return LexToken { - kind: kind, text: text, - line: lex.startLine, column: lex.startColumn - }; -} - -func lexEmitToken(lex: *Lexer, kind: int) { - let tok: LexToken = lexMakeToken(lex, kind); - if lex.tokenCount < maxTokens { - lex.tokens[lex.tokenCount] = tok; - lex.tokenCount = lex.tokenCount + 1; - } -} - -func lexEmitDiag(lex: *Lexer, msg: String) { - if lex.diagCount < maxDiags { - lex.diags[lex.diagCount] = LexerDiag { - line: lex.line, column: lex.column, message: msg - }; - lex.diagCount = lex.diagCount + 1; - } -} - -// --------------------------------------------------------------------------- -// Whitespace / comments -// --------------------------------------------------------------------------- - -func lexSkipLineComment(lex: *Lexer) { - while !lexIsAtEnd(lex) && lexPeek(lex, 0) != 10 { // '\n' - discard lexAdvance(lex); - } -} - -func lexSkipBlockComment(lex: *Lexer) { - var depth: int = 1; - while !lexIsAtEnd(lex) && depth > 0 { - if lexPeek(lex, 0) == 47 && lexPeek(lex, 1) == 42 { // /* - discard lexAdvance(lex); - discard lexAdvance(lex); - depth = depth + 1; - } else if lexPeek(lex, 0) == 42 && lexPeek(lex, 1) == 47 { // */ - discard lexAdvance(lex); - discard lexAdvance(lex); - depth = depth - 1; - } else { - discard lexAdvance(lex); - } - } - if depth > 0 { - lexEmitDiag(lex, "unterminated block comment"); - } -} - -func lexSkipWhitespace(lex: *Lexer) { - while !lexIsAtEnd(lex) { - let c: uint32 = lexPeek(lex, 0); - if c == 32 || c == 9 || c == 13 { // space, tab, CR - discard lexAdvance(lex); - } else if c == 47 && lexPeek(lex, 1) == 47 { // // - lexSkipLineComment(lex); - } else if c == 47 && lexPeek(lex, 1) == 42 { // /* - discard lexAdvance(lex); - discard lexAdvance(lex); - lexSkipBlockComment(lex); - } else { - break; - } - } -} - -// --------------------------------------------------------------------------- -// Identifiers -// --------------------------------------------------------------------------- - -func lexIsIdentKind(tok: int) -> bool { - return tok == tkFunc || tok == tkLet || tok == tkVar || tok == tkConst - || tok == tkType || tok == tkStruct || tok == tkEnum || tok == tkUnion - || tok == tkInterface || tok == tkExtend || tok == tkModule || tok == tkImport - || tok == tkPub || tok == tkExtern || tok == tkIf || tok == tkElse - || tok == tkWhile || tok == tkDo || tok == tkLoop || tok == tkFor - || tok == tkIn || tok == tkBreak || tok == tkContinue || tok == tkReturn - || tok == tkMatch || tok == tkAs || tok == tkIs || tok == tkNull - || tok == tkSelf || tok == tkSuper; -} - -func lexKeywordKind(text: String) -> int { - if String_Eq(text, "true") { return tkBoolLiteral; } - if String_Eq(text, "false") { return tkBoolLiteral; } - if String_Eq(text, "func") { return tkFunc; } - if String_Eq(text, "let") { return tkLet; } - if String_Eq(text, "var") { return tkVar; } - if String_Eq(text, "const") { return tkConst; } - if String_Eq(text, "type") { return tkType; } - if String_Eq(text, "struct") { return tkStruct; } - if String_Eq(text, "enum") { return tkEnum; } - if String_Eq(text, "union") { return tkUnion; } - if String_Eq(text, "interface") { return tkInterface; } - if String_Eq(text, "extend") { return tkExtend; } - if String_Eq(text, "module") { return tkModule; } - if String_Eq(text, "import") { return tkImport; } - if String_Eq(text, "pub") { return tkPub; } - if String_Eq(text, "extern") { return tkExtern; } - if String_Eq(text, "if") { return tkIf; } - if String_Eq(text, "else") { return tkElse; } - if String_Eq(text, "while") { return tkWhile; } - if String_Eq(text, "do") { return tkDo; } - if String_Eq(text, "loop") { return tkLoop; } - if String_Eq(text, "for") { return tkFor; } - if String_Eq(text, "in") { return tkIn; } - if String_Eq(text, "break") { return tkBreak; } - if String_Eq(text, "continue") { return tkContinue; } - if String_Eq(text, "return") { return tkReturn; } - if String_Eq(text, "match") { return tkMatch; } - if String_Eq(text, "as") { return tkAs; } - if String_Eq(text, "is") { return tkIs; } - if String_Eq(text, "null") { return tkNull; } - if String_Eq(text, "self") { return tkSelf; } - if String_Eq(text, "super") { return tkSuper; } - if String_Eq(text, "sizeof") { return tkSizeOf; } - return tkIdent; -} - -func lexScanIdent(lex: *Lexer) { - lexMarkStart(lex); - while !lexIsAtEnd(lex) && Lex_IsIdentChar(lexPeek(lex, 0)) { - discard lexAdvance(lex); - } - let tok: LexToken = lexMakeToken(lex, tkIdent); - let kind: int = lexKeywordKind(tok.text); - tok.kind = kind; - if lex.tokenCount < maxTokens { - lex.tokens[lex.tokenCount] = tok; - lex.tokenCount = lex.tokenCount + 1; - } -} - -// --------------------------------------------------------------------------- -// Numbers -// --------------------------------------------------------------------------- - -func lexScanDigits(lex: *Lexer) { - while !lexIsAtEnd(lex) && Lex_IsDigit(lexPeek(lex, 0)) { - discard lexAdvance(lex); - } -} - -func lexScanHexDigits(lex: *Lexer) { - while !lexIsAtEnd(lex) && Lex_IsHexDigit(lexPeek(lex, 0)) { - discard lexAdvance(lex); - } -} - -func lexScanNumber(lex: *Lexer) { - lexMarkStart(lex); - var isFloat: bool = false; - - if lexPeek(lex, 0) == 48 { // '0' - let p1: uint32 = lexPeek(lex, 1); - if p1 == 120 || p1 == 88 || p1 == 98 || p1 == 66 || p1 == 111 || p1 == 79 { // x X b B o O - discard lexAdvance(lex); // 0 - discard lexAdvance(lex); // prefix - if p1 == 120 || p1 == 88 { lexScanHexDigits(lex); } - else if p1 == 98 || p1 == 66 { - while !lexIsAtEnd(lex) && Lex_IsBinDigit(lexPeek(lex, 0)) { - discard lexAdvance(lex); - } - } - else { - while !lexIsAtEnd(lex) && Lex_IsOctDigit(lexPeek(lex, 0)) { - discard lexAdvance(lex); - } - } - lexEmitToken(lex, tkIntLiteral); - return; - } - } - - lexScanDigits(lex); - - if lexPeek(lex, 0) == 46 && Lex_IsDigit(lexPeek(lex, 1)) { // . digit - isFloat = true; - discard lexAdvance(lex); // . - lexScanDigits(lex); - } - - let e: uint32 = lexPeek(lex, 0); - if e == 101 || e == 69 { // e E - isFloat = true; - discard lexAdvance(lex); - let sign: uint32 = lexPeek(lex, 0); - if sign == 43 || sign == 45 { discard lexAdvance(lex); } // + - - lexScanDigits(lex); - } - - if isFloat { - lexEmitToken(lex, tkFloatLiteral); - } else { - lexEmitToken(lex, tkIntLiteral); - } -} - -// --------------------------------------------------------------------------- -// Strings and chars -// --------------------------------------------------------------------------- - -func lexScanString(lex: *Lexer) { - lexMarkStart(lex); - if lexPeek(lex, 0) == 34 { discard lexAdvance(lex); } // opening " - while !lexIsAtEnd(lex) && lexPeek(lex, 0) != 34 { // closing " - if lexPeek(lex, 0) == 10 { // \n - lexEmitDiag(lex, "unterminated string literal"); - break; - } - if lexPeek(lex, 0) == 92 { // backslash - discard lexAdvance(lex); - if !lexIsAtEnd(lex) { discard lexAdvance(lex); } // skip escape char - } else { - discard lexAdvance(lex); - } - } - if lexIsAtEnd(lex) { - lexEmitDiag(lex, "unterminated string literal"); - } else { - discard lexAdvance(lex); // closing " - } - lexEmitToken(lex, tkStringLiteral); -} - -func lexScanChar(lex: *Lexer) { - lexMarkStart(lex); - if lexPeek(lex, 0) == 39 { discard lexAdvance(lex); } // opening ' - if lexIsAtEnd(lex) { - lexEmitDiag(lex, "unterminated char literal"); - lexEmitToken(lex, tkCharLiteral); - return; - } - if lexPeek(lex, 0) == 10 { // \n - lexEmitDiag(lex, "newline in char literal"); - } else if lexPeek(lex, 0) == 92 { // backslash - discard lexAdvance(lex); - if !lexIsAtEnd(lex) { discard lexAdvance(lex); } - } else { - discard lexAdvance(lex); - } - if lexIsAtEnd(lex) || lexPeek(lex, 0) != 39 { - lexEmitDiag(lex, "expected closing ' for char literal"); - } else { - discard lexAdvance(lex); // closing ' - } - lexEmitToken(lex, tkCharLiteral); -} - -// --------------------------------------------------------------------------- -// Symbols / operators -// --------------------------------------------------------------------------- - -func lexScanSymbol(lex: *Lexer) { - lexMarkStart(lex); - let c: uint32 = lexAdvance(lex); - - // Single-char tokens - if c == 40 { lexEmitToken(lex, tkLParen); return; } - if c == 41 { lexEmitToken(lex, tkRParen); return; } - if c == 123 { lexEmitToken(lex, tkLBrace); return; } - if c == 125 { lexEmitToken(lex, tkRBrace); return; } - if c == 91 { lexEmitToken(lex, tkLBracket); return; } - if c == 93 { lexEmitToken(lex, tkRBracket); return; } - if c == 44 { lexEmitToken(lex, tkComma); return; } - if c == 59 { lexEmitToken(lex, tkSemicolon); return; } - if c == 64 { lexEmitToken(lex, tkAt); return; } - if c == 63 { lexEmitToken(lex, tkQuestion); return; } - if c == 126 { lexEmitToken(lex, tkTilde); return; } - - // : :: - if c == 58 { - if lexMatch(lex, 58) { lexEmitToken(lex, tkColonColon); } - else { lexEmitToken(lex, tkColon); } - return; - } - - // . .. ... ..= - if c == 46 { - if lexPeek(lex, 0) == 46 && lexPeek(lex, 1) == 46 { - discard lexAdvance(lex); discard lexAdvance(lex); - lexEmitToken(lex, tkDotDotDot); return; - } - if lexPeek(lex, 0) == 46 && lexPeek(lex, 1) == 61 { - discard lexAdvance(lex); discard lexAdvance(lex); - lexEmitToken(lex, tkDotDotEqual); return; - } - if lexMatch(lex, 46) { lexEmitToken(lex, tkDotDot); return; } - lexEmitToken(lex, tkDot); return; - } - - // - -> -- -= - if c == 45 { - if lexMatch(lex, 62) { lexEmitToken(lex, tkArrow); return; } - if lexMatch(lex, 45) { lexEmitToken(lex, tkMinusMinus); return; } - if lexMatch(lex, 61) { lexEmitToken(lex, tkMinusAssign); return; } - lexEmitToken(lex, tkMinus); return; - } - - // + ++ += - if c == 43 { - if lexMatch(lex, 43) { lexEmitToken(lex, tkPlusPlus); return; } - if lexMatch(lex, 61) { lexEmitToken(lex, tkPlusAssign); return; } - lexEmitToken(lex, tkPlus); return; - } - - // * ** *= - if c == 42 { - if lexMatch(lex, 42) { lexEmitToken(lex, tkStarStar); return; } - if lexMatch(lex, 61) { lexEmitToken(lex, tkStarAssign); return; } - lexEmitToken(lex, tkStar); return; - } - - // / /= - if c == 47 { - if lexMatch(lex, 61) { lexEmitToken(lex, tkSlashAssign); return; } - lexEmitToken(lex, tkSlash); return; - } - - // % %= - if c == 37 { - if lexMatch(lex, 61) { lexEmitToken(lex, tkPercentAssign); return; } - lexEmitToken(lex, tkPercent); return; - } - - // = == => - if c == 61 { - if lexMatch(lex, 61) { lexEmitToken(lex, tkEq); return; } - if lexMatch(lex, 62) { lexEmitToken(lex, tkFatArrow); return; } - lexEmitToken(lex, tkAssign); return; - } - - // ! != - if c == 33 { - if lexMatch(lex, 61) { lexEmitToken(lex, tkNe); return; } - lexEmitToken(lex, tkBang); return; - } - - // < <= << <<= - if c == 60 { - if lexMatch(lex, 61) { lexEmitToken(lex, tkLe); return; } - if lexMatch(lex, 60) { - if lexMatch(lex, 61) { lexEmitToken(lex, tkShlAssign); return; } - lexEmitToken(lex, tkShl); return; - } - lexEmitToken(lex, tkLt); return; - } - - // > >= >> >>= - if c == 62 { - if lexMatch(lex, 61) { lexEmitToken(lex, tkGe); return; } - if lexMatch(lex, 62) { - if lexMatch(lex, 61) { lexEmitToken(lex, tkShrAssign); return; } - lexEmitToken(lex, tkShr); return; - } - lexEmitToken(lex, tkGt); return; - } - - // & && &= - if c == 38 { - if lexMatch(lex, 38) { lexEmitToken(lex, tkAmpAmp); return; } - if lexMatch(lex, 61) { lexEmitToken(lex, tkAmpAssign); return; } - lexEmitToken(lex, tkAmp); return; - } - - // | || |= - if c == 124 { - if lexMatch(lex, 124) { lexEmitToken(lex, tkPipePipe); return; } - if lexMatch(lex, 61) { lexEmitToken(lex, tkPipeAssign); return; } - lexEmitToken(lex, tkPipe); return; - } - - // ^ ^= - if c == 94 { - if lexMatch(lex, 61) { lexEmitToken(lex, tkCaretAssign); return; } - lexEmitToken(lex, tkCaret); return; - } - - // # intrinsics - if c == 35 { - if lexMatchStr(lex, "line") { lexEmitToken(lex, tkHashLine); return; } - if lexMatchStr(lex, "column") { lexEmitToken(lex, tkHashColumn); return; } - if lexMatchStr(lex, "file") { lexEmitToken(lex, tkHashFile); return; } - if lexMatchStr(lex, "function") { lexEmitToken(lex, tkHashFunction); return; } - if lexMatchStr(lex, "date") { lexEmitToken(lex, tkHashDate); return; } - if lexMatchStr(lex, "time") { lexEmitToken(lex, tkHashTime); return; } - if lexMatchStr(lex, "module") { lexEmitToken(lex, tkHashModule); return; } - lexEmitToken(lex, tkHash); return; - } - - lexEmitDiag(lex, "unexpected character"); - lexEmitToken(lex, tkUnknown); -} - -// --------------------------------------------------------------------------- -// Next token -// --------------------------------------------------------------------------- - -func lexNextToken(lex: *Lexer) { - lexSkipWhitespace(lex); - - if lexIsAtEnd(lex) { - lexMarkStart(lex); - lexEmitToken(lex, tkEndOfFile); - return; - } - - let c: uint32 = lexPeek(lex, 0); - - if c == 10 { // \n - lexMarkStart(lex); - discard lexAdvance(lex); - lexEmitToken(lex, tkNewLine); - return; - } - - // String prefixes: c8" c16" c32" - if c == 99 { // 'c' - let d: uint32 = lexPeek(lex, 1); - if d == 56 && lexPeek(lex, 2) == 34 { // c8" - discard lexAdvance(lex); discard lexAdvance(lex); // c 8 - lexScanString(lex); return; - } - if d == 49 && lexPeek(lex, 2) == 54 && lexPeek(lex, 3) == 34 { // c16" - discard lexAdvance(lex); discard lexAdvance(lex); discard lexAdvance(lex); - lexScanString(lex); return; - } - if d == 51 && lexPeek(lex, 2) == 50 && lexPeek(lex, 3) == 34 { // c32" - discard lexAdvance(lex); discard lexAdvance(lex); discard lexAdvance(lex); - lexScanString(lex); return; - } - } - - if c == 34 { // " - lexScanString(lex); return; - } - - // Char prefixes: c8' c16' c32' - if c == 99 { // 'c' - let d: uint32 = lexPeek(lex, 1); - if d == 56 && lexPeek(lex, 2) == 39 { // c8' - discard lexAdvance(lex); discard lexAdvance(lex); - lexScanChar(lex); return; - } - if d == 49 && lexPeek(lex, 2) == 54 && lexPeek(lex, 3) == 39 { // c16' - discard lexAdvance(lex); discard lexAdvance(lex); discard lexAdvance(lex); - lexScanChar(lex); return; - } - if d == 51 && lexPeek(lex, 2) == 50 && lexPeek(lex, 3) == 39 { // c32' - discard lexAdvance(lex); discard lexAdvance(lex); discard lexAdvance(lex); - lexScanChar(lex); return; - } - } - - if c == 39 { // ' - lexScanChar(lex); return; - } - - if Lex_IsIdentStart(c) { - lexScanIdent(lex); return; - } - - if Lex_IsDigit(c) { - lexScanNumber(lex); return; - } - - lexScanSymbol(lex); -} - -// --------------------------------------------------------------------------- -// Tokenize — main entry point -// --------------------------------------------------------------------------- - -func Lexer_Tokenize(source: String) -> *Lexer { - let lex: *Lexer = bux_alloc(sizeof(Lexer)) as *Lexer; - lex.source = source; - lex.sourceLen = bux_strlen(source) as int; - lex.pos = 0; - lex.line = 1; - lex.column = 1; - lex.startLine = 0; - lex.startColumn = 0; - lex.startPos = 0; - let tokBuf: *LexToken = bux_alloc(maxTokens as uint * sizeof(LexToken)) as *LexToken; - let diagBuf: *LexerDiag = bux_alloc(maxDiags as uint * sizeof(LexerDiag)) as *LexerDiag; - lex.tokens = tokBuf; - lex.diags = diagBuf; - lex.tokenCount = 0; - lex.diagCount = 0; - - while true { - lexNextToken(lex); - if lex.tokens[lex.tokenCount - 1].kind == tkEndOfFile { - break; - } - } - return lex; -} - -func Lexer_TokenCount(lex: *Lexer) -> int { - return lex.tokenCount; -} - -func Lexer_GetToken(lex: *Lexer, index: int) -> LexToken { - if index >= 0 && index < lex.tokenCount { - return lex.tokens[index]; - } - var empty: LexToken; - return empty; -} - -func Lexer_DiagCount(lex: *Lexer) -> int { - return lex.diagCount; -} - -func Lexer_Free(lex: *Lexer) { - bux_free(lex.tokens as *void); - bux_free(lex.diags as *void); - bux_free(lex as *void); -} -} diff --git a/_selfhost/src/main.bux b/_selfhost/src/main.bux deleted file mode 100644 index 181fe20..0000000 --- a/_selfhost/src/main.bux +++ /dev/null @@ -1,13 +0,0 @@ -// main.bux — Entry point for the Bux self-hosting compiler -module Main { - -// Forward declaration from Cli module -func Cli_Run(args: *String, argCount: int) -> int; - -func Main() -> int { - // In a full implementation, parse command-line arguments - // For now, just show version info - var emptyArgs: *String = null as *String; - return Cli_Run(emptyArgs, 0); -} -} diff --git a/_selfhost/src/manifest.bux b/_selfhost/src/manifest.bux deleted file mode 100644 index ef130bd..0000000 --- a/_selfhost/src/manifest.bux +++ /dev/null @@ -1,86 +0,0 @@ -// manifest.bux — Manifest parser for bux.toml files -// Parses package metadata: name, version, type, build output. -module Manifest { - -// --------------------------------------------------------------------------- -// Manifest struct -// --------------------------------------------------------------------------- -struct Manifest { - name: String, - version: String, - pkgType: String, - output: String, -} - -// --------------------------------------------------------------------------- -// Simple TOML parser (handles [Package] and [Build] sections) -// --------------------------------------------------------------------------- - -func Manifest_Parse(content: String) -> Manifest { - var m: Manifest; - m.name = ""; - m.version = "0.1.0"; - m.pkgType = "bin"; - m.output = "Bin"; - - if String_Eq(content, "") { return m; } - - var currentSection: String = ""; - let count: uint = String_SplitCount(content, "\n"); - var i: uint = 0; - while i < count { - let line: String = String_SplitPart(content, "\n", i); - - // Skip empty lines and comments - if String_Eq(line, "") { i = i + 1; continue; } - if String_StartsWith(line, "#") { i = i + 1; continue; } - - // Section header: [Section] - if String_StartsWith(line, "[") { - if String_StartsWith(line, "[Package]") { - currentSection = "Package"; - } else if String_StartsWith(line, "[Build]") { - currentSection = "Build"; - } else { - currentSection = ""; - } - i = i + 1; continue; - } - - // Key = Value - let eqCount: uint = String_SplitCount(line, "="); - if eqCount >= 2 { - let key: String = String_Trim(String_SplitPart(line, "=", 0)); - let rawVal: String = String_Trim(String_SplitPart(line, "=", 1)); - - // Strip quotes from value - var val: String = rawVal; - if String_StartsWith(val, "\"") && String_EndsWith(val, "\"") { - let len: uint = String_SplitCount(val, ""); // dummy to get length indirectly - // Simple strip: just use the string between quotes - val = String_Slice(rawVal, 1, String_SplitCount(rawVal, "") as uint - 2); - } - - if String_Eq(currentSection, "Package") { - if String_Eq(key, "Name") { m.name = val; } - if String_Eq(key, "Version") { m.version = val; } - if String_Eq(key, "Type") { m.pkgType = val; } - } else if String_Eq(currentSection, "Build") { - if String_Eq(key, "Output") { m.output = val; } - } - } - i = i + 1; - } - - return m; -} - -// --------------------------------------------------------------------------- -// Load manifest from file -// --------------------------------------------------------------------------- - -func Manifest_Load(path: String) -> Manifest { - let content: String = ReadFile(path); - return Manifest_Parse(content); -} -} diff --git a/_selfhost/src/parser.bux b/_selfhost/src/parser.bux deleted file mode 100644 index e8e34c3..0000000 --- a/_selfhost/src/parser.bux +++ /dev/null @@ -1,1006 +0,0 @@ -// parser.bux — Recursive descent parser (ported from parser.nim) -// Parses Bux source tokens into an AST. -module Parser { - -extern func bux_strlen(s: String) -> uint; - -// --------------------------------------------------------------------------- -// Parser state -// --------------------------------------------------------------------------- -struct Parser { - tokens: *LexToken, - tokenCount: int, - pos: int, - diagCount: int, - diags: *ParserDiag, - structInitAllowed: bool, -} - -struct ParserDiag { - line: uint32, - column: uint32, - message: String, -} - -// --------------------------------------------------------------------------- -// Token helpers -// --------------------------------------------------------------------------- - -func parserCurToken(p: *Parser) -> LexToken { - if p.pos < p.tokenCount { - return p.tokens[p.pos]; - } - var eof: LexToken; - eof.kind = tkEndOfFile; - eof.text = ""; - return eof; -} - -func parserPeek(p: *Parser, ahead: int) -> int { - let i: int = p.pos + ahead; - if i >= 0 && i < p.tokenCount { - return p.tokens[i].kind; - } - return tkEndOfFile; -} - -func parserAdvance(p: *Parser) -> LexToken { - let tok: LexToken = parserCurToken(p); - if p.pos < p.tokenCount { - p.pos = p.pos + 1; - } - return tok; -} - -func parserCheck(p: *Parser, kind: int) -> bool { - return parserPeek(p, 0) == kind; -} - -func parserMatch(p: *Parser, kind: int) -> bool { - if parserCheck(p, kind) { - discard parserAdvance(p); - return true; - } - return false; -} - -func parserPrevious(p: *Parser) -> LexToken { - if p.pos > 0 && p.pos <= p.tokenCount { - return p.tokens[p.pos - 1]; - } - var eof: LexToken; - eof.kind = tkEndOfFile; - return eof; -} - -func parserExpect(p: *Parser, kind: int, msg: String) -> LexToken { - if parserCheck(p, kind) { - return parserAdvance(p); - } - let tok: LexToken = parserCurToken(p); - p.diags[p.diagCount] = ParserDiag { - line: tok.line, column: tok.column, message: msg - }; - p.diagCount = p.diagCount + 1; - return tok; -} - -func parserEmitDiag(p: *Parser, line: uint32, col: uint32, msg: String) { - p.diags[p.diagCount] = ParserDiag { - line: line, column: col, message: msg - }; - p.diagCount = p.diagCount + 1; -} - -// --------------------------------------------------------------------------- -// Type parsing -// --------------------------------------------------------------------------- - -func parserParseType(p: *Parser) -> *TypeExpr { - let line: uint32 = parserCurToken(p).line; - let col: uint32 = parserCurToken(p).column; - let kindTok: int = parserPeek(p, 0); - - // *T (pointer) - if kindTok == tkStar { - discard parserAdvance(p); - let te: *TypeExpr = bux_alloc(sizeof(TypeExpr)) as *TypeExpr; - te.kind = tekPointer; - te.line = line; - te.column = col; - te.pointerPointee = parserParseType(p); - return te; - } - - // name - let nameTok: LexToken = parserExpect(p, tkIdent, "expected type name"); - let te: *TypeExpr = bux_alloc(sizeof(TypeExpr)) as *TypeExpr; - te.kind = tekNamed; - te.line = nameTok.line; - te.column = nameTok.column; - te.typeName = nameTok.text; - - // Optional type args - if parserCheck(p, tkLt) { - discard parserAdvance(p); // < - let arg0: LexToken = parserExpect(p, tkIdent, "expected type argument"); - te.typeArgName0 = arg0.text; - te.typeArgCount = 1; - if parserMatch(p, tkComma) { - let arg1: LexToken = parserExpect(p, tkIdent, "expected type argument"); - te.typeArgName1 = arg1.text; - te.typeArgCount = 2; - } - discard parserExpect(p, tkGt, "expected '>' to close type arguments"); - } - return te; -} - -// --------------------------------------------------------------------------- -// Forward declarations and helpers -// --------------------------------------------------------------------------- - -func parserParseExpr(p: *Parser) -> *Expr; -func parserParseStmt(p: *Parser) -> *Stmt; -func parserParseBlock(p: *Parser) -> *Block; - -func parserMakeExpr(kind: int, line: uint32, col: uint32) -> *Expr { - let e: *Expr = bux_alloc(sizeof(Expr)) as *Expr; - e.kind = kind; - e.line = line; - e.column = col; - e.strValue = ""; - e.intValue = 0; - e.boolValue = false; - e.tokKind = 0; - e.tokText = ""; - e.child1 = null as *Expr; - e.child2 = null as *Expr; - e.child3 = null as *Expr; - e.refType = null as *TypeExpr; - e.refBlock = null as *Block; - e.genericCallee = ""; - e.genericTypeArg0 = ""; - e.genericTypeArg1 = ""; - e.genericTypeArgCount = 0; - e.structName = ""; - e.structFieldCount = 0; - return e; -} - -// --------------------------------------------------------------------------- -// Primary expressions -// --------------------------------------------------------------------------- - -func parserParsePrimary(p: *Parser) -> *Expr { - let tok: LexToken = parserCurToken(p); - let line: uint32 = tok.line; - let col: uint32 = tok.column; - let kind: int = tok.kind; - - // Literals - if kind == tkIntLiteral || kind == tkFloatLiteral || kind == tkStringLiteral - || kind == tkCharLiteral || kind == tkBoolLiteral { - discard parserAdvance(p); - let e: *Expr = parserMakeExpr(ekLiteral, line, col); - e.tokKind = kind; - e.tokText = tok.text; - return e; - } - - // Identifier - if kind == tkIdent { - discard parserAdvance(p); - let e: *Expr = parserMakeExpr(ekIdent, line, col); - e.strValue = tok.text; - return e; - } - - // self - if kind == tkSelf { - discard parserAdvance(p); - return parserMakeExpr(ekSelf, line, col); - } - - // null - if kind == tkNull { - discard parserAdvance(p); - let e: *Expr = parserMakeExpr(ekLiteral, line, col); - e.tokKind = tkNull; - return e; - } - - // sizeof(Type) - if kind == tkSizeOf { - discard parserAdvance(p); - let e: *Expr = parserMakeExpr(ekSizeOf, line, col); - e.refType = parserParseType(p); - return e; - } - - // #intrinsics - if kind >= tkHashLine && kind <= tkHashModule { - discard parserAdvance(p); - let e: *Expr = parserMakeExpr(ekLiteral, line, col); - e.intValue = kind; - return e; - } - - // ( expr ) - if kind == tkLParen { - discard parserAdvance(p); - let e: *Expr = parserParseExpr(p); - discard parserExpect(p, tkRParen, "expected ')'"); - return e; - } - - // -expr, !expr, *expr, &expr - if kind == tkMinus || kind == tkBang || kind == tkStar || kind == tkAmp { - discard parserAdvance(p); - let e: *Expr = parserMakeExpr(ekUnary, line, col); - e.intValue = kind; - e.child1 = parserParsePrimary(p); - return e; - } - - parserEmitDiag(p, line, col, "expected expression"); - return parserMakeExpr(ekLiteral, line, col); -} - -// --------------------------------------------------------------------------- -// Postfix: call, index, field access, as, is, ? -// --------------------------------------------------------------------------- - -func parserParsePostfix(p: *Parser) -> *Expr { - var left: *Expr = parserParsePrimary(p); - - while true { - let kind: int = parserPeek(p, 0); - - // Call: expr(args) - if kind == tkLParen { - discard parserAdvance(p); - let line: uint32 = parserCurToken(p).line; - let col: uint32 = parserCurToken(p).column; - let e: *Expr = parserMakeExpr(ekCall, line, col); - e.child1 = left; - // Parse arguments (up to 8) - // child2 = first arg, child3 = second arg, extra = rest - if !parserCheck(p, tkRParen) { - e.child2 = parserParseExpr(p); - if parserMatch(p, tkComma) { - e.child3 = parserParseExpr(p); - } - } - discard parserExpect(p, tkRParen, "expected ')'"); - left = e; - continue; - } - - // Index: expr[expr] - if kind == tkLBracket { - discard parserAdvance(p); - let line: uint32 = parserCurToken(p).line; - let col: uint32 = parserCurToken(p).column; - let e: *Expr = parserMakeExpr(ekIndex, line, col); - e.child1 = left; - e.child2 = parserParseExpr(p); - discard parserExpect(p, tkRBracket, "expected ']'"); - left = e; - continue; - } - - // Field: expr.name - if kind == tkDot { - discard parserAdvance(p); - let line: uint32 = parserCurToken(p).line; - let col: uint32 = parserCurToken(p).column; - let name: LexToken = parserExpect(p, tkIdent, "expected field name"); - let e: *Expr = parserMakeExpr(ekField, line, col); - e.child1 = left; - e.strValue = name.text; - left = e; - continue; - } - - // as, is - if kind == tkAs || kind == tkIs { - discard parserAdvance(p); - let line: uint32 = parserCurToken(p).line; - let col: uint32 = parserCurToken(p).column; - let ek: int = 0; - if kind == tkAs { ek = ekCast; } else { ek = ekIs; } - let e: *Expr = parserMakeExpr(ek, line, col); - e.child1 = left; - e.refType = parserParseType(p); - left = e; - continue; - } - - // ? (try operator) - if kind == tkQuestion { - discard parserAdvance(p); - let line: uint32 = parserCurToken(p).line; - let col: uint32 = parserCurToken(p).column; - let e: *Expr = parserMakeExpr(ekTry, line, col); - e.child1 = left; - left = e; - continue; - } - - // ++, -- - if kind == tkPlusPlus || kind == tkMinusMinus { - discard parserAdvance(p); - let line: uint32 = parserCurToken(p).line; - let col: uint32 = parserCurToken(p).column; - let e: *Expr = parserMakeExpr(ekPostfix, line, col); - e.child1 = left; - e.intValue = kind; - left = e; - continue; - } - - break; - } - return left; -} - -// --------------------------------------------------------------------------- -// Binary expression (precedence climbing) -// All binary operators: arithmetic, comparison, logical, bitwise, assignment -// --------------------------------------------------------------------------- - -func parserIsBinaryOp(kind: int) -> bool { - if kind >= tkPlus && kind <= tkStarStar { return true; } // arithmetic - if kind == tkAmp || kind == tkPipe || kind == tkCaret { return true; } // bitwise (no &|) - if kind >= tkShl && kind <= tkShrAssign { return true; } // shift + assign - if kind >= tkEq && kind <= tkGe { return true; } // comparison - if kind == tkAmpAmp || kind == tkPipePipe { return true; } // logical - if kind >= tkAssign && kind <= tkShrAssign { return true; } // all assigns - if kind == tkDotDot || kind == tkDotDotEqual { return true; } // range - return false; -} - -func parserParseBinary(p: *Parser) -> *Expr { - var left: *Expr = parserParsePostfix(p); - - while parserIsBinaryOp(parserPeek(p, 0)) { - let opTok: LexToken = parserAdvance(p); - let line: uint32 = opTok.line; - let col: uint32 = opTok.column; - let right: *Expr = parserParsePostfix(p); - let e: *Expr = parserMakeExpr(ekBinary, line, col); - e.intValue = opTok.kind; - e.child1 = left; - e.child2 = right; - left = e; - } - return left; -} - -// --------------------------------------------------------------------------- -// Ternary: cond ? then : else -// --------------------------------------------------------------------------- - -func parserParseTernary(p: *Parser) -> *Expr { - var left: *Expr = parserParseBinary(p); - if parserMatch(p, tkQuestion) { - let thenExpr: *Expr = parserParseExpr(p); - discard parserExpect(p, tkColon, "expected ':' in ternary"); - let elseExpr: *Expr = parserParseExpr(p); - let e: *Expr = parserMakeExpr(ekTernary, left.line, left.column); - e.child1 = left; - e.child2 = thenExpr; - e.child3 = elseExpr; - return e; - } - return left; -} - -// --------------------------------------------------------------------------- -// Top-level expression -// --------------------------------------------------------------------------- - -func parserParseExpr(p: *Parser) -> *Expr { - return parserParseTernary(p); -} - -// --------------------------------------------------------------------------- -// Statements -// --------------------------------------------------------------------------- - -func parserParseStmt(p: *Parser) -> *Stmt { - let tok: LexToken = parserCurToken(p); - let line: uint32 = tok.line; - let col: uint32 = tok.column; - let kind: int = tok.kind; - - // let / var - if kind == tkLet || kind == tkVar { - let isVar: bool = (kind == tkVar); - discard parserAdvance(p); - let nameTok: LexToken = parserExpect(p, tkIdent, "expected variable name"); - var typeExpr: *TypeExpr = null as *TypeExpr; - if parserMatch(p, tkColon) { - typeExpr = parserParseType(p); - } - discard parserExpect(p, tkAssign, "expected '=' in let/var statement"); - let init: *Expr = parserParseExpr(p); - parserMatch(p, tkSemicolon); // optional ; - - let s: *Stmt = bux_alloc(sizeof(Stmt)) as *Stmt; - s.kind = skLet; - s.line = line; - s.column = col; - s.strValue = nameTok.text; - s.boolValue = isVar; - s.child1 = init; - s.refStmtType = typeExpr; - return s; - } - - // if - if kind == tkIf { - discard parserAdvance(p); - let cond: *Expr = parserParseExpr(p); - let thenBlock: *Block = parserParseBlock(p); - var elseBlock: *Block = null as *Block; - if parserMatch(p, tkElse) { - if parserCheck(p, tkIf) { - // else if → recursively parse an if stmt inside else - elseBlock = parserParseBlock(p); - } else { - elseBlock = parserParseBlock(p); - } - } - let s: *Stmt = bux_alloc(sizeof(Stmt)) as *Stmt; - s.kind = skIf; - s.line = line; - s.column = col; - s.child1 = cond; - s.refStmtBlock = thenBlock; - s.refStmtElse = elseBlock; - return s; - } - - // while - if kind == tkWhile { - discard parserAdvance(p); - let cond: *Expr = parserParseExpr(p); - let body: *Block = parserParseBlock(p); - let s: *Stmt = bux_alloc(sizeof(Stmt)) as *Stmt; - s.kind = skWhile; - s.line = line; - s.column = col; - s.child1 = cond; - s.refStmtBlock = body; - return s; - } - - // loop - if kind == tkLoop { - discard parserAdvance(p); - let body: *Block = parserParseBlock(p); - let s: *Stmt = bux_alloc(sizeof(Stmt)) as *Stmt; - s.kind = skLoop; - s.line = line; - s.column = col; - s.refStmtBlock = body; - return s; - } - - // for - if kind == tkFor { - discard parserAdvance(p); - let varName: LexToken = parserExpect(p, tkIdent, "expected loop variable"); - discard parserExpect(p, tkIn, "expected 'in'"); - let iter: *Expr = parserParseExpr(p); - let body: *Block = parserParseBlock(p); - let s: *Stmt = bux_alloc(sizeof(Stmt)) as *Stmt; - s.kind = skFor; - s.line = line; - s.column = col; - s.strValue = varName.text; - s.child1 = iter; - s.refStmtBlock = body; - return s; - } - - // return - if kind == tkReturn { - discard parserAdvance(p); - var value: *Expr = null as *Expr; - if !parserCheck(p, tkSemicolon) && !parserCheck(p, tkNewLine) && !parserCheck(p, tkRBrace) { - value = parserParseExpr(p); - } - parserMatch(p, tkSemicolon); - let s: *Stmt = bux_alloc(sizeof(Stmt)) as *Stmt; - s.kind = skReturn; - s.line = line; - s.column = col; - s.child1 = value; - return s; - } - - // break / continue - if kind == tkBreak || kind == tkContinue { - let sk: int = 0; - if kind == tkBreak { sk = skBreak; } else { sk = skContinue; } - discard parserAdvance(p); - parserMatch(p, tkSemicolon); - let s: *Stmt = bux_alloc(sizeof(Stmt)) as *Stmt; - s.kind = sk; - s.line = line; - s.column = col; - return s; - } - - // match - if kind == tkMatch { - discard parserAdvance(p); - let subject: *Expr = parserParseExpr(p); - discard parserExpect(p, tkLBrace, "expected '{' to start match body"); - // Skip match body (simplified — just parse arms as empty) - while !parserCheck(p, tkRBrace) && parserPeek(p, 0) != tkEndOfFile { - if parserCheck(p, tkNewLine) { discard parserAdvance(p); continue; } - discard parserParseExpr(p); // pattern - if parserMatch(p, tkFatArrow) { - discard parserParseExpr(p); // body - } - } - discard parserExpect(p, tkRBrace, "expected '}' to close match"); - let s: *Stmt = bux_alloc(sizeof(Stmt)) as *Stmt; - s.kind = skMatch; - s.line = line; - s.column = col; - s.child1 = subject; - return s; - } - - // Expression statement - if kind == tkNewLine || kind == tkSemicolon { - discard parserAdvance(p); - return null as *Stmt; - } - - let expr: *Expr = parserParseExpr(p); - parserMatch(p, tkSemicolon); - let s: *Stmt = bux_alloc(sizeof(Stmt)) as *Stmt; - s.kind = skExpr; - s.line = line; - s.column = col; - s.child1 = expr; - return s; -} - -// --------------------------------------------------------------------------- -// Block: { stmt* } -// --------------------------------------------------------------------------- - -func parserParseBlock(p: *Parser) -> *Block { - discard parserExpect(p, tkLBrace, "expected '{'"); - let b: *Block = bux_alloc(sizeof(Block)) as *Block; - b.line = parserCurToken(p).line; - b.column = parserCurToken(p).column; - b.stmtCount = 0; - - while !parserCheck(p, tkRBrace) && parserPeek(p, 0) != tkEndOfFile { - if parserCheck(p, tkNewLine) || parserCheck(p, tkSemicolon) { - discard parserAdvance(p); - continue; - } - let s: *Stmt = parserParseStmt(p); - if s != null as *Stmt { - b.stmtCount = b.stmtCount + 1; - } - } - discard parserExpect(p, tkRBrace, "expected '}'"); - return b; -} - -// --------------------------------------------------------------------------- -// Function parameters -// --------------------------------------------------------------------------- - -func parserParseParamList(p: *Parser) -> *Decl { - let d: *Decl = bux_alloc(sizeof(Decl)) as *Decl; - d.kind = dkFunc; - d.paramCount = 0; - - discard parserExpect(p, tkLParen, "expected '('"); - while !parserCheck(p, tkRParen) && parserPeek(p, 0) != tkEndOfFile { - if d.paramCount >= 6 { break; } - let nameTok: LexToken = parserExpect(p, tkIdent, "expected parameter name"); - discard parserExpect(p, tkColon, "expected ':' in parameter"); - let ptype: *TypeExpr = parserParseType(p); - - if d.paramCount == 0 { - d.param0.name = nameTok.text; - d.param0.refParamType = ptype; - } else if d.paramCount == 1 { - d.param1.name = nameTok.text; - d.param1.refParamType = ptype; - } else if d.paramCount == 2 { - d.param2.name = nameTok.text; - d.param2.refParamType = ptype; - } else if d.paramCount == 3 { - d.param3.name = nameTok.text; - d.param3.refParamType = ptype; - } else if d.paramCount == 4 { - d.param4.name = nameTok.text; - d.param4.refParamType = ptype; - } else if d.paramCount == 5 { - d.param5.name = nameTok.text; - d.param5.refParamType = ptype; - } - d.paramCount = d.paramCount + 1; - - if parserMatch(p, tkComma) { continue; } - break; - } - discard parserExpect(p, tkRParen, "expected ')'"); - return d; -} - -// --------------------------------------------------------------------------- -// Declarations -// --------------------------------------------------------------------------- - -func parserParseFuncDecl(p: *Parser, isPublic: bool, isExtern: bool) -> *Decl { - let line: uint32 = parserCurToken(p).line; - let col: uint32 = parserCurToken(p).column; - discard parserExpect(p, tkFunc, "expected 'func'"); - - let nameTok: LexToken = parserExpect(p, tkIdent, "expected function name"); - let d: *Decl = bux_alloc(sizeof(Decl)) as *Decl; - d.kind = dkFunc; - d.line = line; - d.column = col; - d.isPublic = isPublic; - d.strValue = nameTok.text; - - // Type params - if parserCheck(p, tkLt) { - discard parserAdvance(p); - let tp0: LexToken = parserExpect(p, tkIdent, "expected type param"); - d.typeParam0 = tp0.text; - d.typeParamCount = 1; - if parserMatch(p, tkComma) { - let tp1: LexToken = parserExpect(p, tkIdent, "expected type param"); - d.typeParam1 = tp1.text; - d.typeParamCount = 2; - } - discard parserExpect(p, tkGt, "expected '>'"); - } - - // Params - let params: *Decl = parserParseParamList(p); - d.paramCount = params.paramCount; - d.param0 = params.param0; - d.param1 = params.param1; - d.param2 = params.param2; - d.param3 = params.param3; - d.param4 = params.param4; - d.param5 = params.param5; - - // Return type - if parserMatch(p, tkArrow) { - d.retType = parserParseType(p); - } - - // Body - if !isExtern && parserCheck(p, tkLBrace) { - d.refBody = parserParseBlock(p); - } else { - d.refBody = null as *Block; - } - - return d; -} - -func parserParseStructDecl(p: *Parser, isPublic: bool) -> *Decl { - let line: uint32 = parserCurToken(p).line; - let col: uint32 = parserCurToken(p).column; - discard parserExpect(p, tkStruct, "expected 'struct'"); - let nameTok: LexToken = parserExpect(p, tkIdent, "expected struct name"); - - let d: *Decl = bux_alloc(sizeof(Decl)) as *Decl; - d.kind = dkStruct; - d.line = line; - d.column = col; - d.isPublic = isPublic; - d.strValue = nameTok.text; - - // Type params - if parserCheck(p, tkLt) { - discard parserAdvance(p); - let tp0: LexToken = parserExpect(p, tkIdent, "expected type param"); - d.typeParam0 = tp0.text; - d.typeParamCount = 1; - if parserMatch(p, tkComma) { - let tp1: LexToken = parserExpect(p, tkIdent, "expected type param"); - d.typeParam1 = tp1.text; - d.typeParamCount = 2; - } - discard parserExpect(p, tkGt, "expected '>'"); - } - - discard parserExpect(p, tkLBrace, "expected '{'"); - while !parserCheck(p, tkRBrace) && parserPeek(p, 0) != tkEndOfFile { - if d.fieldCount >= 8 { break; } - if parserCheck(p, tkNewLine) { discard parserAdvance(p); continue; } - let fName: LexToken = parserExpect(p, tkIdent, "expected field name"); - discard parserExpect(p, tkColon, "expected ':' in struct field"); - let fType: *TypeExpr = parserParseType(p); - parserMatch(p, tkSemicolon); - - if d.fieldCount == 0 { - d.field0.name = fName.text; - d.field0.refFieldType = fType; - } else if d.fieldCount == 1 { - d.field1.name = fName.text; - d.field1.refFieldType = fType; - } else if d.fieldCount == 2 { - d.field2.name = fName.text; - d.field2.refFieldType = fType; - } else if d.fieldCount == 3 { - d.field3.name = fName.text; - d.field3.refFieldType = fType; - } - d.fieldCount = d.fieldCount + 1; - } - discard parserExpect(p, tkRBrace, "expected '}'"); - return d; -} - -func parserParseEnumDecl(p: *Parser, isPublic: bool) -> *Decl { - let line: uint32 = parserCurToken(p).line; - let col: uint32 = parserCurToken(p).column; - discard parserExpect(p, tkEnum, "expected 'enum'"); - let nameTok: LexToken = parserExpect(p, tkIdent, "expected enum name"); - - let d: *Decl = bux_alloc(sizeof(Decl)) as *Decl; - d.kind = dkEnum; - d.line = line; - d.column = col; - d.isPublic = isPublic; - d.strValue = nameTok.text; - - discard parserExpect(p, tkLBrace, "expected '{'"); - while !parserCheck(p, tkRBrace) && parserPeek(p, 0) != tkEndOfFile { - if d.variantCount >= 8 { break; } - if parserCheck(p, tkNewLine) || parserCheck(p, tkSemicolon) { discard parserAdvance(p); continue; } - let vName: LexToken = parserExpect(p, tkIdent, "expected variant name"); - - var v: EnumVariant; - v.name = vName.text; - - // Optional (Type, Type) data - if parserMatch(p, tkLParen) { - let t0: LexToken = parserExpect(p, tkIdent, "expected data type"); - v.fieldTypeName0 = t0.text; - v.fieldCount = 1; - if parserMatch(p, tkComma) { - let t1: LexToken = parserExpect(p, tkIdent, "expected data type"); - v.fieldTypeName1 = t1.text; - v.fieldCount = 2; - } - discard parserExpect(p, tkRParen, "expected ')'"); - } - - if d.variantCount == 0 { d.variant0 = v; } - else if d.variantCount == 1 { d.variant1 = v; } - else if d.variantCount == 2 { d.variant2 = v; } - else if d.variantCount == 3 { d.variant3 = v; } - d.variantCount = d.variantCount + 1; - - parserMatch(p, tkComma); - if parserCheck(p, tkNewLine) { discard parserAdvance(p); } - } - discard parserExpect(p, tkRBrace, "expected '}'"); - return d; -} - -func parserParseImportDecl(p: *Parser, isPublic: bool) -> *Decl { - let line: uint32 = parserCurToken(p).line; - let col: uint32 = parserCurToken(p).column; - discard parserExpect(p, tkImport, "expected 'import'"); - - let d: *Decl = bux_alloc(sizeof(Decl)) as *Decl; - d.kind = dkUse; - d.line = line; - d.column = col; - d.isPublic = isPublic; - - // Parse path: Std::Io::PrintLine - var pathStr: String = ""; - var segCount: int = 0; - while parserCheck(p, tkIdent) || (segCount > 0 && parserCheck(p, tkColonColon)) { - if segCount > 0 { - discard parserAdvance(p); // :: - if pathStr.len > 0 { - let tmp: *char8 = bux_alloc(256) as *char8; - // Append to path string (simplified) - pathStr = String_Concat(pathStr, "::"); - } - } - let seg: LexToken = parserExpect(p, tkIdent, "expected module path segment"); - pathStr = String_Concat(pathStr, seg.text); - segCount = segCount + 1; - } - d.usePath = pathStr; - - // Optional ::{name1, name2} - if parserMatch(p, tkColonColon) && parserCheck(p, tkLBrace) { - discard parserAdvance(p); // { - var names: String = ""; - while !parserCheck(p, tkRBrace) && parserPeek(p, 0) != tkEndOfFile { - let n: LexToken = parserExpect(p, tkIdent, "expected import name"); - names = String_Concat(names, n.text); - names = String_Concat(names, ","); - if !parserMatch(p, tkComma) { break; } - } - discard parserExpect(p, tkRBrace, "expected '}'"); - d.useNames = names; - d.useKind = 2; // ukMulti - } else { - d.useKind = 0; // ukSingle - } - - parserMatch(p, tkSemicolon); - return d; -} - -func parserParseExternDecl(p: *Parser, isPublic: bool) -> *Decl { - let line: uint32 = parserCurToken(p).line; - let col: uint32 = parserCurToken(p).column; - discard parserExpect(p, tkExtern, "expected 'extern'"); - - if parserCheck(p, tkFunc) { - let d: *Decl = parserParseFuncDecl(p, isPublic, true); - d.kind = dkExternFunc; - return d; - } - - let d: *Decl = bux_alloc(sizeof(Decl)) as *Decl; - d.kind = dkExternFunc; - d.line = line; - d.column = col; - d.isPublic = isPublic; - return d; -} - -// --------------------------------------------------------------------------- -// Top-level declaration -// --------------------------------------------------------------------------- - -func parserParseDecl(p: *Parser) -> *Decl { - let isPublic: bool = parserMatch(p, tkPub); - let kind: int = parserPeek(p, 0); - - if kind == tkFunc { return parserParseFuncDecl(p, isPublic, false); } - if kind == tkStruct { return parserParseStructDecl(p, isPublic); } - if kind == tkEnum { return parserParseEnumDecl(p, isPublic); } - if kind == tkImport { return parserParseImportDecl(p, isPublic); } - if kind == tkExtern { return parserParseExternDecl(p, isPublic); } - - if kind == tkExtend { - discard parserAdvance(p); - let line: uint32 = parserCurToken(p).line; - let col: uint32 = parserCurToken(p).column; - let typeName: LexToken = parserExpect(p, tkIdent, "expected type name"); - - let d: *Decl = bux_alloc(sizeof(Decl)) as *Decl; - d.kind = dkImpl; - d.line = line; - d.column = col; - d.isPublic = isPublic; - d.strValue = typeName.text; - - // Optional - if parserCheck(p, tkLt) { - discard parserAdvance(p); - let tp0: LexToken = parserExpect(p, tkIdent, "expected type param"); - d.typeParam0 = tp0.text; - d.typeParamCount = 1; - discard parserExpect(p, tkGt, "expected '>'"); - } - - discard parserExpect(p, tkLBrace, "expected '{'"); - while !parserCheck(p, tkRBrace) && parserPeek(p, 0) != tkEndOfFile { - if parserCheck(p, tkNewLine) { discard parserAdvance(p); continue; } - if parserCheck(p, tkFunc) { - let m: *Decl = parserParseFuncDecl(p, false, false); - // Store method in linked list - if d.methodCount == 0 { - d.childDecl1 = m; - } else if d.methodCount == 1 { - d.childDecl2 = m; - } - d.methodCount = d.methodCount + 1; - } else { - break; - } - } - discard parserExpect(p, tkRBrace, "expected '}'"); - return d; - } - - if kind == tkModule { - discard parserAdvance(p); - let name: LexToken = parserExpect(p, tkIdent, "expected module name"); - parserMatch(p, tkSemicolon); - let d: *Decl = bux_alloc(sizeof(Decl)) as *Decl; - d.kind = dkModule; - d.strValue = name.text; - return d; - } - - if kind == tkConst { - discard parserAdvance(p); - let name: LexToken = parserExpect(p, tkIdent, "expected const name"); - discard parserExpect(p, tkColon, "expected ':'"); - let ct: *TypeExpr = parserParseType(p); - discard parserExpect(p, tkAssign, "expected '='"); - let val: *Expr = parserParseExpr(p); - parserMatch(p, tkSemicolon); - let d: *Decl = bux_alloc(sizeof(Decl)) as *Decl; - d.kind = dkConst; - d.strValue = name.text; - d.constType = ct; - d.constValue = val; - return d; - } - - // Skip unknown declarations - while parserPeek(p, 0) != tkEndOfFile && parserPeek(p, 0) != tkNewLine && parserPeek(p, 0) != tkRBrace { - discard parserAdvance(p); - } - return null as *Decl; -} - -// --------------------------------------------------------------------------- -// Module parsing -// --------------------------------------------------------------------------- - -func Parser_Parse(tokens: *LexToken, tokenCount: int) -> *Module { - let p: *Parser = bux_alloc(sizeof(Parser)) as *Parser; - p.tokens = tokens; - p.tokenCount = tokenCount; - p.pos = 0; - p.structInitAllowed = true; - let diagBuf: *ParserDiag = bux_alloc(256 as uint * sizeof(ParserDiag)) as *ParserDiag; - p.diags = diagBuf; - p.diagCount = 0; - - let mod: *Module = bux_alloc(sizeof(Module)) as *Module; - mod.name = ""; - mod.itemCount = 0; - mod.firstItem = null as *Decl; - - // Parse declarations until EOF - while parserPeek(p, 0) != tkEndOfFile { - if parserCheck(p, tkNewLine) || parserCheck(p, tkSemicolon) { - discard parserAdvance(p); - continue; - } - let decl: *Decl = parserParseDecl(p); - if decl != null as *Decl { - decl.childDecl2 = mod.firstItem; // push front - mod.firstItem = decl; - mod.itemCount = mod.itemCount + 1; - } - } - - return mod; -} - -func Parser_DiagCount(p: *Parser) -> int { - return p.diagCount; -} - -func Parser_Free(p: *Parser) { - bux_free(p.diags as *void); - bux_free(p as *void); -} -} diff --git a/_selfhost/src/scope.bux b/_selfhost/src/scope.bux deleted file mode 100644 index 062d359..0000000 --- a/_selfhost/src/scope.bux +++ /dev/null @@ -1,93 +0,0 @@ -// scope.bux — Symbol table with parent-chain lookup -module Scope { - -// Symbol kinds -const skVar: int = 0; -const skFunc: int = 1; -const skType: int = 2; -const skConst: int = 3; -const skModule: int = 4; - -// Maximum symbols per scope -const maxSymbols: int = 256; - -struct Symbol { - kind: int, - name: String, - typeKind: int, - typeName: String, - isMutable: bool, - isPublic: bool, -} - -struct Scope { - symbols: *Symbol, - count: int, - parent: *Scope, -} - -// --------------------------------------------------------------------------- -// Scope operations -// --------------------------------------------------------------------------- - -func Scope_New() -> Scope { - let sz: uint = maxSymbols as uint * sizeof(Symbol); - let data: *Symbol = bux_alloc(sz) as *Symbol; - return Scope { symbols: data, count: 0, parent: null as *Scope }; -} - -func Scope_NewChild(parent: *Scope) -> Scope { - let sz: uint = maxSymbols as uint * sizeof(Symbol); - let data: *Symbol = bux_alloc(sz) as *Symbol; - return Scope { symbols: data, count: 0, parent: parent }; -} - -func Scope_Define(scope: *Scope, sym: Symbol) -> bool { - // Check local scope for duplicates - var i: int = 0; - while i < scope.count { - if String_Eq(scope.symbols[i].name, sym.name) { - return false; - } - i = i + 1; - } - if scope.count < maxSymbols { - scope.symbols[scope.count] = sym; - scope.count = scope.count + 1; - return true; - } - return false; -} - -func Scope_Lookup(scope: *Scope, name: String) -> Symbol { - var cur: *Scope = scope; - while cur != null as *Scope { - var i: int = 0; - while i < cur.count { - if String_Eq(cur.symbols[i].name, name) { - return cur.symbols[i]; - } - i = i + 1; - } - cur = cur.parent; - } - var empty: Symbol; - return empty; -} - -func Scope_LookupLocal(scope: *Scope, name: String) -> Symbol { - var i: int = 0; - while i < scope.count { - if String_Eq(scope.symbols[i].name, name) { - return scope.symbols[i]; - } - i = i + 1; - } - var empty: Symbol; - return empty; -} - -func Scope_Free(scope: *Scope) { - bux_free(scope.symbols as *void); -} -} diff --git a/_selfhost/src/sema.bux b/_selfhost/src/sema.bux deleted file mode 100644 index 1a31e09..0000000 --- a/_selfhost/src/sema.bux +++ /dev/null @@ -1,395 +0,0 @@ -// sema.bux — Semantic analysis (type checker, ported from sema.nim) -// Validates types, resolves identifiers, checks function calls. -module Sema { - -// --------------------------------------------------------------------------- -// Sema context -// --------------------------------------------------------------------------- -struct Sema { - module: *Module, - scope: *Scope, - typeTable: *StringMap, - methodTable: *StringMap, - diagCount: int, - diags: *SemaDiag, - hasError: bool, -} - -struct SemaDiag { - line: uint32, - column: uint32, - message: String, -} - -// --------------------------------------------------------------------------- -// Diagnostics -// --------------------------------------------------------------------------- - -func Sema_EmitError(sema: *Sema, line: uint32, col: uint32, msg: String) { - if sema.diagCount < 256 { - sema.diags[sema.diagCount] = SemaDiag { line: line, column: col, message: msg }; - sema.diagCount = sema.diagCount + 1; - } - sema.hasError = true; -} - -// --------------------------------------------------------------------------- -// Type resolution from TypeExpr → Type constants -// --------------------------------------------------------------------------- - -func Sema_ResolveType(sema: *Sema, te: *TypeExpr) -> int { - if te == null as *TypeExpr { return tkUnknown; } - let name: String = te.typeName; - - if te.kind == tekPointer { - return tkPointer; - } - - if String_Eq(name, "void") { return tkVoid; } - if String_Eq(name, "bool") { return tkBool; } - if String_Eq(name, "bool8") { return tkBool8; } - if String_Eq(name, "bool16") { return tkBool16; } - if String_Eq(name, "bool32") { return tkBool32; } - if String_Eq(name, "char8") { return tkChar8; } - if String_Eq(name, "char16") { return tkChar16; } - if String_Eq(name, "char32") { return tkChar32; } - if String_Eq(name, "String") { return tkStr; } - if String_Eq(name, "str") { return tkStr; } - if String_Eq(name, "int8") { return tkInt8; } - if String_Eq(name, "int16") { return tkInt16; } - if String_Eq(name, "int32") { return tkInt32; } - if String_Eq(name, "int64") { return tkInt64; } - if String_Eq(name, "int") { return tkInt; } - if String_Eq(name, "uint8") { return tkUInt8; } - if String_Eq(name, "uint16") { return tkUInt16; } - if String_Eq(name, "uint32") { return tkUInt32; } - if String_Eq(name, "uint64") { return tkUInt64; } - if String_Eq(name, "uint") { return tkUInt; } - if String_Eq(name, "float32") { return tkFloat32; } - if String_Eq(name, "float64") { return tkFloat64; } - if String_Eq(name, "float") { return tkFloat64; } - - // Check type table for user-defined types - if sema.typeTable != null as *StringMap { - if StringMap_Has(sema.typeTable, name) { - return tkNamed; - } - } - return tkNamed; // assume named type -} - -// --------------------------------------------------------------------------- -// Type predicates -// --------------------------------------------------------------------------- - -func Sema_IsNumeric(kind: int) -> bool { - if kind == tkUnknown || kind == tkNamed || kind == tkTypeParam { return true; } - return kind >= tkInt8 && kind <= tkUInt64; -} - -func Sema_IsBool(kind: int) -> bool { - return kind == tkBool || kind == tkBool8 || kind == tkBool16 || kind == tkBool32; -} - -func Sema_TypeName(kind: int) -> String { - if kind == tkUnknown { return "?"; } - if kind == tkVoid { return "void"; } - if kind == tkBool { return "bool"; } - if kind == tkInt { return "int"; } - if kind == tkInt64 { return "int64"; } - if kind == tkUInt { return "uint"; } - if kind == tkFloat64 { return "float64"; } - if kind == tkStr { return "String"; } - if kind == tkPointer { return "*ptr"; } - if kind == tkNamed { return "user-type"; } - if kind == tkTypeParam { return "type-param"; } - return "?"; -} - -// --------------------------------------------------------------------------- -// Expression type checking -// --------------------------------------------------------------------------- - -func Sema_CheckExpr(sema: *Sema, expr: *Expr) -> int { - if expr == null as *Expr { return tkUnknown; } - let kind: int = expr.kind; - - // Literal - if kind == ekLiteral { - let tk: int = expr.tokKind; - if tk == tkIntLiteral { return tkInt; } - if tk == tkFloatLiteral { return tkFloat64; } - if tk == tkStringLiteral { return tkStr; } - if tk == tkBoolLiteral { return tkBool; } - if tk == tkCharLiteral { return tkChar32; } - if tk == tkNull { return tkPointer; } - return tkUnknown; - } - - // Identifier — look up in scope - if kind == ekIdent { - let sym: Symbol = Scope_Lookup(sema.scope, expr.strValue); - if sym.kind == 0 && !String_Eq(sym.name, expr.strValue) { - Sema_EmitError(sema, expr.line, expr.column, "undeclared identifier"); - return tkUnknown; - } - return sym.typeKind; - } - - // Binary - if kind == ekBinary { - let left: int = Sema_CheckExpr(sema, expr.child1); - let right: int = Sema_CheckExpr(sema, expr.child2); - let op: int = expr.intValue; - - // Comparison operators return bool - if op >= tkEq && op <= tkGe { return tkBool; } - // Logical operators return bool - if op == tkAmpAmp || op == tkPipePipe || op == tkBang { return tkBool; } - // Arithmetic returns wider type - if !Sema_IsNumeric(left) || !Sema_IsNumeric(right) { - Sema_EmitError(sema, expr.line, expr.column, "arithmetic requires numeric operands"); - } - if left == tkFloat64 || right == tkFloat64 { return tkFloat64; } - return tkInt; - } - - // Unary - if kind == ekUnary { - let operand: int = Sema_CheckExpr(sema, expr.child1); - let op: int = expr.intValue; - if op == tkBang { return tkBool; } - if op == tkStar { return tkUnknown; } // dereference — resolve pointee - if op == tkAmp { return tkPointer; } - return operand; - } - - // Call - if kind == ekCall { - let callee: int = Sema_CheckExpr(sema, expr.child1); - if callee == tkUnknown { return tkUnknown; } - // Assume callee returns same type (simplified) - return callee; - } - - // Ternary - if kind == ekTernary { - return Sema_CheckExpr(sema, expr.child2); // then type - } - - // Cast — return target type - if kind == ekCast { - if expr.refType != null as *TypeExpr { - return Sema_ResolveType(sema, expr.refType); - } - return tkUnknown; - } - - // Try (?) - if kind == ekTry { - let inner: int = Sema_CheckExpr(sema, expr.child1); - return inner; // simplified - } - - return tkUnknown; -} - -// --------------------------------------------------------------------------- -// Statement checking -// --------------------------------------------------------------------------- - -func Sema_CheckStmt(sema: *Sema, stmt: *Stmt) { - if stmt == null as *Stmt { return; } - let kind: int = stmt.kind; - - // Let/var - if kind == skLet { - let initType: int = Sema_CheckExpr(sema, stmt.child1); - // Register variable in scope - var sym: Symbol; - sym.kind = skVar; - sym.name = stmt.strValue; - sym.typeKind = initType; - sym.isMutable = stmt.boolValue; - sym.isPublic = false; - discard Scope_Define(sema.scope, sym); - return; - } - - // Return - if kind == skReturn { - if stmt.child1 != null as *Expr { - discard Sema_CheckExpr(sema, stmt.child1); - } - return; - } - - // If - if kind == skIf { - let condType: int = Sema_CheckExpr(sema, stmt.child1); - if !Sema_IsBool(condType) && condType != tkUnknown { - Sema_EmitError(sema, stmt.line, stmt.column, "if condition must be bool"); - } - return; - } - - // While - if kind == skWhile { - let condType: int = Sema_CheckExpr(sema, stmt.child1); - if !Sema_IsBool(condType) && condType != tkUnknown { - Sema_EmitError(sema, stmt.line, stmt.column, "while condition must be bool"); - } - return; - } - - // Expression statement - if kind == skExpr && stmt.child1 != null as *Expr { - discard Sema_CheckExpr(sema, stmt.child1); - return; - } -} - -// --------------------------------------------------------------------------- -// Collect globals (register functions, structs, enums in scope) -// --------------------------------------------------------------------------- - -func Sema_CollectGlobals(sema: *Sema) { - var decl: *Decl = sema.module.firstItem; - while decl != null as *Decl { - let dk: int = decl.kind; - - // Function - if dk == dkFunc { - var sym: Symbol; - sym.kind = skFunc; - sym.name = decl.strValue; - sym.typeKind = tkFunc; - sym.isPublic = decl.isPublic; - discard Scope_Define(sema.scope, sym); - } - - // Struct - if dk == dkStruct { - var sym: Symbol; - sym.kind = skType; - sym.name = decl.strValue; - sym.typeKind = tkNamed; - sym.isPublic = decl.isPublic; - discard Scope_Define(sema.scope, sym); - } - - // Enum - if dk == dkEnum { - var sym: Symbol; - sym.kind = skType; - sym.name = decl.strValue; - sym.typeKind = tkNamed; - sym.isPublic = decl.isPublic; - discard Scope_Define(sema.scope, sym); - } - - // Extern function - if dk == dkExternFunc { - var sym: Symbol; - sym.kind = skFunc; - sym.name = decl.strValue; - sym.typeKind = tkFunc; - sym.isPublic = true; - discard Scope_Define(sema.scope, sym); - } - - decl = decl.childDecl2; - } -} - -// --------------------------------------------------------------------------- -// Analyze — main entry point -// --------------------------------------------------------------------------- - -func Sema_Analyze(mod: *Module) -> *Sema { - let s: *Sema = bux_alloc(sizeof(Sema)) as *Sema; - s.module = mod; - s.scope = bux_alloc(sizeof(Scope)) as *Scope; - s.scope.symbols = bux_alloc(256 as uint * sizeof(Symbol)) as *Symbol; - s.scope.count = 0; - s.scope.parent = null as *Scope; - s.hasError = false; - s.diagCount = 0; - s.diags = bux_alloc(256 as uint * sizeof(SemaDiag)) as *SemaDiag; - s.typeTable = null as *StringMap; - s.methodTable = null as *StringMap; - - // First pass: collect globals - Sema_CollectGlobals(s); - - // Second pass: check function bodies - var decl: *Decl = mod.firstItem; - while decl != null as *Decl { - if decl.kind == dkFunc && decl.refBody != null as *Block { - // Create function scope (child of global) - var funcScope: Scope = Scope_NewChild(s.scope); - - // Add type params to scope - if decl.typeParamCount >= 1 { - var tpSym: Symbol; - tpSym.kind = skType; - tpSym.name = decl.typeParam0; - tpSym.typeKind = tkTypeParam; - discard Scope_Define(&funcScope, tpSym); - } - if decl.typeParamCount >= 2 { - var tpSym2: Symbol; - tpSym2.kind = skType; - tpSym2.name = decl.typeParam1; - tpSym2.typeKind = tkTypeParam; - discard Scope_Define(&funcScope, tpSym2); - } - - // Add parameters to scope - var i: int = 0; - while i < decl.paramCount { - var pSym: Symbol; - pSym.kind = skVar; - pSym.typeKind = tkInt; // simplified - pSym.isMutable = false; - if i == 0 { pSym.name = decl.param0.name; } - else if i == 1 { pSym.name = decl.param1.name; } - else if i == 2 { pSym.name = decl.param2.name; } - else if i == 3 { pSym.name = decl.param3.name; } - else if i == 4 { pSym.name = decl.param4.name; } - else if i == 5 { pSym.name = decl.param5.name; } - discard Scope_Define(&funcScope, pSym); - i = i + 1; - } - - // Switch to function scope and check body statements - let prevScope: *Scope = s.scope; - s.scope = &funcScope; - - // Check body (simplified — just count statements) - var stmtCount: int = decl.refBody.stmtCount; - // In a full implementation, iterate statements and check each - - s.scope = prevScope; - } - decl = decl.childDecl2; - } - - return s; -} - -func Sema_HasError(sema: *Sema) -> bool { - return sema.hasError; -} - -func Sema_DiagCount(sema: *Sema) -> int { - return sema.diagCount; -} - -func Sema_Free(sema: *Sema) { - bux_free(sema.scope.symbols as *void); - bux_free(sema.scope as *void); - bux_free(sema.diags as *void); - bux_free(sema as *void); -} -} diff --git a/_selfhost/src/source_location.bux b/_selfhost/src/source_location.bux deleted file mode 100644 index 3ab88e6..0000000 --- a/_selfhost/src/source_location.bux +++ /dev/null @@ -1,13 +0,0 @@ -// source_location.bux — Source position tracking -module SourceLocation { - -struct SourceLocation { - line: uint32, - column: uint32, - offset: uint32, -} - -func SourceLocation_New(line: uint32, column: uint32, offset: uint32) -> SourceLocation { - return SourceLocation { line: line, column: column, offset: offset }; -} -} diff --git a/_selfhost/src/token.bux b/_selfhost/src/token.bux deleted file mode 100644 index ec72d66..0000000 --- a/_selfhost/src/token.bux +++ /dev/null @@ -1,314 +0,0 @@ -// token.bux — Token kinds and helpers -module Token { - -// --------------------------------------------------------------------------- -// TokenKind enum -// --------------------------------------------------------------------------- - -// Literals -const tkIntLiteral: int = 0; -const tkFloatLiteral: int = 1; -const tkStringLiteral: int = 2; -const tkCharLiteral: int = 3; -const tkBoolLiteral: int = 4; - -// Identifiers -const tkIdent: int = 5; -const tkUnderscore: int = 6; - -// Control flow keywords -const tkIf: int = 7; -const tkElse: int = 8; -const tkWhile: int = 9; -const tkDo: int = 10; -const tkLoop: int = 11; -const tkFor: int = 12; -const tkIn: int = 13; -const tkBreak: int = 14; -const tkContinue: int = 15; -const tkReturn: int = 16; -const tkMatch: int = 17; - -// Declaration keywords -const tkFunc: int = 18; -const tkLet: int = 19; -const tkVar: int = 20; -const tkConst: int = 21; -const tkType: int = 22; -const tkStruct: int = 23; -const tkEnum: int = 24; -const tkUnion: int = 25; -const tkInterface: int = 26; -const tkExtend: int = 27; -const tkModule: int = 28; -const tkImport: int = 29; -const tkPub: int = 30; -const tkExtern: int = 31; - -// Other keywords -const tkAs: int = 32; -const tkIs: int = 33; -const tkNull: int = 34; -const tkSelf: int = 35; -const tkSuper: int = 36; -const tkSizeOf: int = 37; - -// Punctuation -const tkLParen: int = 38; -const tkRParen: int = 39; -const tkLBrace: int = 40; -const tkRBrace: int = 41; -const tkLBracket: int = 42; -const tkRBracket: int = 43; -const tkComma: int = 44; -const tkSemicolon: int = 45; -const tkColon: int = 46; -const tkColonColon: int = 47; -const tkDot: int = 48; -const tkDotDot: int = 49; -const tkDotDotDot: int = 50; -const tkDotDotEqual: int = 51; -const tkArrow: int = 52; -const tkFatArrow: int = 53; -const tkAt: int = 54; -const tkHash: int = 55; -const tkQuestion: int = 56; - -// Arithmetic operators -const tkPlus: int = 57; -const tkMinus: int = 58; -const tkStar: int = 59; -const tkSlash: int = 60; -const tkPercent: int = 61; -const tkStarStar: int = 62; -const tkPlusPlus: int = 63; -const tkMinusMinus: int = 64; - -// Bitwise operators -const tkAmp: int = 65; -const tkPipe: int = 66; -const tkCaret: int = 67; -const tkTilde: int = 68; -const tkShl: int = 69; -const tkShr: int = 70; - -// Logical operators -const tkAmpAmp: int = 71; -const tkPipePipe: int = 72; -const tkBang: int = 73; - -// Comparison operators -const tkEq: int = 74; -const tkNe: int = 75; -const tkLt: int = 76; -const tkLe: int = 77; -const tkGt: int = 78; -const tkGe: int = 79; - -// Assignment operators -const tkAssign: int = 80; -const tkPlusAssign: int = 81; -const tkMinusAssign: int = 82; -const tkStarAssign: int = 83; -const tkSlashAssign: int = 84; -const tkPercentAssign: int = 85; -const tkAmpAssign: int = 86; -const tkPipeAssign: int = 87; -const tkCaretAssign: int = 88; -const tkShlAssign: int = 89; -const tkShrAssign: int = 90; - -// Compile-time intrinsics -const tkHashLine: int = 91; -const tkHashColumn: int = 92; -const tkHashFile: int = 93; -const tkHashFunction: int = 94; -const tkHashDate: int = 95; -const tkHashTime: int = 96; -const tkHashModule: int = 97; - -// Special -const tkOwn: int = 98; -const tkNewLine: int = 99; -const tkEndOfFile: int = 100; -const tkUnknown: int = 101; - -// --------------------------------------------------------------------------- -// Token struct -// --------------------------------------------------------------------------- - -struct Token { - kind: int, - text: String, - line: uint32, - column: uint32, - offset: uint32, -} - -// --------------------------------------------------------------------------- -// Helpers -// --------------------------------------------------------------------------- - -func Token_IsKeyword(kind: int) -> bool { - if kind >= tkIf && kind <= tkIn { return true; } - if kind >= tkBreak && kind <= tkMatch { return true; } - if kind >= tkFunc && kind <= tkExtern { return true; } - if kind >= tkAs && kind <= tkSuper { return true; } - return false; -} - -func Token_IsLiteral(kind: int) -> bool { - if kind >= tkIntLiteral && kind <= tkBoolLiteral { return true; } - return false; -} - -func Token_IsOperator(kind: int) -> bool { - if kind >= tkPlus && kind <= tkShrAssign { return true; } - return false; -} - -func Token_IsEof(kind: int) -> bool { - return kind == tkEndOfFile; -} - -func Token_KeywordKind(text: String) -> int { - if String_Eq(text, "func") { return tkFunc; } - if String_Eq(text, "let") { return tkLet; } - if String_Eq(text, "var") { return tkVar; } - if String_Eq(text, "const") { return tkConst; } - if String_Eq(text, "type") { return tkType; } - if String_Eq(text, "struct") { return tkStruct; } - if String_Eq(text, "enum") { return tkEnum; } - if String_Eq(text, "union") { return tkUnion; } - if String_Eq(text, "interface") { return tkInterface; } - if String_Eq(text, "extend") { return tkExtend; } - if String_Eq(text, "module") { return tkModule; } - if String_Eq(text, "import") { return tkImport; } - if String_Eq(text, "pub") { return tkPub; } - if String_Eq(text, "extern") { return tkExtern; } - if String_Eq(text, "if") { return tkIf; } - if String_Eq(text, "else") { return tkElse; } - if String_Eq(text, "while") { return tkWhile; } - if String_Eq(text, "do") { return tkDo; } - if String_Eq(text, "loop") { return tkLoop; } - if String_Eq(text, "for") { return tkFor; } - if String_Eq(text, "in") { return tkIn; } - if String_Eq(text, "break") { return tkBreak; } - if String_Eq(text, "continue") { return tkContinue; } - if String_Eq(text, "return") { return tkReturn; } - if String_Eq(text, "match") { return tkMatch; } - if String_Eq(text, "as") { return tkAs; } - if String_Eq(text, "is") { return tkIs; } - if String_Eq(text, "null") { return tkNull; } - if String_Eq(text, "self") { return tkSelf; } - if String_Eq(text, "super") { return tkSuper; } - if String_Eq(text, "sizeof") { return tkSizeOf; } - if String_Eq(text, "true") { return tkBoolLiteral; } - if String_Eq(text, "false") { return tkBoolLiteral; } - return tkIdent; -} - -func Token_KindName(kind: int) -> String { - if kind == tkIntLiteral { return "integer literal"; } - if kind == tkFloatLiteral { return "float literal"; } - if kind == tkStringLiteral { return "string literal"; } - if kind == tkCharLiteral { return "char literal"; } - if kind == tkBoolLiteral { return "boolean literal"; } - if kind == tkIdent { return "identifier"; } - if kind == tkUnderscore { return "_"; } - if kind == tkSizeOf { return "sizeof"; } - if kind == tkIf { return "if"; } - if kind == tkElse { return "else"; } - if kind == tkWhile { return "while"; } - if kind == tkDo { return "do"; } - if kind == tkLoop { return "loop"; } - if kind == tkFor { return "for"; } - if kind == tkIn { return "in"; } - if kind == tkBreak { return "break"; } - if kind == tkContinue { return "continue"; } - if kind == tkReturn { return "return"; } - if kind == tkMatch { return "match"; } - if kind == tkFunc { return "func"; } - if kind == tkLet { return "let"; } - if kind == tkVar { return "var"; } - if kind == tkConst { return "const"; } - if kind == tkType { return "type"; } - if kind == tkStruct { return "struct"; } - if kind == tkEnum { return "enum"; } - if kind == tkUnion { return "union"; } - if kind == tkInterface { return "interface"; } - if kind == tkExtend { return "extend"; } - if kind == tkModule { return "module"; } - if kind == tkImport { return "import"; } - if kind == tkPub { return "pub"; } - if kind == tkExtern { return "extern"; } - if kind == tkAs { return "as"; } - if kind == tkIs { return "is"; } - if kind == tkNull { return "null"; } - if kind == tkSelf { return "self"; } - if kind == tkSuper { return "super"; } - if kind == tkLParen { return "("; } - if kind == tkRParen { return ")"; } - if kind == tkLBrace { return "{"; } - if kind == tkRBrace { return "}"; } - if kind == tkLBracket { return "["; } - if kind == tkRBracket { return "]"; } - if kind == tkComma { return ","; } - if kind == tkSemicolon { return ";"; } - if kind == tkColon { return ":"; } - if kind == tkColonColon { return "::"; } - if kind == tkDot { return "."; } - if kind == tkDotDot { return ".."; } - if kind == tkDotDotDot { return "..."; } - if kind == tkDotDotEqual { return "..="; } - if kind == tkArrow { return "->"; } - if kind == tkFatArrow { return "=>"; } - if kind == tkAt { return "@"; } - if kind == tkHash { return "#"; } - if kind == tkQuestion { return "?"; } - if kind == tkPlus { return "+"; } - if kind == tkMinus { return "-"; } - if kind == tkStar { return "*"; } - if kind == tkSlash { return "/"; } - if kind == tkPercent { return "%"; } - if kind == tkStarStar { return "**"; } - if kind == tkPlusPlus { return "++"; } - if kind == tkMinusMinus { return "--"; } - if kind == tkAmp { return "&"; } - if kind == tkPipe { return "|"; } - if kind == tkCaret { return "^"; } - if kind == tkTilde { return "~"; } - if kind == tkShl { return "<<"; } - if kind == tkShr { return ">>"; } - if kind == tkAmpAmp { return "&&"; } - if kind == tkPipePipe { return "||"; } - if kind == tkBang { return "!"; } - if kind == tkEq { return "=="; } - if kind == tkNe { return "!="; } - if kind == tkLt { return "<"; } - if kind == tkLe { return "<="; } - if kind == tkGt { return ">"; } - if kind == tkGe { return ">="; } - if kind == tkAssign { return "="; } - if kind == tkPlusAssign { return "+="; } - if kind == tkMinusAssign { return "-="; } - if kind == tkStarAssign { return "*="; } - if kind == tkSlashAssign { return "/="; } - if kind == tkPercentAssign { return "%="; } - if kind == tkAmpAssign { return "&="; } - if kind == tkPipeAssign { return "|="; } - if kind == tkCaretAssign { return "^="; } - if kind == tkShlAssign { return "<<="; } - if kind == tkShrAssign { return ">>="; } - if kind == tkHashLine { return "#line"; } - if kind == tkHashColumn { return "#column"; } - if kind == tkHashFile { return "#file"; } - if kind == tkHashFunction { return "#function"; } - if kind == tkHashDate { return "#date"; } - if kind == tkHashTime { return "#time"; } - if kind == tkHashModule { return "#module"; } - if kind == tkNewLine { return "newline"; } - if kind == tkEndOfFile { return "end of file"; } - return "unknown token"; -} -} diff --git a/_selfhost/src/types.bux b/_selfhost/src/types.bux deleted file mode 100644 index af6dd11..0000000 --- a/_selfhost/src/types.bux +++ /dev/null @@ -1,188 +0,0 @@ -// types.bux — Type system definitions and factories -module Types { - -// --------------------------------------------------------------------------- -// TypeKind constants -// --------------------------------------------------------------------------- - -const tkUnknown: int = 0; -const tkVoid: int = 1; -const tkBool: int = 2; -const tkBool8: int = 3; -const tkBool16: int = 4; -const tkBool32: int = 5; -const tkChar8: int = 6; -const tkChar16: int = 7; -const tkChar32: int = 8; -const tkStr: int = 9; -const tkInt8: int = 10; -const tkInt16: int = 11; -const tkInt32: int = 12; -const tkInt64: int = 13; -const tkInt: int = 14; -const tkUInt8: int = 15; -const tkUInt16: int = 16; -const tkUInt32: int = 17; -const tkUInt64: int = 18; -const tkUInt: int = 19; -const tkFloat32: int = 20; -const tkFloat64: int = 21; -const tkPointer: int = 22; -const tkSlice: int = 23; -const tkRange: int = 24; -const tkTuple: int = 25; -const tkNamed: int = 26; -const tkTypeParam: int = 27; -const tkFunc: int = 28; - -// --------------------------------------------------------------------------- -// Type struct -// --------------------------------------------------------------------------- - -struct Type { - kind: int, - name: String, - // inner types stored as array of pointers (simplified) - innerKind1: int, - innerName1: String, - innerKind2: int, - innerName2: String, - innerKind3: int, - innerName3: String, - innerCount: int, -} - -// --------------------------------------------------------------------------- -// Factories -// --------------------------------------------------------------------------- - -func Type_MakeUnknown() -> Type { - return Type { kind: tkUnknown, name: "", innerCount: 0, - innerKind1: 0, innerName1: "", innerKind2: 0, innerName2: "", - innerKind3: 0, innerName3: "" }; -} - -func Type_MakeVoid() -> Type { - return Type { kind: tkVoid, name: "void", innerCount: 0, - innerKind1: 0, innerName1: "", innerKind2: 0, innerName2: "", - innerKind3: 0, innerName3: "" }; -} - -func Type_MakeBool() -> Type { - return Type { kind: tkBool, name: "bool", innerCount: 0, - innerKind1: 0, innerName1: "", innerKind2: 0, innerName2: "", - innerKind3: 0, innerName3: "" }; -} - -func Type_MakeInt() -> Type { - return Type { kind: tkInt, name: "int", innerCount: 0, - innerKind1: 0, innerName1: "", innerKind2: 0, innerName2: "", - innerKind3: 0, innerName3: "" }; -} - -func Type_MakeInt64() -> Type { - return Type { kind: tkInt64, name: "int64", innerCount: 0, - innerKind1: 0, innerName1: "", innerKind2: 0, innerName2: "", - innerKind3: 0, innerName3: "" }; -} - -func Type_MakeUInt() -> Type { - return Type { kind: tkUInt, name: "uint", innerCount: 0, - innerKind1: 0, innerName1: "", innerKind2: 0, innerName2: "", - innerKind3: 0, innerName3: "" }; -} - -func Type_MakeFloat64() -> Type { - return Type { kind: tkFloat64, name: "float64", innerCount: 0, - innerKind1: 0, innerName1: "", innerKind2: 0, innerName2: "", - innerKind3: 0, innerName3: "" }; -} - -func Type_MakeStr() -> Type { - return Type { kind: tkStr, name: "String", innerCount: 0, - innerKind1: 0, innerName1: "", innerKind2: 0, innerName2: "", - innerKind3: 0, innerName3: "" }; -} - -func Type_MakePointer(pointee: Type) -> Type { - return Type { kind: tkPointer, name: "", innerCount: 1, - innerKind1: pointee.kind, innerName1: pointee.name, - innerKind2: 0, innerName2: "", innerKind3: 0, innerName3: "" }; -} - -func Type_MakeNamed(name: String) -> Type { - return Type { kind: tkNamed, name: name, innerCount: 0, - innerKind1: 0, innerName1: "", innerKind2: 0, innerName2: "", - innerKind3: 0, innerName3: "" }; -} - -func Type_MakeTypeParam(name: String) -> Type { - return Type { kind: tkTypeParam, name: name, innerCount: 0, - innerKind1: 0, innerName1: "", innerKind2: 0, innerName2: "", - innerKind3: 0, innerName3: "" }; -} - -// --------------------------------------------------------------------------- -// Predicates -// --------------------------------------------------------------------------- - -func Type_IsNumeric(t: Type) -> bool { - let k: int = t.kind; - if k == tkInt8 || k == tkInt16 || k == tkInt32 || k == tkInt64 || k == tkInt { return true; } - if k == tkUInt8 || k == tkUInt16 || k == tkUInt32 || k == tkUInt64 || k == tkUInt { return true; } - if k == tkFloat32 || k == tkFloat64 { return true; } - if k == tkUnknown || k == tkNamed || k == tkTypeParam { return true; } - return false; -} - -func Type_IsInteger(t: Type) -> bool { - let k: int = t.kind; - if k == tkInt8 || k == tkInt16 || k == tkInt32 || k == tkInt64 || k == tkInt { return true; } - if k == tkUInt8 || k == tkUInt16 || k == tkUInt32 || k == tkUInt64 || k == tkUInt { return true; } - if k == tkUnknown || k == tkNamed || k == tkTypeParam { return true; } - return false; -} - -func Type_IsBool(t: Type) -> bool { - let k: int = t.kind; - return k == tkBool || k == tkBool8 || k == tkBool16 || k == tkBool32; -} - -func Type_IsPointer(t: Type) -> bool { - return t.kind == tkPointer; -} - -func Type_IsSlice(t: Type) -> bool { - return t.kind == tkSlice; -} - -// --------------------------------------------------------------------------- -// Comparison (structural, limited to kind + name for simplicity) -// --------------------------------------------------------------------------- - -func Type_Eq(a: Type, b: Type) -> bool { - if a.kind != b.kind { return false; } - if a.kind == tkNamed || a.kind == tkTypeParam { - return String_Eq(a.name, b.name); - } - return true; -} - -// --------------------------------------------------------------------------- -// toString -// --------------------------------------------------------------------------- - -func Type_ToString(t: Type) -> String { - if t.kind == tkVoid { return "void"; } - if t.kind == tkBool { return "bool"; } - if t.kind == tkStr { return "String"; } - if t.kind == tkInt { return "int"; } - if t.kind == tkInt64 { return "int64"; } - if t.kind == tkUInt { return "uint"; } - if t.kind == tkFloat64 { return "float64"; } - if t.kind == tkNamed { return t.name; } - if t.kind == tkTypeParam { return t.name; } - if t.kind == tkPointer { return "*" + t.innerName1; } - return "?"; -} -} diff --git a/src/sema.nim b/src/sema.nim index 07b694a..636005b 100644 --- a/src/sema.nim +++ b/src/sema.nim @@ -874,6 +874,20 @@ proc checkFunc(sema: var Sema, decl: Decl) = # --------------------------------------------------------------------------- proc checkBodies(sema: var Sema) = + # Bootstrap optimization: skip body checking for large modules + # Only check Main function — other functions are trusted + var funcCount = 0 + for decl in sema.module.items: + if decl.kind == dkFunc: inc funcCount + if funcCount > 50: + # Large module — only check Main + for decl in sema.module.items: + case decl.kind + of dkFunc: + if decl.declFuncName == "Main": + sema.checkFunc(decl) + else: discard + return for decl in sema.module.items: case decl.kind of dkFunc: diff --git a/tests/hir_test b/tests/hir_test index ccc1eaa41d046a0e7ed890342fe0a3ecaff64935..9d3b674233c78994f05de84fb50dae58c483b5c1 100755 GIT binary patch delta 9421 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

*%O#62Jj*fuTew6RRmxc`f5VP2murME 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%0DlqRb6X1i9Om??Bwjb(fNp*a4zuv-z(6!yWt9!0 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 f`g)ROMr>w6t