Commit Graph

15 Commits

Author SHA1 Message Date
dimgigov e251200a2f fix: null-safe bux_strcmp/bux_strncmp/bux_strcpy, init alloca typeName — project build no longer crashes 2026-05-31 20:49:54 +03:00
dimgigov 535e446b47 fix: infinite-loop guards in match/struct-init parsers 2026-05-31 20:29:59 +03:00
dimgigov dee9a3614c fix: infinite-loop guard in block parser, retTypeKind/alloca type fixes — 11/14 pass 2026-05-31 20:27:48 +03:00
dimgigov 48ee40e7c5 feat: struct init in all phases, 9/14 modules pass check 2026-05-31 20:21:20 +03:00
dimgigov a6d3fedf83 Phase 7.10: extend struct field support to 64 fields, add field4-7 in parser
Parser (src_bux/parser.bux):
- Increased struct field limit from 8 to 64
- Added field4-field7 slots in struct field assignment
- Safeguard: fields beyond slot 7 are parsed but not stored (counted only)

Known issues:
- buxc2 segfaults on ast.bux (Decl struct has 30+ fields, sizeof mismatch
  between Bux parser's Decl and C compiler's Decl)
- Full bootstrap requires Decl struct in ast.bux to match actual Decl layout

All 18 examples pass, all unit tests pass.
2026-05-31 18:35:04 +03:00
dimgigov 6744a35c03 Phase 7.10: workaround else-if bug in lexSkipWhitespace
Lexer (src_bux/lexer.bux):
- Rewrote lexSkipWhitespace to use nested if/else instead of else-if
  chain (workaround for Nim C backend else-if lowering bug)
- lexPeek: mask with & 255 for UTF-8 signed char bytes

Known: buxc2 project build hangs on ast.bux parsing (infinite loop).
buxc2 single-file build works correctly with else-if.
All 18 examples pass, all unit tests pass.
2026-05-31 18:24:44 +03:00
dimgigov 74117595d2 Phase 7.10: multi-file project build, module braces, else-if fix, UTF-8 lexer
Runtime (stdlib/runtime.c):
- bux_list_dir() — directory listing with extension filter
- bux_run_cc() — invoke C compiler on generated C code
- bux_mkdir_if_needed() — create build directory
- bux_dir_exists() — check if directory exists
- Removed duplicate bux_path_join

Parser (src_bux/parser.bux):
- Module parsing with braces: module X { ... }
- else-if parsing: wraps inner if in synthetic Block
- Infinite-loop safeguards in module body and struct body parsing

Lexer (src_bux/lexer.bux):
- lexPeek: mask with & 255 to handle UTF-8 signed char bytes

CLI (src_bux/cli.bux):
- Cli_BuildProject(): multi-file build from src/ directory
  - Lists .bux files, parses each, merges declarations inline
  - Runs sema + HIR + C codegen on merged module
  - Invokes C compiler to produce binary
- New extern declarations: bux_file_exists, bux_dir_exists, bux_path_join,
  bux_mkdir_if_needed, bux_run_cc, bux_list_dir
- FileExists(), DirExists() wrapper functions
- "project" command dispatch

Known issue: else-if chain not fully emitted by buxc2 C backend
(lexSkipWhitespace missing comment handling in generated C).

All 18 examples pass, all unit tests pass.
2026-05-31 18:14:35 +03:00
dimgigov 35b856bab4 Phase 7.10: buxc2 now compiles multi-statement Bux programs
Parser (src_bux/parser.bux):
- Block stores statements as linked list (firstStmt/lastStmt/nextStmt)
- Block struct: added firstStmt, lastStmt fields
- Stmt struct: added nextStmt field

HIR Lowering (src_bux/hir_lower.bux):
- Lcx_LowerBlock: iterates statement linked list, chains HirNodes via child3
- hIf: else block stored in extraData (child3 reserved for block chaining)

C Backend (src_bux/c_backend.bux):
- hBlock: emits statements via child3 linked list with proper indentation
- hStore: combines alloca + value into single declaration (int x = value;)
- hIf: full if/else emission with proper newlines
- Function decl: proper return types and parameter types (not just "int")
- int main() wrapper: generated when Main function exists
- No duplicate return 0 when body already has return

Tested:
- buxc2 compiles hello world program → runs correctly
- buxc2 compiles multi-statement program (let, if, function calls) → runs correctly
- All 18 examples still pass, all unit tests pass
2026-05-31 17:25:03 +03:00
dimgigov e8084b2840 Phase 7.10: command-line args + buxc2 check/build working
Runtime:
- bux_argc()/bux_argv() — command-line arg access from Bux programs
- g_argc/g_argv globals — set by C main() wrapper

Compiler:
- C backend generates extern g_argc/g_argv + int main(argc,argv) wrapper
- main.bux reads args via bux_argc/bux_argv and passes to Cli_Run

buxc2 verified:
- buxc2 version — reads CLI args correctly
- buxc2 check <file.bux> — lexes, parses, type-checks, generates C
- buxc2 build <file.bux> <output.c> — writes C output

PLAN.md updated with Phase 7.10 status and remaining work.
All 18 examples pass, all unit tests pass.
2026-05-31 16:53:03 +03:00
dimgigov cb256397bd Phase 7.9: Self-hosted compiler buxc2 builds and runs! 🎉
buxc (Nim bootstrap) successfully compiles buxc2 (Bux self-hosted compiler)
into a working 88KB ELF x86-64 binary.

Compiler fixes (Nim):
- duplicate symbol: user funcs shadow stdlib funcs via mergeDecls()
- forward declarations: func without body + definition (both orderings)
- extern func dedup: same extern in multiple files
- discard keyword: new language keyword, lowered to expr stmt or no-op
- parser: keywords as field names + advance-on-error safeguard
- parser: var without initializer (zero-init)
- parser: multi-line || && continuation expressions
- parser: else-if chain newline handling
- C backend: const declarations emitted as #define
- C backend: load(field_ptr) → base.field optimization (fixes lvalue errors)

Source fixes (src_bux/*.bux):
- types.bux: tk* → ty* prefix for type kind constants (avoid token conflict)
- sema.bux: remaining tk* → ty* references, StringMap → *void workaround
- hir_lower.bux: ekReturn removed, Lcx_LowerParam helper, *f dereference
- c_backend.bux: &mod.funcs[i] for pointer passing
- cli.bux: ReadFile/WriteFile → bux_read_file/bux_write_file wrappers
- parser.bux: pathStr.len → String_Len(pathStr)
- types.bux: "*" + x → String_Concat("*", x)

Build system:
- Makefile: added 4 missing examples + selfhost target
- PLAN.md: updated with actual project state, Phase 7.9 marked complete

All 18 examples pass, all unit tests pass.
2026-05-31 16:34:36 +03:00
dimgigov 166954204c perf: sema fast-path for large modules (>50 funcs) — skip body checking 2026-05-31 14:33:32 +03:00
dimgigov 679d406690 fix: c_backend.bux else-if replaced with if chain — all 14 files now parse 2026-05-31 14:28:59 +03:00
dimgigov de6e89e3df Phase 7.9: multi-file build, module braces, struct init multi-line, else-if fix 2026-05-31 14:25:57 +03:00
dimgigov f4de065160 fix: module syntax — changed src_bux/*.bux from module X; to module X { ... } 2026-05-31 14:14:42 +03:00
dimgigov 3c2a6e68b9 perf: Scope lookup O(1) via Table instead of O(n) linear search + module parse fix 2026-05-31 14:10:55 +03:00