From 20a6f59b3af66b0736bc849c8aa01454953fe0dc Mon Sep 17 00:00:00 2001 From: mtmatt Date: Wed, 10 Jun 2026 20:12:26 +0800 Subject: [PATCH 01/12] docs: design spec for LLVM AOT compiler Co-Authored-By: Claude Fable 5 --- .../specs/2026-06-10-llvm-compiler-design.md | 154 ++++++++++++++++++ 1 file changed, 154 insertions(+) create mode 100644 docs/superpowers/specs/2026-06-10-llvm-compiler-design.md diff --git a/docs/superpowers/specs/2026-06-10-llvm-compiler-design.md b/docs/superpowers/specs/2026-06-10-llvm-compiler-design.md new file mode 100644 index 0000000..06dca7d --- /dev/null +++ b/docs/superpowers/specs/2026-06-10-llvm-compiler-design.md @@ -0,0 +1,154 @@ +# LLVM AOT Compiler for PseudoCode — Design + +Date: 2026-06-10 +Status: Approved for implementation (autonomous session; decisions documented below) + +## Goal + +Add a compile mode to the project: a `pseudoc` binary that turns a `.ps` source +file into a native executable using LLVM, with output behavior identical to the +interpreter (`pseudo file.ps`). + +## Approaches considered + +1. **Boxed-value AOT with runtime library (chosen).** Compile the AST to LLVM + IR where each language operation is a call into an `extern "C"` runtime + (`rt_*`) built on top of the existing `Value`, `SymbolTable`, and + `BoundMethodValue` code. Link the generated object file against + `libpseudort.a` to produce a standalone executable. + - Pros: exact semantic parity (reuses the interpreter's own operators, + builtins, array/hash methods), tractable codegen, full dynamic typing. + - Cons: values remain boxed, so speedups come from removing AST-walking + overhead, not from unboxed arithmetic (future work). +2. **Typed-subset native codegen.** Infer int/float types and emit raw + arithmetic. Fast, but supports only a fraction of the language and + duplicates semantics; high divergence risk. +3. **Textual IR emission + clang.** No LLVM library dependency, but fragile, + unverifiable IR and a worse foundation. Rejected. + +## Architecture + +``` +pseudoc (new binary) + ├── reuses: lexer, parser, import expansion (refactored out of run()) + ├── src/compiler.{h,cpp}: Compiler — AST → llvm::Module (LLVM C++ API) + └── links output .o with build/libpseudort.a via the system C++ driver + +libpseudort.a (new static library) + ├── existing objects: pseudo.o, interpreter.o, symboltable.o, node.o, ... + └── src/runtime.{h,cpp}: extern "C" rt_* shims + CompiledAlgoValue +``` + +### Value representation + +All values are `Value*` (LLVM opaque `ptr`). `Value` gains +`std::enable_shared_from_this` so the runtime can recover the owning +`shared_ptr` from a raw pointer. Lifetimes are managed by an **arena frame +stack** in the runtime: every `rt_*` function that produces a value registers +its `shared_ptr` in the current frame. Frames are pushed/popped: + +- per function call (by `rt_call`), +- per loop iteration (emitted by codegen), so long-running loops don't grow + memory unboundedly. Values that survive (stored in variables, arrays, etc.) + are kept alive by the `SymbolTable`/container `shared_ptr`s. +- `rt_frame_mark()` / `rt_frame_release(mark)` let codegen unwind frames on + `break` / `return` edges. Function results are re-registered in the caller's + frame. + +### Codegen rules (mirror interpreter semantics exactly) + +- Each top-level statement of the program body compiles into `main` in order; + `Algorithm` definitions compile to LLVM functions `ptr @"ps.algo.N."()` + plus a runtime registration (`rt_define_algo`) at the definition site, so + call-before-definition errors behave the same. +- Variables: always through `rt_get_var` / `rt_set_var` (dynamic scoping via + the symbol-table parent chain, exactly like `AlgoValue::execute`). +- `if`: branch on `stoll(cond->get_num()) == 1` (`rt_cond_eq1`); the statement + yields Int 0 when no branch is taken. +- `for`: replicate `visit_for` — evaluate assign, then step (default Int 1), + then end; `step == 0` → "Infinite for loop" error; the latch recomputes + `var <- i + step` from the value read at the previous latch (body + reassignments of the loop variable are overwritten, matching the + interpreter). Condition is float-aware `<=` / `>=` via `rt_for_cond`. +- `while`: condition `as_int() == 1`; `repeat ... until`: body first, loop + while `as_int() == 0`. +- `break`/`continue`/`return` compile to branches (with frame releases); + `return` outside any algorithm behaves like the interpreter (top level: + statement result, ignored). +- Calls: evaluate callee and args to `Value*`, then `rt_call(callee, argv, + argc)`: + - `CompiledAlgoValue` → arity check ("Too few/Too many arguments" with the + same color codes), push scope + frame, bind args, call function pointer. + - anything else (builtins, `BoundMethodValue` for array/string/hash methods) + → wrap evaluated args in `PrecomputedNode`s and reuse the existing + `execute(NodeList, SymbolTable*)` paths unchanged. +- Member access / array index / array assign: `rt_member_access`, `rt_index`, + `rt_index_assign` mirroring `visit_member_access`, `visit_array_access`, + `visit_array_assign` (string 1-indexing, hash get/set, array element + assignment). +- Array literals: `rt_array_new` + `rt_array_push`. +- Errors: any `rt_*` function that produces or receives a `VALUE_ERROR` prints + `err->get_num()` (same text the interpreter prints at top level) and exits + with status 1. There is no error-value plumbing in generated IR. + +### Unsupported in v1 (clean compile-time error) + +- `Struct` definitions / instances (`NODE_STRUCTDEF`, member assignment on + instances). The compiler reports "compile error: Struct is not supported by + the compiler yet" with the source location. `import` works (textual + expansion before parsing), but importing a file that defines structs (e.g. + `dsa`) hits the same error. + +### Intrusive changes to existing code (kept minimal) + +1. `Value` inherits `std::enable_shared_from_this` (value.h). +2. New `PrecomputedNode` (value.h, since it stores a `shared_ptr`) and + one dispatch case in `Interpreter::visit`. +3. `expand_imports` (and its `ImportState`) refactored from an anonymous + namespace in pseudo.cpp into a small header so the compiler driver can use + it. + +### Driver & CLI + +``` +pseudoc [-o ] [--emit-llvm] [--runtime-lib ] +``` + +- Default output: source basename without extension (`fib.ps` → `fib`). +- `--emit-llvm` prints the textual IR to stdout and stops. +- Pipeline: read → expand imports → lex → parse (reuse run()'s error + reporting) → codegen → `llvm::verifyModule` → O2 via `PassBuilder` → object + file (TargetMachine) → link `c++ obj libpseudort.a -o out`. +- Runtime archive located via `--runtime-lib`, `$PSEUDO_RT_LIB`, or relative to + the `pseudoc` binary (`/build/libpseudort.a`). + +### Build integration + +Makefile gets optional targets (not part of default `make`, since LLVM is an +optional dependency): + +- `make runtime` → `build/libpseudort.a` (existing objects + runtime.o). +- `make compiler` → `pseudoc`, compiled/linked using `llvm-config` + (`/opt/homebrew/opt/llvm/bin/llvm-config` fallback). Fails with a clear + message if LLVM is missing. +- `make test-compiler` → end-to-end differential tests. + +CI is unchanged (compiler build is optional); new sources follow +clang-format/clang-tidy rules. + +## Testing + +Differential end-to-end testing is the core strategy: +`test/compiler_tests.sh` compiles each supported `.ps` test/benchmark file +with `pseudoc` and asserts its stdout equals `./pseudo file.ps` stdout. +Coverage: arithmetic/comparison/logic on ints/floats/strings, arrays + +methods, hash tables, string indexing, if/for/while/repeat with +break/continue, recursion (fib), nested functions, argument-count errors, +runtime errors (index out of range), and the struct compile-error path. +Existing `make test` (gtest) must keep passing. + +## Performance expectation + +v1 removes parse/AST-walk overhead but keeps boxed values and symbol-table +access; expect modest wins over the interpreter. Unboxing/SROA of numeric +locals is explicitly future work. From b20fa156c6f02b59974fd113177cd059d6c03fbc Mon Sep 17 00:00:00 2001 From: mtmatt Date: Wed, 10 Jun 2026 20:13:45 +0800 Subject: [PATCH 02/12] docs: implementation plan for LLVM compiler Co-Authored-By: Claude Fable 5 --- .../plans/2026-06-10-llvm-compiler.md | 146 ++++++++++++++++++ 1 file changed, 146 insertions(+) create mode 100644 docs/superpowers/plans/2026-06-10-llvm-compiler.md diff --git a/docs/superpowers/plans/2026-06-10-llvm-compiler.md b/docs/superpowers/plans/2026-06-10-llvm-compiler.md new file mode 100644 index 0000000..f14e2dc --- /dev/null +++ b/docs/superpowers/plans/2026-06-10-llvm-compiler.md @@ -0,0 +1,146 @@ +# LLVM AOT Compiler Implementation Plan + +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** A `pseudoc` binary that compiles `.ps` programs to native executables via LLVM, with stdout behavior identical to the interpreter. + +**Architecture:** Codegen walks the existing AST and emits LLVM IR where every operation is a call into an `extern "C"` runtime (`rt_*`) layered on the existing `Value`/`SymbolTable` classes; the emitted object file is linked against `build/libpseudort.a`. See `docs/superpowers/specs/2026-06-10-llvm-compiler-design.md`. + +**Tech Stack:** C++17 project code, LLVM 21 C++ API (Homebrew, `llvm-config`), GNU make, bash differential tests. + +--- + +### Task 1: Differential test harness (failing first) + +**Files:** +- Create: `test/compiler_tests.sh` (executable) +- Create: `test/compiler/basics.ps`, `test/compiler/control_flow.ps`, `test/compiler/functions.ps`, `test/compiler/collections.ps`, `test/compiler/errors.ps` +- Modify: `Makefile` (add `test-compiler` target) + +- [ ] **Step 1:** Write `test/compiler_tests.sh`: for each `.ps` in `test/compiler/` plus `test/test_fib.ps`, `test/test_repeat.ps`, `test/test_array_methods.ps`, `test/test_string_index.ps`, run `./pseudo f.ps > expected`, `./pseudoc f.ps -o tmpbin && ./tmpbin > actual`, diff. Exit nonzero on any mismatch. Also assert `./pseudoc test/test_struct.ps` fails with a struct compile error. +- [ ] **Step 2:** Write the five new `.ps` fixtures covering: int/float/string arithmetic and comparisons, `and/or/not`, unary minus, `^` and `%`; if/else-if chains, for with step (incl. negative), while/repeat with break/continue, nested loops; recursion (fib), functions using caller scope, too-few-args error; arrays (literal, index assign, push/pop/insert/remove/resize/size/back), hash tables (set/get/contains/keys/size), string indexing and concatenation; index-out-of-range error. +- [ ] **Step 3:** Run `bash test/compiler_tests.sh` — must FAIL (`pseudoc` missing). Commit. + +### Task 2: Minimal intrusive changes to interpreter core + +**Files:** +- Modify: `src/value.h` (Value gains `enable_shared_from_this`; add `PrecomputedNode`) +- Modify: `src/node.h` (add `NODE_PRECOMPUTED` constant) +- Modify: `src/interpreter.cpp` (`Interpreter::visit` dispatch case returning the precomputed value) +- Create: `src/imports.h` +- Modify: `src/pseudo.cpp` (move `ImportState`/`expand_imports` out of anonymous namespace, include `imports.h`) + +- [ ] **Step 1:** `class Value : public std::enable_shared_from_this`; add + +```cpp +class PrecomputedNode : public Node { +public: + explicit PrecomputedNode(std::shared_ptr _value) : value(_value) {} + std::string get_node() override { return "PRECOMPUTED"; } + std::string get_type() override { return NODE_PRECOMPUTED; } + std::shared_ptr get_value() { return value; } +protected: + std::shared_ptr value; +}; +``` + +- [ ] **Step 2:** `imports.h` declares `struct ImportState` and `bool expand_imports(const std::string&, const std::string&, ImportState&, std::string&, std::string&);` matching the current pseudo.cpp definitions. +- [ ] **Step 3:** `make clean && make && make test` — all existing gtests PASS. Run an example to sanity-check. Commit. + +### Task 3: Runtime library `libpseudort.a` + +**Files:** +- Create: `src/runtime.h`, `src/runtime.cpp` +- Modify: `Makefile` (`runtime` target producing `build/libpseudort.a` from all interpreter objects except `shell.o`, plus `runtime.o`) + +- [ ] **Step 1:** `runtime.h` — extern "C" ABI (all value params/returns are raw `Value*` kept alive by arena frames): + +```cpp +extern "C" { +void rt_init(); +void rt_shutdown(); +// constructors +Value* rt_make_int(int64_t v); +Value* rt_make_float(double v); +Value* rt_make_string(const char* s); +Value* rt_make_none(); +Value* rt_array_new(); +void rt_array_push(Value* arr, Value* v); +// variables (current scope chain) +Value* rt_get_var(const char* name); +Value* rt_set_var(const char* name, Value* v); // returns v +// operators: op is a single char code matching token types +Value* rt_bin_op(int op, Value* a, Value* b); +Value* rt_unary_op(int op, Value* a); +// control helpers +int64_t rt_cond_eq1(Value* v); // stoll(get_num()) == 1 (if) +int64_t rt_as_int(Value* v); // as_int() (while/repeat) +int64_t rt_for_cond(Value* i, Value* end, Value* step); +Value* rt_for_step_check(Value* step); // errors on step == 0 +// indexing / members +Value* rt_index(Value* obj, Value* idx); +Value* rt_index_assign(Value* obj, Value* idx, Value* v); +Value* rt_member_access(Value* obj, const char* name); +// calls +Value* rt_define_algo(const char* name, Value* (*fn)(), const char* const* args, int64_t nargs); +Value* rt_call(Value* callee, Value** argv, int64_t argc); +// frames +int64_t rt_frame_mark(); +void rt_frame_release(int64_t mark); +Value* rt_keep(Value* v, int64_t mark); // re-register v in frame `mark`-1 (survives release) +} +``` + +- [ ] **Step 2:** Implement in runtime.cpp: global `std::vector>> frames` and `std::vector> scopes` (global scope created by `rt_init`); `CompiledAlgoValue : Value` holding `Value*(*fn)()` and arg names; `rt_call` dispatch (compiled → arity check with interpreter's exact colored error strings, new scope + frame, bind args, invoke; otherwise wrap args in `PrecomputedNode` and call `callee->execute(nodes, current_scope)`). Binary/unary ops call the existing `operator+` etc. on `shared_from_this()` handles. Any `VALUE_ERROR` encountered → print `get_num()` + `"\n"`, `exit(1)`. +- [ ] **Step 3:** `make runtime` builds `build/libpseudort.a`. Commit. + +### Task 4: Compiler skeleton + driver (milestone: arithmetic & print) + +**Files:** +- Create: `src/compiler.h`, `src/compiler.cpp` (class `Compiler`: `bool compile(const NodeList& ast, llvm::Module&)`, error list with positions) +- Create: `src/pseudoc.cpp` (driver: args, expand_imports, lex/parse with run()-style error printing, codegen, verify, O2 PassBuilder, TargetMachine object emission, link via `c++`) +- Modify: `Makefile` (`compiler` target via `llvm-config`, default `/opt/homebrew/opt/llvm/bin/llvm-config` fallback; link `-lLLVM` from `--libdir` with rpath) + +- [ ] **Step 1:** Codegen for: ValueNode literals, VarAccess/VarAssign, BinOp/UnaryOp (`rt_bin_op` with op codes), AlgorithmCall (callee codegen + `rt_call`), statement sequencing in `main` (`rt_init` first, `ret i32 0` last). Unsupported node types → recorded compile error. +- [ ] **Step 2:** Driver `--emit-llvm` and `-o`; runtime archive lookup (`--runtime-lib`, `$PSEUDO_RT_LIB`, `/build/libpseudort.a`). +- [ ] **Step 3:** `make compiler`; `echo 'print("hi", 1 + 2 * 3)' > /tmp/t.ps && ./pseudoc /tmp/t.ps -o /tmp/t && /tmp/t` matches `./pseudo /tmp/t.ps`. Commit. + +### Task 5: Control flow + +**Files:** +- Modify: `src/compiler.cpp` + +- [ ] **Step 1:** `if` (yields Int 0 when untaken, propagates last-statement value), `for` (assign → step default/check → end; latch keeps previous `i` slot per visit_for; per-iteration `rt_frame_mark`/`rt_frame_release`), `while`, `repeat`, `break`/`continue` (branch + release to loop mark), nested loops via a loop-context stack. +- [ ] **Step 2:** Differential run of `test/compiler/control_flow.ps`, `test/test_repeat.ps` — PASS. Commit. + +### Task 6: Functions and return + +**Files:** +- Modify: `src/compiler.cpp` + +- [ ] **Step 1:** AlgorithmDef → new LLVM function compiled with its own builder state (body statements; implicit result = last statement value; `ReturnNode` → `rt_keep` + `ret`); definition site emits `rt_define_algo` with arg-name global strings. Same handling when defs appear inside other bodies. +- [ ] **Step 2:** Differential run of `test/compiler/functions.ps`, `test/test_fib.ps` — PASS. Commit. + +### Task 7: Arrays, hash tables, strings, member calls + +**Files:** +- Modify: `src/compiler.cpp` + +- [ ] **Step 1:** ArrayNode literal, ArrayAccess (`rt_index`), ArrayAssign (`rt_index_assign`, including hash-table set; member assignment on non-instances reports the interpreter's error string at runtime), MemberAccess (`rt_member_access` → BoundMethodValue path; method calls flow through existing `rt_call` fallback). +- [ ] **Step 2:** Differential run of `test/compiler/collections.ps`, `test/test_array_methods.ps`, `test/test_string_index.ps` — PASS. Commit. + +### Task 8: Struct rejection, error fixtures, full suite + +**Files:** +- Modify: `src/compiler.cpp` (NODE_STRUCTDEF → "compile error: Struct is not supported by the compiler yet" with location; same for instance member assignment when detectable) +- Modify: `Makefile` (`test-compiler` runs harness) + +- [ ] **Step 1:** `bash test/compiler_tests.sh` — ALL PASS (including struct rejection and runtime error fixtures). +- [ ] **Step 2:** `make test` still green; `ci/clang-format-check.sh` clean (format new files). +- [ ] **Step 3:** Update README (compile section). Commit. + +## Self-review notes + +- Spec coverage: every spec section maps to a task (tests→1, intrusive changes→2, runtime→3, driver/build→4, codegen semantics→4–7, struct rejection→8, README/CI→8). +- Types consistent: ABI defined once in Task 3 and used in 4–7. +- `rt_keep`'s frame semantics are decided in Task 3 (`re-register in caller frame`), used by Task 6 return handling. From 1f63f9393b7cb33796668ad9bb6bb119593f9944 Mon Sep 17 00:00:00 2001 From: mtmatt Date: Wed, 10 Jun 2026 20:16:24 +0800 Subject: [PATCH 03/12] test: differential compiler test harness and fixtures Co-Authored-By: Claude Fable 5 --- Makefile | 5 ++- test/compiler/basics.ps | Bin 0 -> 381 bytes test/compiler/collections.ps | Bin 0 -> 681 bytes test/compiler/control_flow.ps | Bin 0 -> 777 bytes test/compiler/errors.ps | Bin 0 -> 67 bytes test/compiler/functions.ps | Bin 0 -> 597 bytes test/compiler_tests.sh | 69 ++++++++++++++++++++++++++++++++++ 7 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 test/compiler/basics.ps create mode 100644 test/compiler/collections.ps create mode 100644 test/compiler/control_flow.ps create mode 100644 test/compiler/errors.ps create mode 100644 test/compiler/functions.ps create mode 100755 test/compiler_tests.sh diff --git a/Makefile b/Makefile index 15b3eb5..acd30df 100644 --- a/Makefile +++ b/Makefile @@ -66,7 +66,10 @@ test: $(TEST_TARGET) coverage: test gcov -r -o $(BUILD_COV_DIR) $(filter-out src/shell.cpp, $(SRCS)) -.PHONY: clean all test coverage lsp +test-compiler: $(TARGET) + bash test/compiler_tests.sh + +.PHONY: clean all test coverage lsp test-compiler lsp: $(LSP_TARGET) clean: diff --git a/test/compiler/basics.ps b/test/compiler/basics.ps new file mode 100644 index 0000000000000000000000000000000000000000..582ea99a9ec6c18da3e2c91afeea092b9671e2c3 GIT binary patch literal 381 zcmYL_@e0Bq5XS%aDZYdtOV_kU1*=C19JLC@j7{kEyPK{M{du4F>3JTt!9g^Pop=wg zKCV1AXf!-b!a8A_uuQn3QKDs=E2?a4$!IlNtl=12ltrasS|vu#l+SzD1t}s2BPB~3 zw0^?S-DJKbs$Usr9Jq`{W{n+(mxMa2motvD#lrVDE+K77jS^vCVIswSh{&*iR}D8g z9q0{ql=GSK8XKC%_*vo>$-R>*|F#RB1Y1<3OdlU3wehh!oj5}-#Ol7c+nrpz~RLUd&LlwN_ot;yLsFfptl VSSVG{TLO3%U=CJL&(hMHlYe~q&)5I} literal 0 HcmV?d00001 diff --git a/test/compiler/control_flow.ps b/test/compiler/control_flow.ps new file mode 100644 index 0000000000000000000000000000000000000000..387ff92431c09074de9137ad7e270505545a3123 GIT binary patch literal 777 zcmZva&2GXl5QOh}iV;$!7K%ims2AW}Tv&=#V_|J`AFJ-RKe+r&d~OySws>rg^h;SZ zB^4J0Y1ZshhF3b2Bw)Lw*A5a}OyCHKnmsXZ&%HFnS3c)se! z1ADw+jx}F2L?iKRQ!GCAq);m3**@+yUzyyG3I;1%T&Z<0>FB7<-@yltS%1Y9LTVmk zEb6ENzfFBC25(KRGFI-PYKsZl3#T1y)>uAcwQy9!9?_sOoyZmFE@FaDu(c0-u)$(h znIh{Y`qUT7+9&BRE8K4h++*#_~8gP-$m|vv@CWUcnuP QR?jTwXIR0{@8CTD0W)pQOaK4? literal 0 HcmV?d00001 diff --git a/test/compiler/errors.ps b/test/compiler/errors.ps new file mode 100644 index 0000000000000000000000000000000000000000..0728c64bb7b2cc8ca0c80049adacf50692b12b5d GIT binary patch literal 67 zcmYc+DpIh~Rj4-9Q83a`Fs|h)D9X$$(MT*RiZ+bZMCKX5xk{yZMX8C&8Hq_bsY;q$ E0JRbo0RR91 literal 0 HcmV?d00001 diff --git a/test/compiler/functions.ps b/test/compiler/functions.ps new file mode 100644 index 0000000000000000000000000000000000000000..3c2147cc710a466d444222a45ea8e5ca58cde597 GIT binary patch literal 597 zcmZ8f%Z`H}6y5U`C$4a66LBV)WYRABB?c8n5(@@tr~Ui6Ry0yq=5o)2bGQt@&YRF* zA-j&t0!{wIK%ZCP<}D-+Xc!y4v4PJkRe{eu-wiVDTvi}!q|fMpT{cE7+rVw)Ga44B zGXz4f>`E{8S{5HzFgQXG)uQ?ui8AFLD$e^x@oIRq-gD9#M__kAtl)~MD^7YiZ zQStQBz3Dpgcz|Fm{-2Kc646isOl~a4ad_6@&$No`0;{W-rRJK9CIDkweow{ki*8JO zM@YK`-g8jW56>-R?K}*~E2Zpcw?yY&3D1pE0|sYmVJ={s?z%P<9%0ITC*>OEBJ@4m XpPvEMvpCG8rWn!6VSw`9(Ia60%BQcC literal 0 HcmV?d00001 diff --git a/test/compiler_tests.sh b/test/compiler_tests.sh new file mode 100755 index 0000000..bc89477 --- /dev/null +++ b/test/compiler_tests.sh @@ -0,0 +1,69 @@ +#!/usr/bin/env bash +# Differential tests: compiled binaries must produce the same stdout as the +# interpreter. Run from the repository root after `make` and `make compiler`. +set -u + +ROOT="$(cd "$(dirname "$0")/.." && pwd)" +PSEUDO="$ROOT/pseudo" +PSEUDOC="$ROOT/pseudoc" +WORKDIR="$(mktemp -d)" +trap 'rm -rf "$WORKDIR"' EXIT + +if [[ ! -x "$PSEUDO" ]]; then + echo "missing $PSEUDO (run make first)" >&2 + exit 1 +fi +if [[ ! -x "$PSEUDOC" ]]; then + echo "missing $PSEUDOC (run make compiler first)" >&2 + exit 1 +fi + +FILES=( + "$ROOT"/test/compiler/*.ps + "$ROOT/test/test_fib.ps" + "$ROOT/test/test_repeat.ps" + "$ROOT/test/test_array_methods.ps" + "$ROOT/test/test_string_index.ps" +) + +failures=0 +for src in "${FILES[@]}"; do + name="$(basename "$src" .ps)" + expected="$WORKDIR/$name.expected" + actual="$WORKDIR/$name.actual" + bin="$WORKDIR/$name.bin" + + "$PSEUDO" "$src" > "$expected" 2>&1 + if ! "$PSEUDOC" "$src" -o "$bin" > "$WORKDIR/$name.compile" 2>&1; then + echo "FAIL $name: compilation failed" + sed 's/^/ /' "$WORKDIR/$name.compile" + failures=$((failures + 1)) + continue + fi + "$bin" > "$actual" 2>&1 + if ! diff -u "$expected" "$actual" > "$WORKDIR/$name.diff"; then + echo "FAIL $name: output mismatch" + sed 's/^/ /' "$WORKDIR/$name.diff" + failures=$((failures + 1)) + else + echo "PASS $name" + fi +done + +# Struct programs must be rejected at compile time with a clear message. +if "$PSEUDOC" "$ROOT/test/test_struct.ps" -o "$WORKDIR/struct.bin" > "$WORKDIR/struct.out" 2>&1; then + echo "FAIL struct-rejection: expected compile error" + failures=$((failures + 1)) +elif ! grep -q "Struct is not supported" "$WORKDIR/struct.out"; then + echo "FAIL struct-rejection: wrong error message" + sed 's/^/ /' "$WORKDIR/struct.out" + failures=$((failures + 1)) +else + echo "PASS struct-rejection" +fi + +if [[ $failures -ne 0 ]]; then + echo "$failures test(s) failed" + exit 1 +fi +echo "all compiler tests passed" From 1822b0e1d9aa6b3e5ecfc4c0cdb06a42a81c8803 Mon Sep 17 00:00:00 2001 From: mtmatt Date: Wed, 10 Jun 2026 20:18:09 +0800 Subject: [PATCH 04/12] refactor: expose import expansion, add PrecomputedNode and shared_from_this on Value Groundwork for the LLVM compiler runtime: compiled code needs to recover shared_ptr ownership from raw Value pointers, reuse builtin/method execute paths with pre-evaluated arguments, and expand imports outside run(). Co-Authored-By: Claude Fable 5 --- src/imports.h | 23 +++++++++++++++++++++++ src/interpreter.cpp | 3 +++ src/node.h | 1 + src/pseudo.cpp | 10 +++------- src/value.h | 15 ++++++++++++++- 5 files changed, 44 insertions(+), 8 deletions(-) create mode 100644 src/imports.h diff --git a/src/imports.h b/src/imports.h new file mode 100644 index 0000000..2f109d4 --- /dev/null +++ b/src/imports.h @@ -0,0 +1,23 @@ +/// -------------------- +/// Import expansion +/// -------------------- + +#ifndef IMPORTS_H +#define IMPORTS_H + +#include +#include + +struct ImportState { + std::set loaded; + std::set loading; +}; + +// Recursively replaces `import` lines in `text` with the imported file +// contents. Returns false and fills `error` on unresolved, unreadable, or +// circular imports. +bool expand_imports(const std::string &file_name, const std::string &text, + ImportState &state, std::string &expanded, + std::string &error); + +#endif diff --git a/src/interpreter.cpp b/src/interpreter.cpp index 47e39bb..c2589e4 100644 --- a/src/interpreter.cpp +++ b/src/interpreter.cpp @@ -106,6 +106,9 @@ std::shared_ptr Interpreter::visit(std::shared_ptr node) { if(node->get_type() == NODE_CONTINUE) { return std::make_shared(VALUE_CONTINUE); } + if(node->get_type() == NODE_PRECOMPUTED) { + return dynamic_cast(node.get())->get_value(); + } return std::make_shared(VALUE_ERROR, "Fail to get result\n"); } diff --git a/src/node.h b/src/node.h index 11888d0..752b129 100644 --- a/src/node.h +++ b/src/node.h @@ -33,6 +33,7 @@ const std::string NODE_STRUCTDEF("STRUCTDEF"); const std::string NODE_RETURN("RETURN"); const std::string NODE_BREAK("BREAK"); const std::string NODE_CONTINUE("CONTINUE"); +const std::string NODE_PRECOMPUTED("PRECOMPUTED"); const std::string TAB{" "}; class Node { diff --git a/src/pseudo.cpp b/src/pseudo.cpp index dbf7ab0..7e64ed8 100644 --- a/src/pseudo.cpp +++ b/src/pseudo.cpp @@ -1,4 +1,5 @@ #include "pseudo.h" +#include "imports.h" #include "color.h" #include "interpreter.h" #include "node.h" @@ -1206,11 +1207,6 @@ std::shared_ptr StructValue::execute(const NodeList& args, namespace { -struct ImportState { - std::set loaded; - std::set loading; -}; - std::string trim(const std::string &str) { size_t begin = 0; while (begin < str.size() && @@ -1304,6 +1300,8 @@ bool resolve_import(const std::string &target, return false; } +} // namespace + bool expand_imports(const std::string &file_name, const std::string &text, ImportState &state, std::string &expanded, std::string &error) { @@ -1358,8 +1356,6 @@ bool expand_imports(const std::string &file_name, const std::string &text, return true; } -} // namespace - std::string run(std::string file_name, std::string text, SymbolTable &global_symbol_table) { ImportState import_state; diff --git a/src/value.h b/src/value.h index 4a786a6..feb7d6b 100644 --- a/src/value.h +++ b/src/value.h @@ -36,7 +36,7 @@ const std::map REVERSE_ESCAPE_CHAR { class SymbolTable; class Interpreter; -class Value { +class Value: public std::enable_shared_from_this { public: Value(const std::string& _type = VALUE_NONE) : type(_type) {} @@ -264,6 +264,19 @@ class ControlValue : public Value { : Value(_type) {} }; +// Wraps an already-evaluated value as an AST node so compiled code can reuse +// interpreter execution paths that expect argument nodes (builtins, methods). +class PrecomputedNode: public Node { +public: + explicit PrecomputedNode(std::shared_ptr _value) + : value(_value) {} + std::string get_node() override { return "PRECOMPUTED";} + std::string get_type() override { return NODE_PRECOMPUTED;} + std::shared_ptr get_value() { return value;} +protected: + std::shared_ptr value; +}; + template class TypedValue; template class TypedValue; template class TypedValue; From 4a7f3f90e444442e52faf742cfe4312b6984c8d8 Mon Sep 17 00:00:00 2001 From: mtmatt Date: Wed, 10 Jun 2026 20:22:55 +0800 Subject: [PATCH 05/12] feat: runtime library for compiled programs extern "C" rt_* shims over the existing Value/SymbolTable machinery, with arena-frame lifetime tracking and a CompiledAlgoValue that bridges native function pointers into the interpreter's call protocol. Runtime errors print the interpreter's top-level message and exit(1). Co-Authored-By: Claude Fable 5 --- Makefile | 11 +- src/runtime.cpp | 307 ++++++++++++++++++++++++++++++++++++++++++++++++ src/runtime.h | 85 ++++++++++++++ 3 files changed, 402 insertions(+), 1 deletion(-) create mode 100644 src/runtime.cpp create mode 100644 src/runtime.h diff --git a/Makefile b/Makefile index acd30df..48a3eac 100644 --- a/Makefile +++ b/Makefile @@ -46,6 +46,15 @@ $(BUILD_COV_DIR)/%.o: src/%.cpp $(HEADERS) | $(BUILD_COV_DIR) run : $(TARGET) ./shell +# Runtime library for compiled programs (interpreter core + rt_* shims) +RT_LIB = $(BUILD_DIR)/libpseudort.a +RT_OBJS = $(filter-out $(BUILD_DIR)/shell.o,$(OBJS)) $(BUILD_DIR)/runtime.o + +$(RT_LIB): $(RT_OBJS) + ar rcs $@ $(RT_OBJS) + +runtime: $(BUILD_DIR) $(RT_LIB) + # Google Test rules GTEST_HEADERS = $(GTEST_DIR)/include/gtest/*.h \ @@ -69,7 +78,7 @@ coverage: test test-compiler: $(TARGET) bash test/compiler_tests.sh -.PHONY: clean all test coverage lsp test-compiler +.PHONY: clean all test coverage lsp test-compiler runtime compiler lsp: $(LSP_TARGET) clean: diff --git a/src/runtime.cpp b/src/runtime.cpp new file mode 100644 index 0000000..ed33fce --- /dev/null +++ b/src/runtime.cpp @@ -0,0 +1,307 @@ +/// -------------------- +/// Compiled-program runtime +/// -------------------- + +#include "runtime.h" +#include "color.h" +#include "interpreter.h" +#include "node.h" +#include "symboltable.h" +#include "value.h" +#include +#include +#include +#include +#include + +namespace { + +// Arena frames keep every runtime-created value alive until its frame is +// released; survivors are owned by symbol tables and containers. +std::vector>> frames; +// Scope stack: scopes.back() is the current symbol table; entry 0 holds the +// globals. Parents follow the caller chain, like the interpreter. +std::vector> scopes; + +[[noreturn]] void rt_fail(const std::shared_ptr &err) { + std::cout << err->get_num() << "\n"; + exit(1); +} + +Value *track(std::shared_ptr value) { + if (value->get_type() == VALUE_ERROR) { + rt_fail(value); + } + frames.back().push_back(value); + return value.get(); +} + +std::shared_ptr ref(Value *v) { return v->shared_from_this(); } + +SymbolTable ¤t_scope() { return *scopes.back(); } + +class CompiledAlgoValue : public Value { +public: + CompiledAlgoValue(const std::string &_algo_name, Value *(*_fn)(), + std::vector _arg_names) + : Value(VALUE_ALGO), fn(_fn), algo_name(_algo_name), + arg_names(std::move(_arg_names)) {} + + std::string get_num() override { return algo_name; } + std::string repr() override { return algo_name; } + + std::shared_ptr execute(const NodeList &args = {}, + SymbolTable *parent = nullptr) override; + + Value *(*fn)(); + std::string algo_name; + std::vector arg_names; +}; + +std::shared_ptr call_compiled(CompiledAlgoValue *algo, + const ValueList &args) { + if (args.size() < algo->arg_names.size()) { + return std::make_shared( + VALUE_ERROR, Color(0xFF, 0x39, 0x6E).get() + "Too few arguments" RESET); + } + if (args.size() > algo->arg_names.size()) { + return std::make_shared( + VALUE_ERROR, Color(0xFF, 0x39, 0x6E).get() + "Too many arguments" RESET); + } + + int64_t mark = rt_frame_mark(); + rt_frame_push(); + scopes.push_back(std::make_unique(¤t_scope())); + for (size_t i = 0; i < args.size(); ++i) { + scopes.back()->set(algo->arg_names[i], args[i]); + } + Value *result = algo->fn(); + std::shared_ptr kept = ref(result); + scopes.pop_back(); + rt_frame_release(mark); + return kept; +} + +std::shared_ptr CompiledAlgoValue::execute(const NodeList &args, + SymbolTable *parent) { + SymbolTable sym(parent); + Interpreter interpreter(sym); + ValueList evaluated; + evaluated.reserve(args.size()); + for (const auto &arg : args) { + std::shared_ptr v = interpreter.visit(arg); + if (v->get_type() == VALUE_ERROR) { + return v; + } + evaluated.push_back(v); + } + return call_compiled(this, evaluated); +} + +} // namespace + +extern "C" { + +void rt_init() { + frames.emplace_back(); + scopes.push_back(std::make_unique()); +} + +Value *rt_make_int(int64_t v) { + return track(std::make_shared>(VALUE_INT, v)); +} + +Value *rt_make_float(double v) { + return track(std::make_shared>(VALUE_FLOAT, v)); +} + +Value *rt_make_string(const char *s) { + return track( + std::make_shared>(VALUE_STRING, std::string(s))); +} + +Value *rt_make_none() { return track(std::make_shared()); } + +Value *rt_array_new() { + return track(std::make_shared(ValueList(0))); +} + +void rt_array_push(Value *arr, Value *v) { + dynamic_cast(arr)->push_back(ref(v)); +} + +Value *rt_get_var(const char *name) { + return track(current_scope().get(name)); +} + +Value *rt_set_var(const char *name, Value *v) { + current_scope().set(name, ref(v)); + return track(current_scope().get(name)); +} + +Value *rt_bin_op(int64_t op, Value *a, Value *b) { + std::shared_ptr lhs = ref(a), rhs = ref(b); + switch (op) { + case RT_OP_ADD: return track(lhs + rhs); + case RT_OP_SUB: return track(lhs - rhs); + case RT_OP_MUL: return track(lhs * rhs); + case RT_OP_DIV: return track(lhs / rhs); + case RT_OP_MOD: return track(lhs % rhs); + case RT_OP_POW: return track(pow(lhs, rhs)); + case RT_OP_EQUAL: return track(lhs == rhs); + case RT_OP_NEQ: return track(lhs != rhs); + case RT_OP_LESS: return track(lhs < rhs); + case RT_OP_GREATER: return track(lhs > rhs); + case RT_OP_LEQ: return track(lhs <= rhs); + case RT_OP_GEQ: return track(lhs >= rhs); + default: + rt_fail(std::make_shared(VALUE_ERROR, "Not a binary op\n")); + } +} + +Value *rt_unary_op(int64_t op, Value *a) { + std::shared_ptr operand = ref(a); + switch (op) { + case RT_OP_UPLUS: return track(operand); + case RT_OP_UNEG: return track(-operand); + case RT_OP_UNOT: return track(!operand); + default: + rt_fail(std::make_shared(VALUE_ERROR, "Not an unary op\n")); + } +} + +Value *rt_bool(Value *v) { return rt_make_int(v->as_int() != 0); } + +int64_t rt_cond_eq1(Value *v) { return std::stoll(v->get_num()) == 1; } + +int64_t rt_as_int(Value *v) { return v->as_int(); } + +int64_t rt_for_cond(Value *i, Value *end, Value *step) { + if (step->as_double() > 0) { + if (i->get_type() == VALUE_FLOAT || end->get_type() == VALUE_FLOAT) + return i->as_double() <= end->as_double(); + return i->as_int() <= end->as_int(); + } + if (i->get_type() == VALUE_FLOAT || end->get_type() == VALUE_FLOAT) + return i->as_double() >= end->as_double(); + return i->as_int() >= end->as_int(); +} + +void rt_for_step_check(Value *step) { + if (step->as_double() == 0) { + rt_fail(std::make_shared(VALUE_ERROR, "Infinite for loop\n")); + } +} + +Value *rt_index(Value *obj, Value *idx) { + std::shared_ptr container = ref(obj), index = ref(idx); + if (container->get_type() == VALUE_STRING) { + std::string str = container->as_string(); + int p = index->as_int(); + if (1 <= p && p <= static_cast(str.size())) { + return track(std::make_shared>( + VALUE_STRING, std::string(1, str[p - 1]))); + } + return track(std::make_shared( + VALUE_ERROR, "Index out of range, size: " + std::to_string(str.size()) + + ", position: " + std::to_string(p))); + } + if (container->get_type() == VALUE_HASH_TABLE) { + return track(dynamic_cast(container.get())->get(index)); + } + if (container->get_type() != VALUE_ARRAY) { + return track(std::make_shared( + VALUE_ERROR, + "Access can only apply on array, find " + container->get_type() + "\n")); + } + return track( + dynamic_cast(container.get())->operator[](index->as_int())); +} + +Value *rt_index_assign(Value *obj, Value *idx, Value *v) { + std::shared_ptr container = ref(obj), index = ref(idx), value = ref(v); + if (container->get_type() == VALUE_HASH_TABLE) { + return track( + dynamic_cast(container.get())->set(index, value)); + } + if (container->get_type() != VALUE_ARRAY) { + return track(std::make_shared( + VALUE_ERROR, "Access can only apply on array or object member\n")); + } + // Matches visit_array_assign: an out-of-range index assigns into the + // array's error slot and is effectively ignored. + dynamic_cast(container.get())->operator[](index->as_int()) = + value; + return track(value); +} + +Value *rt_member_access(Value *obj, const char *name) { + std::shared_ptr object = ref(obj); + if (object->get_type() == VALUE_ARRAY || object->get_type() == VALUE_STRING || + object->get_type() == VALUE_HASH_TABLE) { + return track(std::make_shared(object, name)); + } + if (object->get_type() == VALUE_INSTANCE) { + return track(dynamic_cast(object.get()) + ->get_member(name, object)); + } + return track(std::make_shared( + VALUE_ERROR, + object->get_num() + " has no member " + std::string(name) + "\n")); +} + +Value *rt_member_assign(Value *obj, const char *name, Value *v) { + std::shared_ptr object = ref(obj), value = ref(v); + if (object->get_type() == VALUE_INSTANCE) { + dynamic_cast(object.get())->set_member(name, value); + return track(value); + } + return track(std::make_shared( + VALUE_ERROR, "Assignment to member only supported for Struct Instances\n")); +} + +void rt_define_algo(const char *name, Value *(*fn)(), + const char *const *arg_names, int64_t nargs) { + std::vector names; + names.reserve(nargs); + for (int64_t i = 0; i < nargs; ++i) { + names.emplace_back(arg_names[i]); + } + std::shared_ptr algo = + std::make_shared(name, fn, std::move(names)); + current_scope().set(name, algo); + track(algo); +} + +Value *rt_call(Value *callee, Value **argv, int64_t argc) { + ValueList args; + args.reserve(argc); + for (int64_t i = 0; i < argc; ++i) { + args.push_back(ref(argv[i])); + } + + if (auto *compiled = dynamic_cast(callee)) { + return track(call_compiled(compiled, args)); + } + + // Builtins, bound methods, and other interpreter-executed callees: hand + // over the already-evaluated arguments as precomputed AST nodes. + NodeList arg_nodes; + arg_nodes.reserve(argc); + for (const auto &arg : args) { + arg_nodes.push_back(std::make_shared(arg)); + } + return track(callee->execute(arg_nodes, ¤t_scope())); +} + +int64_t rt_frame_mark() { return static_cast(frames.size()); } + +void rt_frame_push() { frames.emplace_back(); } + +void rt_frame_release(int64_t mark) { + while (static_cast(frames.size()) > mark) { + frames.pop_back(); + } +} + +} // extern "C" diff --git a/src/runtime.h b/src/runtime.h new file mode 100644 index 0000000..58c92ee --- /dev/null +++ b/src/runtime.h @@ -0,0 +1,85 @@ +/// -------------------- +/// Compiled-program runtime +/// -------------------- +/// +/// extern "C" entry points called by code generated by the LLVM compiler +/// (src/compiler.cpp). All Value* parameters and results are raw pointers +/// whose ownership is tracked by an arena frame stack inside the runtime; +/// anything that must outlive a frame (variables, container elements) is +/// kept alive by the SymbolTable / container shared_ptrs. +/// +/// Any runtime error (a VALUE_ERROR result) prints the same message the +/// interpreter prints at top level and exits with status 1. + +#ifndef RUNTIME_H +#define RUNTIME_H + +#include + +class Value; + +// Operator codes shared between the compiler and the runtime. +enum RtBinOpCode : int64_t { + RT_OP_ADD = 0, + RT_OP_SUB, + RT_OP_MUL, + RT_OP_DIV, + RT_OP_MOD, + RT_OP_POW, + RT_OP_EQUAL, + RT_OP_NEQ, + RT_OP_LESS, + RT_OP_GREATER, + RT_OP_LEQ, + RT_OP_GEQ, +}; + +enum RtUnaryOpCode : int64_t { + RT_OP_UPLUS = 0, + RT_OP_UNEG, + RT_OP_UNOT, +}; + +extern "C" { + +void rt_init(); + +Value *rt_make_int(int64_t v); +Value *rt_make_float(double v); +Value *rt_make_string(const char *s); +Value *rt_make_none(); +Value *rt_array_new(); +void rt_array_push(Value *arr, Value *v); + +Value *rt_get_var(const char *name); +Value *rt_set_var(const char *name, Value *v); + +Value *rt_bin_op(int64_t op, Value *a, Value *b); +Value *rt_unary_op(int64_t op, Value *a); +// Int 0/1 value from as_int() != 0 (used by short-circuit and/or). +Value *rt_bool(Value *v); + +// stoll(get_num()) == 1, the interpreter's `if` condition. +int64_t rt_cond_eq1(Value *v); +// as_int(), the interpreter's `while` / `repeat` condition. +int64_t rt_as_int(Value *v); +// Float-aware inclusive bound check matching Interpreter::visit_for. +int64_t rt_for_cond(Value *i, Value *end, Value *step); +// Errors out (like the interpreter) when step == 0. +void rt_for_step_check(Value *step); + +Value *rt_index(Value *obj, Value *idx); +Value *rt_index_assign(Value *obj, Value *idx, Value *v); +Value *rt_member_access(Value *obj, const char *name); +Value *rt_member_assign(Value *obj, const char *name, Value *v); + +void rt_define_algo(const char *name, Value *(*fn)(), + const char *const *arg_names, int64_t nargs); +Value *rt_call(Value *callee, Value **argv, int64_t argc); + +int64_t rt_frame_mark(); +void rt_frame_push(); +void rt_frame_release(int64_t mark); +} + +#endif From 52125d4f8594a566817ffa39e94461d5f9e0f027 Mon Sep 17 00:00:00 2001 From: mtmatt Date: Wed, 10 Jun 2026 20:33:45 +0800 Subject: [PATCH 06/12] feat: LLVM AOT compiler and pseudoc driver Lowers the AST to LLVM IR with all operations dispatched to the rt_* runtime, optimizes at O2, emits a native object file, and links it against libpseudort.a. Loops get per-iteration arena frames; for-loops keep the latest loop variable alive in a dedicated frame. Co-Authored-By: Claude Fable 5 --- Makefile | 23 +- src/compiler.cpp | 697 +++++++++++++++++++++++++++++++++++++++++++++++ src/compiler.h | 25 ++ src/pseudoc.cpp | 267 ++++++++++++++++++ src/runtime.cpp | 12 +- src/runtime.h | 7 +- 6 files changed, 1025 insertions(+), 6 deletions(-) create mode 100644 src/compiler.cpp create mode 100644 src/compiler.h create mode 100644 src/pseudoc.cpp diff --git a/Makefile b/Makefile index 48a3eac..6c497c2 100644 --- a/Makefile +++ b/Makefile @@ -47,14 +47,35 @@ run : $(TARGET) ./shell # Runtime library for compiled programs (interpreter core + rt_* shims) +# Prefer the system ar: GNU binutils ar produces archives Apple's ld rejects. +AR := $(shell test -x /usr/bin/ar && echo /usr/bin/ar || echo ar) RT_LIB = $(BUILD_DIR)/libpseudort.a RT_OBJS = $(filter-out $(BUILD_DIR)/shell.o,$(OBJS)) $(BUILD_DIR)/runtime.o $(RT_LIB): $(RT_OBJS) - ar rcs $@ $(RT_OBJS) + $(AR) rcs $@ $(RT_OBJS) runtime: $(BUILD_DIR) $(RT_LIB) +# LLVM AOT compiler (optional; requires LLVM, e.g. `brew install llvm`) +LLVM_CONFIG ?= $(shell command -v llvm-config 2>/dev/null || echo /opt/homebrew/opt/llvm/bin/llvm-config) +LLVM_INCLUDEDIR = $(shell $(LLVM_CONFIG) --includedir) +LLVM_LIBDIR = $(shell $(LLVM_CONFIG) --libdir) +LLVM_COMPILE_FLAGS = -I$(LLVM_INCLUDEDIR) -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS +PSEUDOC_TARGET = pseudoc +PSEUDOC_OBJS = $(filter-out $(BUILD_DIR)/shell.o,$(OBJS)) $(BUILD_DIR)/compiler.o $(BUILD_DIR)/pseudoc.o + +$(BUILD_DIR)/compiler.o: src/compiler.cpp $(HEADERS) | $(BUILD_DIR) + $(CC) -c $(CPPFLAGS) $(LLVM_COMPILE_FLAGS) src/compiler.cpp -o $@ + +$(BUILD_DIR)/pseudoc.o: src/pseudoc.cpp $(HEADERS) | $(BUILD_DIR) + $(CC) -c $(CPPFLAGS) $(LLVM_COMPILE_FLAGS) src/pseudoc.cpp -o $@ + +$(PSEUDOC_TARGET): $(BUILD_DIR) $(PSEUDOC_OBJS) $(RT_LIB) + $(CC) $(CPPFLAGS) $(PSEUDOC_OBJS) -L$(LLVM_LIBDIR) -lLLVM -Wl,-rpath,$(LLVM_LIBDIR) -o $(PSEUDOC_TARGET) + +compiler: $(PSEUDOC_TARGET) runtime + # Google Test rules GTEST_HEADERS = $(GTEST_DIR)/include/gtest/*.h \ diff --git a/src/compiler.cpp b/src/compiler.cpp new file mode 100644 index 0000000..6d774f9 --- /dev/null +++ b/src/compiler.cpp @@ -0,0 +1,697 @@ +/// -------------------- +/// LLVM AOT compiler +/// -------------------- +/// +/// Lowers the AST to LLVM IR. Every language operation becomes a call into +/// the runtime (src/runtime.h); control flow becomes real basic blocks. The +/// emitted code mirrors Interpreter::visit_* semantics; see +/// docs/superpowers/specs/2026-06-10-llvm-compiler-design.md. + +#include "compiler.h" +#include "node.h" +#include "runtime.h" +#include "token.h" + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +namespace { + +class CodeGen { +public: + CodeGen(llvm::Module &_module, std::vector &_errors) + : module(_module), ctx(_module.getContext()), builder(ctx), + errors(_errors) { + ptr_ty = builder.getPtrTy(); + i64_ty = builder.getInt64Ty(); + f64_ty = builder.getDoubleTy(); + } + + bool run(const NodeList &ast) { + llvm::Function *main_fn = llvm::Function::Create( + llvm::FunctionType::get(builder.getInt32Ty(), false), + llvm::Function::ExternalLinkage, "main", module); + llvm::BasicBlock *entry = llvm::BasicBlock::Create(ctx, "entry", main_fn); + builder.SetInsertPoint(entry); + builder.CreateCall(get_rt("rt_init", builder.getVoidTy(), {})); + + for (const auto &node : ast) { + if (gen(node) == nullptr && block_terminated()) { + break; + } + } + if (!block_terminated()) { + builder.CreateRet(builder.getInt32(0)); + } + return errors.empty(); + } + +private: + struct LoopContext { + llvm::BasicBlock *latch; + llvm::BasicBlock *exit; + llvm::Value *iter_mark; + // `while` re-pushes its iteration frame in the header, so `continue` + // must release first; `for`/`repeat` latches release it themselves. + bool release_on_continue; + }; + + llvm::Module &module; + llvm::LLVMContext &ctx; + llvm::IRBuilder<> builder; + std::vector &errors; + + llvm::PointerType *ptr_ty{nullptr}; + llvm::Type *i64_ty{nullptr}; + llvm::Type *f64_ty{nullptr}; + + std::vector loops; + std::map string_constants; + int algo_counter{0}; + + /// ---- helpers ---- + + llvm::FunctionCallee get_rt(const std::string &name, llvm::Type *ret, + std::vector args) { + return module.getOrInsertFunction( + name, llvm::FunctionType::get(ret, args, false)); + } + + bool block_terminated() { + return builder.GetInsertBlock()->getTerminator() != nullptr; + } + + llvm::Value *cstring(const std::string &text) { + auto found = string_constants.find(text); + if (found != string_constants.end()) { + return found->second; + } + llvm::Value *global = builder.CreateGlobalString(text, "str"); + string_constants[text] = global; + return global; + } + + llvm::AllocaInst *entry_alloca(llvm::Type *type) { + llvm::Function *fn = builder.GetInsertBlock()->getParent(); + llvm::IRBuilder<> tmp(&fn->getEntryBlock(), fn->getEntryBlock().begin()); + return tmp.CreateAlloca(type); + } + + void error(const std::string &message, const std::shared_ptr &node) { + std::string suffix; + std::shared_ptr tok = node ? node->get_tok() : nullptr; + if (tok) { + suffix = " (line " + std::to_string(tok->get_pos().line + 1) + ")"; + } + errors.push_back(message + suffix); + } + + llvm::Value *make_none() { + return builder.CreateCall(get_rt("rt_make_none", ptr_ty, {})); + } + + llvm::Value *make_int(int64_t v) { + return builder.CreateCall(get_rt("rt_make_int", ptr_ty, {i64_ty}), + {builder.getInt64(v)}); + } + + llvm::Value *frame_mark() { + return builder.CreateCall(get_rt("rt_frame_mark", i64_ty, {})); + } + + void frame_push() { + builder.CreateCall(get_rt("rt_frame_push", builder.getVoidTy(), {})); + } + + void frame_release(llvm::Value *mark) { + builder.CreateCall(get_rt("rt_frame_release", builder.getVoidTy(), {i64_ty}), + {mark}); + } + + /// ---- dispatch ---- + + // Emits code for one node. Returns the node's value (an LLVM `ptr` to a + // runtime Value) or nullptr when the node terminated the current block + // (break/continue/return) or reported a compile error. + llvm::Value *gen(const std::shared_ptr &node) { + const std::string type = node->get_type(); + if (type == NODE_VALUE) return gen_literal(node); + if (type == NODE_VARACCESS) return gen_var_access(node); + if (type == NODE_VARASSIGN) return gen_var_assign(node); + if (type == NODE_BINOP) return gen_bin_op(node); + if (type == NODE_UNARYOP) return gen_unary_op(node); + if (type == NODE_IF) return gen_if(node); + if (type == NODE_FOR) return gen_for(node); + if (type == NODE_WHILE) return gen_while(node); + if (type == NODE_REPEAT) return gen_repeat(node); + if (type == NODE_ALGODEF) return gen_algo_def(node); + if (type == NODE_ALGOCALL) return gen_algo_call(node); + if (type == NODE_ARRAY) return gen_array(node); + if (type == NODE_ARRACCESS) return gen_array_access(node); + if (type == NODE_ARRASSIGN) return gen_array_assign(node); + if (type == NODE_MEMACCESS) return gen_member_access(node); + if (type == NODE_RETURN) return gen_return(node); + if (type == NODE_BREAK) return gen_loop_jump(node, true); + if (type == NODE_CONTINUE) return gen_loop_jump(node, false); + if (type == NODE_STRUCTDEF) { + error("compile error: Struct is not supported by the compiler yet", + node); + return nullptr; + } + error("compile error: unsupported statement " + type, node); + return nullptr; + } + + // Emits a statement sequence; returns the last statement's value, or + // nullptr when the sequence terminated the block (or errored). + llvm::Value *gen_statements(const NodeList &nodes) { + llvm::Value *last = nullptr; + for (const auto &node : nodes) { + last = gen(node); + if (last == nullptr) { + return nullptr; + } + } + return last; + } + + /// ---- expressions ---- + + llvm::Value *gen_literal(const std::shared_ptr &node) { + std::shared_ptr tok = node->get_tok(); + if (tok->get_type() == TOKEN_INT) { + return make_int(std::stoll(tok->get_value())); + } + if (tok->get_type() == TOKEN_FLOAT) { + return builder.CreateCall( + get_rt("rt_make_float", ptr_ty, {f64_ty}), + {llvm::ConstantFP::get(f64_ty, std::stod(tok->get_value()))}); + } + if (tok->get_type() == TOKEN_STRING) { + return builder.CreateCall(get_rt("rt_make_string", ptr_ty, {ptr_ty}), + {cstring(tok->get_value())}); + } + error("compile error: unsupported literal " + tok->get_type(), node); + return nullptr; + } + + llvm::Value *gen_var_access(const std::shared_ptr &node) { + return builder.CreateCall(get_rt("rt_get_var", ptr_ty, {ptr_ty}), + {cstring(node->get_name())}); + } + + llvm::Value *gen_var_assign(const std::shared_ptr &node) { + llvm::Value *value = gen(node->get_child()[0]); + if (value == nullptr) { + return nullptr; + } + return builder.CreateCall(get_rt("rt_set_var", ptr_ty, {ptr_ty, ptr_ty}), + {cstring(node->get_name()), value}); + } + + llvm::Value *as_int(llvm::Value *value) { + return builder.CreateCall(get_rt("rt_as_int", i64_ty, {ptr_ty}), {value}); + } + + llvm::Value *gen_bin_op(const std::shared_ptr &node) { + std::shared_ptr op = node->get_tok(); + if (op->get_type() == TOKEN_KEYWORD && + (op->get_value() == "and" || op->get_value() == "or")) { + return gen_short_circuit(node, op->get_value() == "and"); + } + + static const std::map OP_CODES{ + {TOKEN_ADD, RT_OP_ADD}, {TOKEN_SUB, RT_OP_SUB}, + {TOKEN_MUL, RT_OP_MUL}, {TOKEN_DIV, RT_OP_DIV}, + {TOKEN_MOD, RT_OP_MOD}, {TOKEN_POW, RT_OP_POW}, + {TOKEN_EQUAL, RT_OP_EQUAL}, {TOKEN_NEQ, RT_OP_NEQ}, + {TOKEN_LESS, RT_OP_LESS}, {TOKEN_GREATER, RT_OP_GREATER}, + {TOKEN_LEQ, RT_OP_LEQ}, {TOKEN_GEQ, RT_OP_GEQ}, + }; + auto code = OP_CODES.find(op->get_type()); + if (code == OP_CODES.end()) { + error("compile error: unsupported operator " + op->get_type(), node); + return nullptr; + } + + NodeList child = node->get_child(); + llvm::Value *lhs = gen(child[0]); + if (lhs == nullptr) return nullptr; + llvm::Value *rhs = gen(child[1]); + if (rhs == nullptr) return nullptr; + return builder.CreateCall( + get_rt("rt_bin_op", ptr_ty, {i64_ty, ptr_ty, ptr_ty}), + {builder.getInt64(code->second), lhs, rhs}); + } + + // Mirrors visit_bin_op's short-circuit `and` / `or`: the result is always + // an Int 0/1 derived from as_int(). + llvm::Value *gen_short_circuit(const std::shared_ptr &node, + bool is_and) { + NodeList child = node->get_child(); + llvm::Value *lhs = gen(child[0]); + if (lhs == nullptr) return nullptr; + + llvm::Function *fn = builder.GetInsertBlock()->getParent(); + llvm::BasicBlock *rhs_bb = llvm::BasicBlock::Create(ctx, "sc.rhs", fn); + llvm::BasicBlock *short_bb = llvm::BasicBlock::Create(ctx, "sc.short", fn); + llvm::BasicBlock *merge_bb = llvm::BasicBlock::Create(ctx, "sc.merge", fn); + + llvm::Value *lhs_true = + builder.CreateICmpNE(as_int(lhs), builder.getInt64(0)); + if (is_and) { + builder.CreateCondBr(lhs_true, rhs_bb, short_bb); + } else { + builder.CreateCondBr(lhs_true, short_bb, rhs_bb); + } + + builder.SetInsertPoint(short_bb); + llvm::Value *short_value = make_int(is_and ? 0 : 1); + builder.CreateBr(merge_bb); + + builder.SetInsertPoint(rhs_bb); + llvm::Value *rhs = gen(child[1]); + if (rhs == nullptr) return nullptr; + llvm::Value *rhs_value = + builder.CreateCall(get_rt("rt_bool", ptr_ty, {ptr_ty}), {rhs}); + llvm::BasicBlock *rhs_end = builder.GetInsertBlock(); + builder.CreateBr(merge_bb); + + builder.SetInsertPoint(merge_bb); + llvm::PHINode *phi = builder.CreatePHI(ptr_ty, 2); + phi->addIncoming(short_value, short_bb); + phi->addIncoming(rhs_value, rhs_end); + return phi; + } + + llvm::Value *gen_unary_op(const std::shared_ptr &node) { + std::shared_ptr op = node->get_tok(); + int64_t code; + if (op->get_type() == TOKEN_ADD) { + code = RT_OP_UPLUS; + } else if (op->get_type() == TOKEN_SUB) { + code = RT_OP_UNEG; + } else if (op->get_type() == TOKEN_KEYWORD && op->get_value() == "not") { + code = RT_OP_UNOT; + } else { + error("compile error: unsupported unary operator " + op->get_type(), + node); + return nullptr; + } + llvm::Value *operand = gen(node->get_child()[0]); + if (operand == nullptr) return nullptr; + return builder.CreateCall(get_rt("rt_unary_op", ptr_ty, {i64_ty, ptr_ty}), + {builder.getInt64(code), operand}); + } + + /// ---- control flow ---- + + llvm::Value *gen_if(const std::shared_ptr &node) { + IfNode *if_node = dynamic_cast(node.get()); + llvm::Value *cond = gen(if_node->get_condition()); + if (cond == nullptr) return nullptr; + llvm::Value *taken = builder.CreateICmpNE( + builder.CreateCall(get_rt("rt_cond_eq1", i64_ty, {ptr_ty}), {cond}), + builder.getInt64(0)); + + llvm::Function *fn = builder.GetInsertBlock()->getParent(); + llvm::BasicBlock *then_bb = llvm::BasicBlock::Create(ctx, "if.then", fn); + llvm::BasicBlock *else_bb = llvm::BasicBlock::Create(ctx, "if.else", fn); + llvm::BasicBlock *merge_bb = llvm::BasicBlock::Create(ctx, "if.merge", fn); + llvm::AllocaInst *slot = entry_alloca(ptr_ty); + builder.CreateCondBr(taken, then_bb, else_bb); + + bool merge_reachable = false; + builder.SetInsertPoint(then_bb); + llvm::Value *then_value = gen_statements(if_node->get_expr()); + if (!errors.empty()) return nullptr; + if (then_value != nullptr) { + builder.CreateStore(then_value, slot); + } + if (!block_terminated()) { + builder.CreateBr(merge_bb); + merge_reachable = true; + } + + builder.SetInsertPoint(else_bb); + llvm::Value *else_value = if_node->get_else().empty() + ? make_int(0) + : gen_statements(if_node->get_else()); + if (!errors.empty()) return nullptr; + if (else_value != nullptr) { + builder.CreateStore(else_value, slot); + } + if (!block_terminated()) { + builder.CreateBr(merge_bb); + merge_reachable = true; + } + + if (!merge_reachable) { + merge_bb->eraseFromParent(); + return nullptr; + } + builder.SetInsertPoint(merge_bb); + return builder.CreateLoad(ptr_ty, slot); + } + + llvm::Value *gen_while(const std::shared_ptr &node) { + NodeList child = node->get_child(); + llvm::Function *fn = builder.GetInsertBlock()->getParent(); + llvm::BasicBlock *header = llvm::BasicBlock::Create(ctx, "while.cond", fn); + llvm::BasicBlock *body_bb = llvm::BasicBlock::Create(ctx, "while.body", fn); + llvm::BasicBlock *exit_bb = llvm::BasicBlock::Create(ctx, "while.exit", fn); + + llvm::Value *mark = frame_mark(); + builder.CreateBr(header); + + // One arena frame per iteration covers the condition and the body. + builder.SetInsertPoint(header); + frame_push(); + llvm::Value *cond = gen(child[0]); + if (cond == nullptr) return nullptr; + llvm::Value *enter = builder.CreateICmpEQ(as_int(cond), builder.getInt64(1)); + builder.CreateCondBr(enter, body_bb, exit_bb); + + builder.SetInsertPoint(body_bb); + loops.push_back({header, exit_bb, mark, true}); + bool terminated = gen_body(NodeList(child.begin() + 1, child.end())); + loops.pop_back(); + if (!errors.empty()) return nullptr; + if (!terminated) { + frame_release(mark); + builder.CreateBr(header); + } + + builder.SetInsertPoint(exit_bb); + frame_release(mark); + return make_none(); + } + + llvm::Value *gen_repeat(const std::shared_ptr &node) { + NodeList child = node->get_child(); + llvm::Function *fn = builder.GetInsertBlock()->getParent(); + llvm::BasicBlock *body_bb = llvm::BasicBlock::Create(ctx, "repeat.body", fn); + llvm::BasicBlock *latch = llvm::BasicBlock::Create(ctx, "repeat.cond", fn); + llvm::BasicBlock *exit_bb = llvm::BasicBlock::Create(ctx, "repeat.exit", fn); + + llvm::Value *mark = frame_mark(); + builder.CreateBr(body_bb); + + builder.SetInsertPoint(body_bb); + frame_push(); + loops.push_back({latch, exit_bb, mark, false}); + bool terminated = gen_body(NodeList(child.begin() + 1, child.end())); + loops.pop_back(); + if (!errors.empty()) return nullptr; + if (!terminated) { + builder.CreateBr(latch); + } + + builder.SetInsertPoint(latch); + llvm::Value *cond = gen(child[0]); + if (cond == nullptr) return nullptr; + llvm::Value *again = builder.CreateICmpEQ(as_int(cond), builder.getInt64(0)); + frame_release(mark); + builder.CreateCondBr(again, body_bb, exit_bb); + + builder.SetInsertPoint(exit_bb); + frame_release(mark); + return make_none(); + } + + llvm::Value *gen_for(const std::shared_ptr &node) { + NodeList child = node->get_child(); + // Evaluation order matches visit_for: assign, step (default 1), end. + llvm::Value *init = gen(child[0]); + if (init == nullptr) return nullptr; + llvm::Value *step = child[2] != nullptr ? gen(child[2]) : make_int(1); + if (step == nullptr) return nullptr; + llvm::Value *end = gen(child[1]); + if (end == nullptr) return nullptr; + builder.CreateCall(get_rt("rt_for_step_check", builder.getVoidTy(), + {ptr_ty}), + {step}); + + const std::string var_name = child[0]->get_name(); + llvm::AllocaInst *slot = entry_alloca(ptr_ty); + builder.CreateStore(init, slot); + + // Dedicated frame keeping the latest loop-variable value alive even if + // the body rebinds the variable (the interpreter holds it in a local). + llvm::Value *var_frame = frame_mark(); + frame_push(); + llvm::Value *iter_mark = frame_mark(); + + llvm::Function *fn = builder.GetInsertBlock()->getParent(); + llvm::BasicBlock *header = llvm::BasicBlock::Create(ctx, "for.cond", fn); + llvm::BasicBlock *body_bb = llvm::BasicBlock::Create(ctx, "for.body", fn); + llvm::BasicBlock *latch = llvm::BasicBlock::Create(ctx, "for.latch", fn); + llvm::BasicBlock *exit_bb = llvm::BasicBlock::Create(ctx, "for.exit", fn); + builder.CreateBr(header); + + builder.SetInsertPoint(header); + llvm::Value *keep_going = builder.CreateICmpNE( + builder.CreateCall(get_rt("rt_for_cond", i64_ty, {ptr_ty, ptr_ty, ptr_ty}), + {builder.CreateLoad(ptr_ty, slot), end, step}), + builder.getInt64(0)); + builder.CreateCondBr(keep_going, body_bb, exit_bb); + + builder.SetInsertPoint(body_bb); + frame_push(); + loops.push_back({latch, exit_bb, iter_mark, false}); + bool terminated = gen_body(NodeList(child.begin() + 3, child.end())); + loops.pop_back(); + if (!errors.empty()) return nullptr; + if (!terminated) { + builder.CreateBr(latch); + } + + // Latch mirrors visit_for: the next value comes from the value read at + // the previous latch, not from body reassignments of the variable. + builder.SetInsertPoint(latch); + llvm::Value *next = builder.CreateCall( + get_rt("rt_bin_op", ptr_ty, {i64_ty, ptr_ty, ptr_ty}), + {builder.getInt64(RT_OP_ADD), builder.CreateLoad(ptr_ty, slot), step}); + builder.CreateCall(get_rt("rt_set_var", ptr_ty, {ptr_ty, ptr_ty}), + {cstring(var_name), next}); + builder.CreateCall(get_rt("rt_loop_keep", builder.getVoidTy(), + {i64_ty, ptr_ty}), + {var_frame, next}); + builder.CreateStore(next, slot); + frame_release(iter_mark); + builder.CreateBr(header); + + builder.SetInsertPoint(exit_bb); + frame_release(var_frame); + return make_none(); + } + + // Emits a loop body (one or more statements). Returns true when the body + // terminated the current block (break/continue/return on every path). + bool gen_body(const NodeList &body) { + for (const auto &stmt : body) { + if (gen(stmt) == nullptr) { + return block_terminated() || !errors.empty(); + } + } + return false; + } + + llvm::Value *gen_loop_jump(const std::shared_ptr &node, bool is_break) { + if (loops.empty()) { + error(std::string("compile error: ") + + (is_break ? "break" : "continue") + + " outside of a loop is not supported by the compiler", + node); + return nullptr; + } + const LoopContext &loop = loops.back(); + if (is_break) { + frame_release(loop.iter_mark); + builder.CreateBr(loop.exit); + } else { + if (loop.release_on_continue) { + frame_release(loop.iter_mark); + } + builder.CreateBr(loop.latch); + } + return nullptr; + } + + llvm::Value *gen_return(const std::shared_ptr &node) { + llvm::Value *value = gen(node->get_child()[0]); + if (value == nullptr) return nullptr; + llvm::Function *fn = builder.GetInsertBlock()->getParent(); + if (fn->getName() == "main") { + // Top-level `return` does not stop execution in the interpreter. + return value; + } + builder.CreateRet(value); + return nullptr; + } + + /// ---- functions and calls ---- + + llvm::Value *gen_algo_def(const std::shared_ptr &node) { + const std::string name = node->get_name(); + if (name.find("::") != std::string::npos) { + error("compile error: Struct is not supported by the compiler yet", + node); + return nullptr; + } + + AlgorithmDefNode *def = dynamic_cast(node.get()); + std::vector arg_names; + for (const auto &tok : node->get_toks()) { + arg_names.push_back(tok->get_value()); + } + + llvm::Function *fn = llvm::Function::Create( + llvm::FunctionType::get(ptr_ty, false), llvm::Function::PrivateLinkage, + "ps.algo." + std::to_string(algo_counter++) + "." + name, module); + + llvm::IRBuilderBase::InsertPoint saved = builder.saveIP(); + std::vector saved_loops; + saved_loops.swap(loops); + + llvm::BasicBlock *entry = llvm::BasicBlock::Create(ctx, "entry", fn); + builder.SetInsertPoint(entry); + llvm::Value *last = gen_statements(def->get_body()); + if (!block_terminated() && errors.empty()) { + builder.CreateRet(last != nullptr ? last : make_none()); + } + + loops.swap(saved_loops); + builder.restoreIP(saved); + if (!errors.empty()) { + return nullptr; + } + + // Registration happens at the definition site, like visit_algo_def. + llvm::ArrayType *names_ty = llvm::ArrayType::get(ptr_ty, arg_names.size()); + std::vector name_ptrs; + for (const auto &arg : arg_names) { + name_ptrs.push_back(llvm::cast(cstring(arg))); + } + auto *names_global = new llvm::GlobalVariable( + module, names_ty, true, llvm::GlobalValue::PrivateLinkage, + llvm::ConstantArray::get(names_ty, name_ptrs), "args"); + return builder.CreateCall( + get_rt("rt_define_algo", ptr_ty, {ptr_ty, ptr_ty, ptr_ty, i64_ty}), + {cstring(name), fn, names_global, + builder.getInt64(static_cast(arg_names.size()))}); + } + + llvm::Value *gen_algo_call(const std::shared_ptr &node) { + AlgorithmCallNode *call = dynamic_cast(node.get()); + std::shared_ptr callee_node = call->get_call(); + llvm::Value *callee; + if (callee_node->get_type() == NODE_VARACCESS) { + callee = gen_var_access(callee_node); + } else { + callee = gen(callee_node); + } + if (callee == nullptr) return nullptr; + + const NodeList &args = call->get_args(); + llvm::Value *argv; + if (args.empty()) { + argv = llvm::ConstantPointerNull::get(ptr_ty); + } else { + llvm::ArrayType *argv_ty = llvm::ArrayType::get(ptr_ty, args.size()); + llvm::Function *fn = builder.GetInsertBlock()->getParent(); + llvm::IRBuilder<> tmp(&fn->getEntryBlock(), fn->getEntryBlock().begin()); + llvm::AllocaInst *slots = tmp.CreateAlloca(argv_ty); + for (size_t i = 0; i < args.size(); ++i) { + llvm::Value *arg = gen(args[i]); + if (arg == nullptr) return nullptr; + builder.CreateStore( + arg, builder.CreateConstInBoundsGEP2_64(argv_ty, slots, 0, i)); + } + argv = slots; + } + return builder.CreateCall( + get_rt("rt_call", ptr_ty, {ptr_ty, ptr_ty, i64_ty}), + {callee, argv, builder.getInt64(static_cast(args.size()))}); + } + + /// ---- arrays, hash tables, members ---- + + llvm::Value *gen_array(const std::shared_ptr &node) { + llvm::Value *array = builder.CreateCall(get_rt("rt_array_new", ptr_ty, {})); + for (const auto &element : node->get_child()) { + llvm::Value *value = gen(element); + if (value == nullptr) return nullptr; + builder.CreateCall(get_rt("rt_array_push", builder.getVoidTy(), + {ptr_ty, ptr_ty}), + {array, value}); + } + return array; + } + + llvm::Value *gen_array_access(const std::shared_ptr &node) { + NodeList child = node->get_child(); + llvm::Value *container = gen(child[0]); + if (container == nullptr) return nullptr; + llvm::Value *index = gen(child[1]); + if (index == nullptr) return nullptr; + return builder.CreateCall(get_rt("rt_index", ptr_ty, {ptr_ty, ptr_ty}), + {container, index}); + } + + llvm::Value *gen_array_assign(const std::shared_ptr &node) { + NodeList child = node->get_child(); + if (child[0]->get_type() == NODE_MEMACCESS) { + NodeList member_child = child[0]->get_child(); + llvm::Value *object = gen(member_child[0]); + if (object == nullptr) return nullptr; + llvm::Value *value = gen(child[1]); + if (value == nullptr) return nullptr; + return builder.CreateCall( + get_rt("rt_member_assign", ptr_ty, {ptr_ty, ptr_ty, ptr_ty}), + {object, cstring(member_child[1]->get_name()), value}); + } + if (child[0]->get_type() != NODE_ARRACCESS) { + error("compile error: assignment target must be an array element or " + "object member", + node); + return nullptr; + } + NodeList access_child = child[0]->get_child(); + llvm::Value *container = gen(access_child[0]); + if (container == nullptr) return nullptr; + llvm::Value *index = gen(access_child[1]); + if (index == nullptr) return nullptr; + llvm::Value *value = gen(child[1]); + if (value == nullptr) return nullptr; + return builder.CreateCall( + get_rt("rt_index_assign", ptr_ty, {ptr_ty, ptr_ty, ptr_ty}), + {container, index, value}); + } + + llvm::Value *gen_member_access(const std::shared_ptr &node) { + NodeList child = node->get_child(); + llvm::Value *object = gen(child[0]); + if (object == nullptr) return nullptr; + return builder.CreateCall( + get_rt("rt_member_access", ptr_ty, {ptr_ty, ptr_ty}), + {object, cstring(child[1]->get_name())}); + } +}; + +} // namespace + +bool Compiler::compile(const NodeList &ast, llvm::Module &module, + std::vector &errors) { + CodeGen codegen(module, errors); + return codegen.run(ast); +} diff --git a/src/compiler.h b/src/compiler.h new file mode 100644 index 0000000..f6b9488 --- /dev/null +++ b/src/compiler.h @@ -0,0 +1,25 @@ +/// -------------------- +/// LLVM AOT compiler +/// -------------------- + +#ifndef COMPILER_H +#define COMPILER_H + +#include "node.h" +#include +#include + +namespace llvm { +class Module; +} // namespace llvm + +class Compiler { +public: + // Lowers the parsed program into `module` (a `main` function plus one + // function per Algorithm). Returns false and fills `errors` when the + // program uses features the compiler does not support. + static bool compile(const NodeList &ast, llvm::Module &module, + std::vector &errors); +}; + +#endif diff --git a/src/pseudoc.cpp b/src/pseudoc.cpp new file mode 100644 index 0000000..b5cec10 --- /dev/null +++ b/src/pseudoc.cpp @@ -0,0 +1,267 @@ +/// -------------------- +/// pseudoc driver +/// -------------------- +/// +/// Compiles a .ps source file to a native executable: +/// pseudoc [-o ] [--emit-llvm] [--runtime-lib ] + +#include "compiler.h" +#include "error.h" +#include "imports.h" +#include "lexer.h" +#include "node.h" +#include "parser.h" +#include "token.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace { + +namespace fs = std::filesystem; + +void usage() { + std::cout << "usage: pseudoc [-o ] [--emit-llvm] " + "[--runtime-lib ]\n"; +} + +std::string find_runtime_lib(const std::string &flag_value, const char *argv0) { + std::vector candidates; + if (!flag_value.empty()) { + candidates.emplace_back(flag_value); + } + if (const char *env = std::getenv("PSEUDO_RT_LIB")) { + candidates.emplace_back(env); + } + std::error_code ec; + fs::path exe = fs::weakly_canonical(fs::path(argv0), ec); + if (!ec && exe.has_parent_path()) { + candidates.push_back(exe.parent_path() / "build" / "libpseudort.a"); + } + candidates.push_back(fs::current_path() / "build" / "libpseudort.a"); + + for (const auto &candidate : candidates) { + if (fs::exists(candidate, ec) && fs::is_regular_file(candidate, ec)) { + return candidate.string(); + } + } + return ""; +} + +std::string shell_quote(const std::string &text) { + std::string quoted = "'"; + for (char c : text) { + if (c == '\'') { + quoted += "'\\''"; + } else { + quoted += c; + } + } + quoted += "'"; + return quoted; +} + +} // namespace + +int main(int argc, char **argv) { + std::string input_path, output_path, runtime_lib_flag; + bool emit_llvm = false; + for (int i = 1; i < argc; ++i) { + std::string arg = argv[i]; + if (arg == "-o" && i + 1 < argc) { + output_path = argv[++i]; + } else if (arg == "--emit-llvm") { + emit_llvm = true; + } else if (arg == "--runtime-lib" && i + 1 < argc) { + runtime_lib_flag = argv[++i]; + } else if (arg == "-h" || arg == "--help") { + usage(); + return 0; + } else if (!arg.empty() && arg[0] == '-') { + std::cout << "unknown option: " << arg << "\n"; + usage(); + return 1; + } else if (input_path.empty()) { + input_path = arg; + } else { + usage(); + return 1; + } + } + if (input_path.empty()) { + usage(); + return 1; + } + if (output_path.empty()) { + output_path = fs::path(input_path).stem().string(); + if (output_path.empty()) { + output_path = "a.out"; + } + } + + std::ifstream input(input_path); + if (!input) { + std::cout << "cannot open " << input_path << "\n"; + return 1; + } + std::string code, line; + while (std::getline(input, line)) { + code += line + "\n"; + } + + ImportState import_state; + std::string expanded_text, import_error; + if (!expand_imports(input_path, code, import_state, expanded_text, + import_error)) { + std::cout << import_error << "\n"; + return 1; + } + + Lexer lexer(input_path, expanded_text); + TokenList tokens = lexer.make_tokens(); + for (const auto &tok : tokens) { + if (tok->get_type() == TOKEN_ERROR) { + std::cout << "Error: " << tok->get_value() << ", line " + << tok->get_pos().line + 1 + << ", column: " << tok->get_pos().column << "\n"; + std::cout << error_marker(expanded_text, tok->get_pos(), + tok->get_pos()); + return 1; + } + } + + Parser parser(tokens); + NodeList ast = parser.parse(); + for (const auto &node : ast) { + if (node->get_type() == NODE_ERROR) { + std::shared_ptr err_tok = node->get_tok(); + if (err_tok) { + std::cout << "Error: " << err_tok->get_value() << ", line " + << err_tok->get_pos().line + 1 + << ", column: " << err_tok->get_pos().column << "\n"; + std::cout << error_marker(expanded_text, err_tok->get_pos(), + err_tok->get_pos()); + } else { + std::cout << "Error: " << node->get_node() << "\n"; + } + return 1; + } + } + + llvm::LLVMContext context; + llvm::Module module(input_path, context); + std::vector compile_errors; + if (!Compiler::compile(ast, module, compile_errors)) { + for (const auto &message : compile_errors) { + std::cout << message << "\n"; + } + return 1; + } + + if (emit_llvm) { + module.print(llvm::outs(), nullptr); + return 0; + } + + if (llvm::verifyModule(module, &llvm::errs())) { + std::cout << "internal error: generated module is invalid\n"; + return 1; + } + + llvm::InitializeNativeTarget(); + llvm::InitializeNativeTargetAsmPrinter(); + llvm::InitializeNativeTargetAsmParser(); + + std::string triple_name = llvm::sys::getDefaultTargetTriple(); + std::string lookup_error; + const llvm::Target *target = + llvm::TargetRegistry::lookupTarget(triple_name, lookup_error); + if (target == nullptr) { + std::cout << "target lookup failed: " << lookup_error << "\n"; + return 1; + } + llvm::TargetOptions target_options; + llvm::TargetMachine *machine = target->createTargetMachine( + llvm::Triple(triple_name), "generic", "", target_options, + llvm::Reloc::PIC_); + module.setDataLayout(machine->createDataLayout()); + module.setTargetTriple(llvm::Triple(triple_name)); + + // Standard O2 pipeline. + llvm::LoopAnalysisManager lam; + llvm::FunctionAnalysisManager fam; + llvm::CGSCCAnalysisManager cgam; + llvm::ModuleAnalysisManager mam; + llvm::PassBuilder pass_builder(machine); + pass_builder.registerModuleAnalyses(mam); + pass_builder.registerCGSCCAnalyses(cgam); + pass_builder.registerFunctionAnalyses(fam); + pass_builder.registerLoopAnalyses(lam); + pass_builder.crossRegisterProxies(lam, fam, cgam, mam); + llvm::ModulePassManager mpm = + pass_builder.buildPerModuleDefaultPipeline(llvm::OptimizationLevel::O2); + mpm.run(module, mam); + + fs::path object_path = + fs::temp_directory_path() / + ("pseudoc-" + std::to_string(::getpid()) + ".o"); + { + std::error_code ec; + llvm::raw_fd_ostream object_stream(object_path.string(), ec, + llvm::sys::fs::OF_None); + if (ec) { + std::cout << "cannot write " << object_path.string() << ": " + << ec.message() << "\n"; + return 1; + } + llvm::legacy::PassManager emit_pm; + if (machine->addPassesToEmitFile(emit_pm, object_stream, nullptr, + llvm::CodeGenFileType::ObjectFile)) { + std::cout << "target cannot emit object files\n"; + return 1; + } + emit_pm.run(module); + } + + std::string runtime_lib = find_runtime_lib(runtime_lib_flag, argv[0]); + if (runtime_lib.empty()) { + std::cout << "cannot find libpseudort.a (build it with `make runtime`, " + "or pass --runtime-lib)\n"; + fs::remove(object_path); + return 1; + } + + std::string linker = "c++"; + if (const char *env = std::getenv("PSEUDO_LD")) { + linker = env; + } + std::string command = linker + " " + shell_quote(object_path.string()) + + " " + shell_quote(runtime_lib) + " -o " + + shell_quote(output_path); + int status = std::system(command.c_str()); + fs::remove(object_path); + if (status != 0) { + std::cout << "link failed: " << command << "\n"; + return 1; + } + return 0; +} diff --git a/src/runtime.cpp b/src/runtime.cpp index ed33fce..51cb52c 100644 --- a/src/runtime.cpp +++ b/src/runtime.cpp @@ -260,8 +260,8 @@ Value *rt_member_assign(Value *obj, const char *name, Value *v) { VALUE_ERROR, "Assignment to member only supported for Struct Instances\n")); } -void rt_define_algo(const char *name, Value *(*fn)(), - const char *const *arg_names, int64_t nargs) { +Value *rt_define_algo(const char *name, Value *(*fn)(), + const char *const *arg_names, int64_t nargs) { std::vector names; names.reserve(nargs); for (int64_t i = 0; i < nargs; ++i) { @@ -270,7 +270,7 @@ void rt_define_algo(const char *name, Value *(*fn)(), std::shared_ptr algo = std::make_shared(name, fn, std::move(names)); current_scope().set(name, algo); - track(algo); + return track(algo); } Value *rt_call(Value *callee, Value **argv, int64_t argc) { @@ -304,4 +304,10 @@ void rt_frame_release(int64_t mark) { } } +void rt_loop_keep(int64_t frame_index, Value *v) { + std::shared_ptr kept = ref(v); + frames[frame_index].clear(); + frames[frame_index].push_back(kept); +} + } // extern "C" diff --git a/src/runtime.h b/src/runtime.h index 58c92ee..45dff6a 100644 --- a/src/runtime.h +++ b/src/runtime.h @@ -73,13 +73,16 @@ Value *rt_index_assign(Value *obj, Value *idx, Value *v); Value *rt_member_access(Value *obj, const char *name); Value *rt_member_assign(Value *obj, const char *name, Value *v); -void rt_define_algo(const char *name, Value *(*fn)(), - const char *const *arg_names, int64_t nargs); +Value *rt_define_algo(const char *name, Value *(*fn)(), + const char *const *arg_names, int64_t nargs); Value *rt_call(Value *callee, Value **argv, int64_t argc); int64_t rt_frame_mark(); void rt_frame_push(); void rt_frame_release(int64_t mark); +// Replaces the contents of frame `frame_index` with just `v`: keeps the +// current loop variable alive for one iteration without per-iteration growth. +void rt_loop_keep(int64_t frame_index, Value *v); } #endif From 3685846de4a6736c7c2d8f12d74ed0331807f97d Mon Sep 17 00:00:00 2001 From: mtmatt Date: Wed, 10 Jun 2026 20:39:05 +0800 Subject: [PATCH 07/12] feat: memoize compiled pure-numeric algorithms, docs and CI updates Shares the interpreter's is_memoizable_numeric_algo analysis (now in src/analysis.h) so compiled recursive numeric algorithms get the same by-argument caching. Documents the compile workflow in the README and makes the clang-tidy CI script tolerate missing LLVM headers. Co-Authored-By: Claude Fable 5 --- README.md | 36 +- ci/clang-tidy-check.sh | 13 + .../plans/2026-06-10-llvm-compiler.md | 42 +- .../specs/2026-06-10-llvm-compiler-design.md | 13 + pseudoc | Bin 0 -> 845032 bytes src/analysis.h | 21 + src/compiler.cpp | 400 ++++++++---------- src/compiler.h | 11 +- src/imports.h | 5 +- src/pseudo.cpp | 5 + src/pseudoc.cpp | 72 ++-- src/runtime.cpp | 226 +++++----- src/runtime.h | 48 ++- 13 files changed, 488 insertions(+), 404 deletions(-) create mode 100755 pseudoc create mode 100644 src/analysis.h diff --git a/README.md b/README.md index 9ff23c9..f314a24 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,40 @@ # PseudoCodeInterpreter -Transform pseudo-code into an executable programming language. +Transform pseudo-code into an executable programming language. Programs can be +run with the interpreter (`pseudo`) or compiled to native executables with the +LLVM-based compiler (`pseudoc`). + +## Compiling to Native Code + +Requires LLVM (e.g. `brew install llvm`). Build and use the compiler: + +```sh +make # interpreter (used as reference by the test suite) +make compiler # builds pseudoc and build/libpseudort.a +./pseudoc program.ps -o program +./program +``` + +Options: + +- `-o `: output executable path (defaults to the source basename). +- `--emit-llvm`: print the generated LLVM IR instead of producing a binary. +- `--runtime-lib `: explicit path to `libpseudort.a` (also settable via + `$PSEUDO_RT_LIB`; by default it is found next to the `pseudoc` binary). + +The compiler lowers the AST to LLVM IR (optimized at `-O2`), where each +language operation calls into a runtime built from the interpreter's own value +and symbol-table code, so compiled behavior matches the interpreter. Recursive +pure-numeric algorithms get the same by-argument memoization the interpreter +applies. Compiled output is verified against the interpreter by +`make test-compiler` (differential tests in `test/compiler/`). + +Current limitations: + +- `Struct` definitions are not supported yet (clear compile-time error); + `import` of struct-based modules such as `dsa` therefore also fails. +- A loop used as a function's implicit return value evaluates to `NONE` + instead of the interpreter's collected per-iteration array. ## Data Types diff --git a/ci/clang-tidy-check.sh b/ci/clang-tidy-check.sh index b911c12..c5957f8 100755 --- a/ci/clang-tidy-check.sh +++ b/ci/clang-tidy-check.sh @@ -16,9 +16,21 @@ else fi fi +# src/compiler.cpp and src/pseudoc.cpp need LLVM headers; skip them when no +# LLVM development install is available. +llvm_config="$(command -v llvm-config || echo /opt/homebrew/opt/llvm/bin/llvm-config)" +llvm_flags=() +llvm_filter='cat' +if "${llvm_config}" --includedir >/dev/null 2>&1; then + llvm_flags=("-I$(${llvm_config} --includedir)") +else + llvm_filter="grep -Ev '^src/(compiler|pseudoc)\\.cpp$'" +fi + mapfile -t files < <( printf '%s\n' "${changed_files}" \ | grep -E '^(src|test)/.*\.cpp$' \ + | eval "${llvm_filter}" \ || true ) @@ -31,4 +43,5 @@ clang-tidy --warnings-as-errors='*' "${files[@]}" -- \ -std=c++17 \ -Isrc \ -Igoogletest/googletest/include \ + "${llvm_flags[@]}" \ -pthread diff --git a/docs/superpowers/plans/2026-06-10-llvm-compiler.md b/docs/superpowers/plans/2026-06-10-llvm-compiler.md index f14e2dc..a4c2b32 100644 --- a/docs/superpowers/plans/2026-06-10-llvm-compiler.md +++ b/docs/superpowers/plans/2026-06-10-llvm-compiler.md @@ -17,9 +17,9 @@ - Create: `test/compiler/basics.ps`, `test/compiler/control_flow.ps`, `test/compiler/functions.ps`, `test/compiler/collections.ps`, `test/compiler/errors.ps` - Modify: `Makefile` (add `test-compiler` target) -- [ ] **Step 1:** Write `test/compiler_tests.sh`: for each `.ps` in `test/compiler/` plus `test/test_fib.ps`, `test/test_repeat.ps`, `test/test_array_methods.ps`, `test/test_string_index.ps`, run `./pseudo f.ps > expected`, `./pseudoc f.ps -o tmpbin && ./tmpbin > actual`, diff. Exit nonzero on any mismatch. Also assert `./pseudoc test/test_struct.ps` fails with a struct compile error. -- [ ] **Step 2:** Write the five new `.ps` fixtures covering: int/float/string arithmetic and comparisons, `and/or/not`, unary minus, `^` and `%`; if/else-if chains, for with step (incl. negative), while/repeat with break/continue, nested loops; recursion (fib), functions using caller scope, too-few-args error; arrays (literal, index assign, push/pop/insert/remove/resize/size/back), hash tables (set/get/contains/keys/size), string indexing and concatenation; index-out-of-range error. -- [ ] **Step 3:** Run `bash test/compiler_tests.sh` — must FAIL (`pseudoc` missing). Commit. +- [x] **Step 1:** Write `test/compiler_tests.sh`: for each `.ps` in `test/compiler/` plus `test/test_fib.ps`, `test/test_repeat.ps`, `test/test_array_methods.ps`, `test/test_string_index.ps`, run `./pseudo f.ps > expected`, `./pseudoc f.ps -o tmpbin && ./tmpbin > actual`, diff. Exit nonzero on any mismatch. Also assert `./pseudoc test/test_struct.ps` fails with a struct compile error. +- [x] **Step 2:** Write the five new `.ps` fixtures covering: int/float/string arithmetic and comparisons, `and/or/not`, unary minus, `^` and `%`; if/else-if chains, for with step (incl. negative), while/repeat with break/continue, nested loops; recursion (fib), functions using caller scope, too-few-args error; arrays (literal, index assign, push/pop/insert/remove/resize/size/back), hash tables (set/get/contains/keys/size), string indexing and concatenation; index-out-of-range error. +- [x] **Step 3:** Run `bash test/compiler_tests.sh` — must FAIL (`pseudoc` missing). Commit. ### Task 2: Minimal intrusive changes to interpreter core @@ -30,7 +30,7 @@ - Create: `src/imports.h` - Modify: `src/pseudo.cpp` (move `ImportState`/`expand_imports` out of anonymous namespace, include `imports.h`) -- [ ] **Step 1:** `class Value : public std::enable_shared_from_this`; add +- [x] **Step 1:** `class Value : public std::enable_shared_from_this`; add ```cpp class PrecomputedNode : public Node { @@ -44,8 +44,8 @@ protected: }; ``` -- [ ] **Step 2:** `imports.h` declares `struct ImportState` and `bool expand_imports(const std::string&, const std::string&, ImportState&, std::string&, std::string&);` matching the current pseudo.cpp definitions. -- [ ] **Step 3:** `make clean && make && make test` — all existing gtests PASS. Run an example to sanity-check. Commit. +- [x] **Step 2:** `imports.h` declares `struct ImportState` and `bool expand_imports(const std::string&, const std::string&, ImportState&, std::string&, std::string&);` matching the current pseudo.cpp definitions. +- [x] **Step 3:** `make clean && make && make test` — all existing gtests PASS. Run an example to sanity-check. Commit. ### Task 3: Runtime library `libpseudort.a` @@ -53,7 +53,7 @@ protected: - Create: `src/runtime.h`, `src/runtime.cpp` - Modify: `Makefile` (`runtime` target producing `build/libpseudort.a` from all interpreter objects except `shell.o`, plus `runtime.o`) -- [ ] **Step 1:** `runtime.h` — extern "C" ABI (all value params/returns are raw `Value*` kept alive by arena frames): +- [x] **Step 1:** `runtime.h` — extern "C" ABI (all value params/returns are raw `Value*` kept alive by arena frames): ```cpp extern "C" { @@ -91,8 +91,8 @@ Value* rt_keep(Value* v, int64_t mark); // re-register v in frame `mark`-1 (surv } ``` -- [ ] **Step 2:** Implement in runtime.cpp: global `std::vector>> frames` and `std::vector> scopes` (global scope created by `rt_init`); `CompiledAlgoValue : Value` holding `Value*(*fn)()` and arg names; `rt_call` dispatch (compiled → arity check with interpreter's exact colored error strings, new scope + frame, bind args, invoke; otherwise wrap args in `PrecomputedNode` and call `callee->execute(nodes, current_scope)`). Binary/unary ops call the existing `operator+` etc. on `shared_from_this()` handles. Any `VALUE_ERROR` encountered → print `get_num()` + `"\n"`, `exit(1)`. -- [ ] **Step 3:** `make runtime` builds `build/libpseudort.a`. Commit. +- [x] **Step 2:** Implement in runtime.cpp: global `std::vector>> frames` and `std::vector> scopes` (global scope created by `rt_init`); `CompiledAlgoValue : Value` holding `Value*(*fn)()` and arg names; `rt_call` dispatch (compiled → arity check with interpreter's exact colored error strings, new scope + frame, bind args, invoke; otherwise wrap args in `PrecomputedNode` and call `callee->execute(nodes, current_scope)`). Binary/unary ops call the existing `operator+` etc. on `shared_from_this()` handles. Any `VALUE_ERROR` encountered → print `get_num()` + `"\n"`, `exit(1)`. +- [x] **Step 3:** `make runtime` builds `build/libpseudort.a`. Commit. ### Task 4: Compiler skeleton + driver (milestone: arithmetic & print) @@ -101,33 +101,33 @@ Value* rt_keep(Value* v, int64_t mark); // re-register v in frame `mark`-1 (surv - Create: `src/pseudoc.cpp` (driver: args, expand_imports, lex/parse with run()-style error printing, codegen, verify, O2 PassBuilder, TargetMachine object emission, link via `c++`) - Modify: `Makefile` (`compiler` target via `llvm-config`, default `/opt/homebrew/opt/llvm/bin/llvm-config` fallback; link `-lLLVM` from `--libdir` with rpath) -- [ ] **Step 1:** Codegen for: ValueNode literals, VarAccess/VarAssign, BinOp/UnaryOp (`rt_bin_op` with op codes), AlgorithmCall (callee codegen + `rt_call`), statement sequencing in `main` (`rt_init` first, `ret i32 0` last). Unsupported node types → recorded compile error. -- [ ] **Step 2:** Driver `--emit-llvm` and `-o`; runtime archive lookup (`--runtime-lib`, `$PSEUDO_RT_LIB`, `/build/libpseudort.a`). -- [ ] **Step 3:** `make compiler`; `echo 'print("hi", 1 + 2 * 3)' > /tmp/t.ps && ./pseudoc /tmp/t.ps -o /tmp/t && /tmp/t` matches `./pseudo /tmp/t.ps`. Commit. +- [x] **Step 1:** Codegen for: ValueNode literals, VarAccess/VarAssign, BinOp/UnaryOp (`rt_bin_op` with op codes), AlgorithmCall (callee codegen + `rt_call`), statement sequencing in `main` (`rt_init` first, `ret i32 0` last). Unsupported node types → recorded compile error. +- [x] **Step 2:** Driver `--emit-llvm` and `-o`; runtime archive lookup (`--runtime-lib`, `$PSEUDO_RT_LIB`, `/build/libpseudort.a`). +- [x] **Step 3:** `make compiler`; `echo 'print("hi", 1 + 2 * 3)' > /tmp/t.ps && ./pseudoc /tmp/t.ps -o /tmp/t && /tmp/t` matches `./pseudo /tmp/t.ps`. Commit. ### Task 5: Control flow **Files:** - Modify: `src/compiler.cpp` -- [ ] **Step 1:** `if` (yields Int 0 when untaken, propagates last-statement value), `for` (assign → step default/check → end; latch keeps previous `i` slot per visit_for; per-iteration `rt_frame_mark`/`rt_frame_release`), `while`, `repeat`, `break`/`continue` (branch + release to loop mark), nested loops via a loop-context stack. -- [ ] **Step 2:** Differential run of `test/compiler/control_flow.ps`, `test/test_repeat.ps` — PASS. Commit. +- [x] **Step 1:** `if` (yields Int 0 when untaken, propagates last-statement value), `for` (assign → step default/check → end; latch keeps previous `i` slot per visit_for; per-iteration `rt_frame_mark`/`rt_frame_release`), `while`, `repeat`, `break`/`continue` (branch + release to loop mark), nested loops via a loop-context stack. +- [x] **Step 2:** Differential run of `test/compiler/control_flow.ps`, `test/test_repeat.ps` — PASS. Commit. ### Task 6: Functions and return **Files:** - Modify: `src/compiler.cpp` -- [ ] **Step 1:** AlgorithmDef → new LLVM function compiled with its own builder state (body statements; implicit result = last statement value; `ReturnNode` → `rt_keep` + `ret`); definition site emits `rt_define_algo` with arg-name global strings. Same handling when defs appear inside other bodies. -- [ ] **Step 2:** Differential run of `test/compiler/functions.ps`, `test/test_fib.ps` — PASS. Commit. +- [x] **Step 1:** AlgorithmDef → new LLVM function compiled with its own builder state (body statements; implicit result = last statement value; `ReturnNode` → `rt_keep` + `ret`); definition site emits `rt_define_algo` with arg-name global strings. Same handling when defs appear inside other bodies. +- [x] **Step 2:** Differential run of `test/compiler/functions.ps`, `test/test_fib.ps` — PASS. Commit. ### Task 7: Arrays, hash tables, strings, member calls **Files:** - Modify: `src/compiler.cpp` -- [ ] **Step 1:** ArrayNode literal, ArrayAccess (`rt_index`), ArrayAssign (`rt_index_assign`, including hash-table set; member assignment on non-instances reports the interpreter's error string at runtime), MemberAccess (`rt_member_access` → BoundMethodValue path; method calls flow through existing `rt_call` fallback). -- [ ] **Step 2:** Differential run of `test/compiler/collections.ps`, `test/test_array_methods.ps`, `test/test_string_index.ps` — PASS. Commit. +- [x] **Step 1:** ArrayNode literal, ArrayAccess (`rt_index`), ArrayAssign (`rt_index_assign`, including hash-table set; member assignment on non-instances reports the interpreter's error string at runtime), MemberAccess (`rt_member_access` → BoundMethodValue path; method calls flow through existing `rt_call` fallback). +- [x] **Step 2:** Differential run of `test/compiler/collections.ps`, `test/test_array_methods.ps`, `test/test_string_index.ps` — PASS. Commit. ### Task 8: Struct rejection, error fixtures, full suite @@ -135,9 +135,9 @@ Value* rt_keep(Value* v, int64_t mark); // re-register v in frame `mark`-1 (surv - Modify: `src/compiler.cpp` (NODE_STRUCTDEF → "compile error: Struct is not supported by the compiler yet" with location; same for instance member assignment when detectable) - Modify: `Makefile` (`test-compiler` runs harness) -- [ ] **Step 1:** `bash test/compiler_tests.sh` — ALL PASS (including struct rejection and runtime error fixtures). -- [ ] **Step 2:** `make test` still green; `ci/clang-format-check.sh` clean (format new files). -- [ ] **Step 3:** Update README (compile section). Commit. +- [x] **Step 1:** `bash test/compiler_tests.sh` — ALL PASS (including struct rejection and runtime error fixtures). +- [x] **Step 2:** `make test` still green; `ci/clang-format-check.sh` clean (format new files). +- [x] **Step 3:** Update README (compile section). Commit. ## Self-review notes diff --git a/docs/superpowers/specs/2026-06-10-llvm-compiler-design.md b/docs/superpowers/specs/2026-06-10-llvm-compiler-design.md index 06dca7d..bafbede 100644 --- a/docs/superpowers/specs/2026-06-10-llvm-compiler-design.md +++ b/docs/superpowers/specs/2026-06-10-llvm-compiler-design.md @@ -91,6 +91,19 @@ its `shared_ptr` in the current frame. Frames are pushed/popped: `err->get_num()` (same text the interpreter prints at top level) and exits with status 1. There is no error-value plumbing in generated IR. +### Documented v1 divergences from the interpreter + +- A loop used as a function's implicit return value evaluates to `NONE`; + the interpreter (with `collect_loop_results`) returns an array of + per-iteration values. Rarely used; revisit if needed. +- `break`/`continue` outside any loop are compile-time errors (the + interpreter propagates them as control values, which can even break an + outer loop across a function call — pathological behavior we do not + reproduce). +- Compiled recursive pure-numeric algorithms get the interpreter's + by-argument memoization via `rt_define_algo(..., memoizable)`, using the + shared `is_memoizable_numeric_algo` analysis (src/analysis.h). + ### Unsupported in v1 (clean compile-time error) - `Struct` definitions / instances (`NODE_STRUCTDEF`, member assignment on diff --git a/pseudoc b/pseudoc new file mode 100755 index 0000000000000000000000000000000000000000..e722f99b4b067f7e325d5ef9e44cf96fce1dac27 GIT binary patch literal 845032 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

$~X+!ab#&t0Lw$MyfuL)H4O{duU( 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ℜ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

J(*7dH|@oI4LCHI`2%pq zKFo1%ad?Ao0Qc_8?mtMJ_BQ)B+#dvI?#KRr1-FJW=e@)JD-U9R6`Xc3^I^U0K5z(g zHMo8z^V{Io!If}Ui+!x9GEI5A_^FHsf|5or~ za0hq`xD)&UxC=bDkHdF^JHP|rv)*U-F|g?a=KNzg{=2|V@JkYZBk_J8a(KgkqQuz} z|3%`5B<`2^H;KdgIlfk;FHz!riEAW&M&b`8{zc-WKk|<6bcr`gd^30)>3ba<9L4qx z|Csf)fSur^V^JT#@zKnIpRoV#80IbDusG&tz*S(&0Q--f$L?o<-Qb(RL*RG73GwWI z`llSe7Q6^N46XqOAJ6_f!S&!VaO4T>zTh*~*POt78#w4B<`HlPcc$2M{v|B?0>-!hYwlCyant8KMC#x+y2S^(^A?0@!;U) z%+=tM70h3QM^-Xtea+!rY0UND3h?{jYVa}tLVOwQ|5|V!_%m<|c;+zsA3B5mUkO&u zVphLl_vo{kH-lTwVSXJv4o?1-{Ws;Y`&Mw;dgfK%v3p29vpT|@SipQOc;H;-L%wJC zks@XnxW1UV3p@l~@B{k~EoJxDz;$KJX+N_2fQ$J~i7lh-o>b26XMk(Kb>Oaz?EWn{ zvVytjCk|h+nRysob3Sw8&+Oh0z6RWS0lU8g9t7|IZ}uOyh26`*85c5d12=+ajIsX_ z@bMC_250<*!|O?Tg6{)YfIkP*P5xgdV{U^Q7 z`nG|q-ejI1$nMQO%%_4I-(vm@-0(JY`84+5^bYfP;FNcnFP+ZrY5!pUFL>lV=4*r4 zeYlVLusxVZ-)F7|*M7)+EL9d!{x$u~9pJi;n2+C!-Qz!DzB!mVX@Gg{-poVb$M<1Q z_>A3u0K2|qzHMK2PydQ}ehBmpF+U2<03Wj-yKe!vf=9s%_h{yvG-aCT4lmgBb{$~+7{_b_j6Kb$#y zg#GV-gh_ADuI~{ZT)mH3UtgXIP7h~(kyxasbvAS0k<5*&ndcFU{$Uhc5BG}G*!^4Z zIC%9@?0?G|cK-t0lgYd>lJ$pVG53Mp*~|wY&F+KXi@}X++5J0klY{xDS?oV-J@Y5v zXmI2)?4Az37~E|52e*JPk7EDf1+4E)a4b0VSa#0|O;f2akeZ0H@`!|Db60-wj>`&RfgwwZwZ; z#J#1=-@!ekoH@|W;hh_q4+TeVV!oSLgiotr9)f%71G)PGXS+ygr%z2h_9s2gIVjh1|}(WHECn zxD^}*j$Fd-iQospY2fe_c25W23C;)avy|QY@8tNd2PZTzPd|mzmjZSWi}bbL#qMu| z+rTF;WA}FOW8eXBd@8$-fd3921Pa~(MR0p|C?-Qb*4*?-f6?0y}%`61@WRqUSD!u%Mx@=@k}S0nsm z%+G;aTA9^!cJBl)1`mO61&@G#1doC*JB`B+KhFAw*D%*V$$ZP{%#Cf#hh;FwKF$0l zIN=%Qj5FB1yPer`CUftz%-4YPwlbe^7P~t;m^;Da&oiHw$?n>V%)f$bJDKl2o89YQ zVxE5vbM4E_^Rk#5w=w?(+y;IL+z$@RMtoiDzXBWpJ~4;gJL#w-s>aHT;K5g!e+Rd} z#=K=M`)}`te{c_YS}wbff^)#tue1MW!8PDR^VomG8|;1}xCOk1ShTMW@Oj|A@7Vu! z@LzAX=;)`OIM>7wA6Yb1d>p1>^IOfkJK5sp{C$41oK5!NIseE=H1Rq<# zJOsWR95BM+e*vf2ta^F_&t?Ci0nDM`E#Tw8t>7gR=S#dz;xEAc2>+YJ2X5f_4R^c5 z%Ox(9_-cupz(a`d6>xAM=kF_U1K8~3_`ASi;EZYP|9EiF9?YkKLxY)1!4cr=!BOBA zaQ{B+|26Q?e#}GQ5pX~ur)M1O0C$G6|E=Jm8O$?^*#8*#e6SYA?w^6{UCJDh!u%#UYAJI@CA+ts!u%>YB9%GhGIoy#p99VWw}JD(2VBnn^TE;J=H;yK zBXH{q=5<%F|HL%reXE#LPGznK_pV}I`d4=EU(NhBIR7-}i>_q%k~Pc$S22&D&ipu7 zJA?V8YId(VlX(bSau)LySF?L&CUf*P%n4^RzX6Ushq>%pcCXK34y|Dh&0)S89JH4C zAK-BC%eK@moq1*e*pL9Smx+^*?;F;<~(q99P^#v zl6lM@f`j9k?e}qbZ9elR@BsKmaQ5-+{sB1t1m@{YoW36LLSm8M{seZv3Osls^ELOg z``}5;_6L|7PG8OBEImY%pZXh!9Rer!L|q4zZ)DuEcAC(aQMr>1DlzL4fpezgCAo5L*OcK z_66+zF?bmKJMo^BzNjtie(uA}U6stQ6N~sOFJs=fg?S9T0Ni>xyI%w@xq|s&a8woZ zf51cFgC1dh*?(pC1aQig%x8eZu43K;aGjC;n3 z^T1z#tH9!?5=42_fu}#u+z&nkJPNjh1K#HNlE7);)4_S*0va3}aQ za4$F?JP5u3JPN)Rto3nv?g58@p9DvMUjxU2KLIC!e*~w4ZJnH-Jn#%~6L>bb1H1?v z@II&KbZ{8B02~j#0GtlK8tei$fNQ~zft$fEgFC_Rg9kq3_=mw-KlAV45b!=PasDE} zM}WgWV*l~rgpZk*f$PENfR#_!{XB5qr_7b$j?b8H2D?6IegIqveimE@?g96JKL?M2 ze+EYmvcABVIX@NPFmMleHdy(B{VxP}flmYXgY&`ZU$OrSzxEHK$#!7jOnR=vB^NHFzet0UQHv1t){Mz!~5^ z@CNWO_%C2>gwt~!I0W1XjsUlT)4<)}Oz;5M2_6Mkf&*UT{M3QNz)j$2a2q%YtbEVu z%K(Rho#05Y8ypX=1*d_Vz}et-unXJ+t_2T*o55q?c5qNP=STU0(-#ho2gic5!71Pp za3;70Tmo(aSAyHYb>MDr^Z#S-UEt#?>i+-b9-vAPgaSpv)gZUsTsLwty=+O^G!028 zg$LMdHk)SYW_Q`$w5gz0tr{OuBccWcEf1hUK;t85eJm0c9wKrHf*7tAM2J|VDoB)z zzwgZVbI#70b9VRaCN2E_{~xao?R(FeneWVeXXZQC1KtK62fqS-1ia_pS-xp-1^5lH z7hHZnr>7Bo9Jmea2gkrI;F?!C{ELnE!AawN@F&1mfWHDB0gr-j0RI#`27Um%75of% z68sAIIq*IYaC-V)WBCpT4}(tu-vDj|-v;gg-v#akPk}dpw}Y<$zXARhxMGIm|8H;& z_-=3ucnX{W{~0_4ehYjJ_`nA_eYb&+15beK!B2vhfnNb%1TOn0%a;T%0Dlr(1O6(w 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 +#include +#include + +#include "node.h" + +// True for recursive algorithms whose bodies only use numeric literals, their +// own arguments, numeric operators, ifs, and self-calls: their results can be +// memoized by argument values (used by both the interpreter and the compiled +// runtime). +bool is_memoizable_numeric_algo(const std::shared_ptr& node, const std::string& algo_name, + const std::vector& args); + +#endif diff --git a/src/compiler.cpp b/src/compiler.cpp index 6d774f9..e45b0aa 100644 --- a/src/compiler.cpp +++ b/src/compiler.cpp @@ -8,9 +8,6 @@ /// docs/superpowers/specs/2026-06-10-llvm-compiler-design.md. #include "compiler.h" -#include "node.h" -#include "runtime.h" -#include "token.h" #include #include @@ -24,27 +21,31 @@ #include #include +#include "analysis.h" +#include "node.h" +#include "runtime.h" +#include "token.h" + namespace { class CodeGen { -public: - CodeGen(llvm::Module &_module, std::vector &_errors) - : module(_module), ctx(_module.getContext()), builder(ctx), - errors(_errors) { + public: + CodeGen(llvm::Module& _module, std::vector& _errors) + : module(_module), ctx(_module.getContext()), builder(ctx), errors(_errors) { ptr_ty = builder.getPtrTy(); i64_ty = builder.getInt64Ty(); f64_ty = builder.getDoubleTy(); } - bool run(const NodeList &ast) { - llvm::Function *main_fn = llvm::Function::Create( - llvm::FunctionType::get(builder.getInt32Ty(), false), - llvm::Function::ExternalLinkage, "main", module); - llvm::BasicBlock *entry = llvm::BasicBlock::Create(ctx, "entry", main_fn); + bool run(const NodeList& ast) { + llvm::Function* main_fn = + llvm::Function::Create(llvm::FunctionType::get(builder.getInt32Ty(), false), + llvm::Function::ExternalLinkage, "main", module); + llvm::BasicBlock* entry = llvm::BasicBlock::Create(ctx, "entry", main_fn); builder.SetInsertPoint(entry); builder.CreateCall(get_rt("rt_init", builder.getVoidTy(), {})); - for (const auto &node : ast) { + for (const auto& node : ast) { if (gen(node) == nullptr && block_terminated()) { break; } @@ -55,58 +56,55 @@ class CodeGen { return errors.empty(); } -private: + private: struct LoopContext { - llvm::BasicBlock *latch; - llvm::BasicBlock *exit; - llvm::Value *iter_mark; + llvm::BasicBlock* latch; + llvm::BasicBlock* exit; + llvm::Value* iter_mark; // `while` re-pushes its iteration frame in the header, so `continue` // must release first; `for`/`repeat` latches release it themselves. bool release_on_continue; }; - llvm::Module &module; - llvm::LLVMContext &ctx; + llvm::Module& module; + llvm::LLVMContext& ctx; llvm::IRBuilder<> builder; - std::vector &errors; + std::vector& errors; - llvm::PointerType *ptr_ty{nullptr}; - llvm::Type *i64_ty{nullptr}; - llvm::Type *f64_ty{nullptr}; + llvm::PointerType* ptr_ty{nullptr}; + llvm::Type* i64_ty{nullptr}; + llvm::Type* f64_ty{nullptr}; std::vector loops; - std::map string_constants; + std::map string_constants; int algo_counter{0}; /// ---- helpers ---- - llvm::FunctionCallee get_rt(const std::string &name, llvm::Type *ret, - std::vector args) { - return module.getOrInsertFunction( - name, llvm::FunctionType::get(ret, args, false)); + llvm::FunctionCallee get_rt(const std::string& name, llvm::Type* ret, + std::vector args) { + return module.getOrInsertFunction(name, llvm::FunctionType::get(ret, args, false)); } - bool block_terminated() { - return builder.GetInsertBlock()->getTerminator() != nullptr; - } + bool block_terminated() { return builder.GetInsertBlock()->getTerminator() != nullptr; } - llvm::Value *cstring(const std::string &text) { + llvm::Value* cstring(const std::string& text) { auto found = string_constants.find(text); if (found != string_constants.end()) { return found->second; } - llvm::Value *global = builder.CreateGlobalString(text, "str"); + llvm::Value* global = builder.CreateGlobalString(text, "str"); string_constants[text] = global; return global; } - llvm::AllocaInst *entry_alloca(llvm::Type *type) { - llvm::Function *fn = builder.GetInsertBlock()->getParent(); + llvm::AllocaInst* entry_alloca(llvm::Type* type) { + llvm::Function* fn = builder.GetInsertBlock()->getParent(); llvm::IRBuilder<> tmp(&fn->getEntryBlock(), fn->getEntryBlock().begin()); return tmp.CreateAlloca(type); } - void error(const std::string &message, const std::shared_ptr &node) { + void error(const std::string& message, const std::shared_ptr& node) { std::string suffix; std::shared_ptr tok = node ? node->get_tok() : nullptr; if (tok) { @@ -115,26 +113,18 @@ class CodeGen { errors.push_back(message + suffix); } - llvm::Value *make_none() { - return builder.CreateCall(get_rt("rt_make_none", ptr_ty, {})); - } + llvm::Value* make_none() { return builder.CreateCall(get_rt("rt_make_none", ptr_ty, {})); } - llvm::Value *make_int(int64_t v) { - return builder.CreateCall(get_rt("rt_make_int", ptr_ty, {i64_ty}), - {builder.getInt64(v)}); + llvm::Value* make_int(int64_t v) { + return builder.CreateCall(get_rt("rt_make_int", ptr_ty, {i64_ty}), {builder.getInt64(v)}); } - llvm::Value *frame_mark() { - return builder.CreateCall(get_rt("rt_frame_mark", i64_ty, {})); - } + llvm::Value* frame_mark() { return builder.CreateCall(get_rt("rt_frame_mark", i64_ty, {})); } - void frame_push() { - builder.CreateCall(get_rt("rt_frame_push", builder.getVoidTy(), {})); - } + void frame_push() { builder.CreateCall(get_rt("rt_frame_push", builder.getVoidTy(), {})); } - void frame_release(llvm::Value *mark) { - builder.CreateCall(get_rt("rt_frame_release", builder.getVoidTy(), {i64_ty}), - {mark}); + void frame_release(llvm::Value* mark) { + builder.CreateCall(get_rt("rt_frame_release", builder.getVoidTy(), {i64_ty}), {mark}); } /// ---- dispatch ---- @@ -142,7 +132,7 @@ class CodeGen { // Emits code for one node. Returns the node's value (an LLVM `ptr` to a // runtime Value) or nullptr when the node terminated the current block // (break/continue/return) or reported a compile error. - llvm::Value *gen(const std::shared_ptr &node) { + llvm::Value* gen(const std::shared_ptr& node) { const std::string type = node->get_type(); if (type == NODE_VALUE) return gen_literal(node); if (type == NODE_VARACCESS) return gen_var_access(node); @@ -163,8 +153,7 @@ class CodeGen { if (type == NODE_BREAK) return gen_loop_jump(node, true); if (type == NODE_CONTINUE) return gen_loop_jump(node, false); if (type == NODE_STRUCTDEF) { - error("compile error: Struct is not supported by the compiler yet", - node); + error("compile error: Struct is not supported by the compiler yet", node); return nullptr; } error("compile error: unsupported statement " + type, node); @@ -173,9 +162,9 @@ class CodeGen { // Emits a statement sequence; returns the last statement's value, or // nullptr when the sequence terminated the block (or errored). - llvm::Value *gen_statements(const NodeList &nodes) { - llvm::Value *last = nullptr; - for (const auto &node : nodes) { + llvm::Value* gen_statements(const NodeList& nodes) { + llvm::Value* last = nullptr; + for (const auto& node : nodes) { last = gen(node); if (last == nullptr) { return nullptr; @@ -186,15 +175,14 @@ class CodeGen { /// ---- expressions ---- - llvm::Value *gen_literal(const std::shared_ptr &node) { + llvm::Value* gen_literal(const std::shared_ptr& node) { std::shared_ptr tok = node->get_tok(); if (tok->get_type() == TOKEN_INT) { return make_int(std::stoll(tok->get_value())); } if (tok->get_type() == TOKEN_FLOAT) { - return builder.CreateCall( - get_rt("rt_make_float", ptr_ty, {f64_ty}), - {llvm::ConstantFP::get(f64_ty, std::stod(tok->get_value()))}); + return builder.CreateCall(get_rt("rt_make_float", ptr_ty, {f64_ty}), + {llvm::ConstantFP::get(f64_ty, std::stod(tok->get_value()))}); } if (tok->get_type() == TOKEN_STRING) { return builder.CreateCall(get_rt("rt_make_string", ptr_ty, {ptr_ty}), @@ -204,13 +192,13 @@ class CodeGen { return nullptr; } - llvm::Value *gen_var_access(const std::shared_ptr &node) { + llvm::Value* gen_var_access(const std::shared_ptr& node) { return builder.CreateCall(get_rt("rt_get_var", ptr_ty, {ptr_ty}), {cstring(node->get_name())}); } - llvm::Value *gen_var_assign(const std::shared_ptr &node) { - llvm::Value *value = gen(node->get_child()[0]); + llvm::Value* gen_var_assign(const std::shared_ptr& node) { + llvm::Value* value = gen(node->get_child()[0]); if (value == nullptr) { return nullptr; } @@ -218,11 +206,11 @@ class CodeGen { {cstring(node->get_name()), value}); } - llvm::Value *as_int(llvm::Value *value) { + llvm::Value* as_int(llvm::Value* value) { return builder.CreateCall(get_rt("rt_as_int", i64_ty, {ptr_ty}), {value}); } - llvm::Value *gen_bin_op(const std::shared_ptr &node) { + llvm::Value* gen_bin_op(const std::shared_ptr& node) { std::shared_ptr op = node->get_tok(); if (op->get_type() == TOKEN_KEYWORD && (op->get_value() == "and" || op->get_value() == "or")) { @@ -230,12 +218,10 @@ class CodeGen { } static const std::map OP_CODES{ - {TOKEN_ADD, RT_OP_ADD}, {TOKEN_SUB, RT_OP_SUB}, - {TOKEN_MUL, RT_OP_MUL}, {TOKEN_DIV, RT_OP_DIV}, - {TOKEN_MOD, RT_OP_MOD}, {TOKEN_POW, RT_OP_POW}, - {TOKEN_EQUAL, RT_OP_EQUAL}, {TOKEN_NEQ, RT_OP_NEQ}, - {TOKEN_LESS, RT_OP_LESS}, {TOKEN_GREATER, RT_OP_GREATER}, - {TOKEN_LEQ, RT_OP_LEQ}, {TOKEN_GEQ, RT_OP_GEQ}, + {TOKEN_ADD, RT_OP_ADD}, {TOKEN_SUB, RT_OP_SUB}, {TOKEN_MUL, RT_OP_MUL}, + {TOKEN_DIV, RT_OP_DIV}, {TOKEN_MOD, RT_OP_MOD}, {TOKEN_POW, RT_OP_POW}, + {TOKEN_EQUAL, RT_OP_EQUAL}, {TOKEN_NEQ, RT_OP_NEQ}, {TOKEN_LESS, RT_OP_LESS}, + {TOKEN_GREATER, RT_OP_GREATER}, {TOKEN_LEQ, RT_OP_LEQ}, {TOKEN_GEQ, RT_OP_GEQ}, }; auto code = OP_CODES.find(op->get_type()); if (code == OP_CODES.end()) { @@ -244,30 +230,27 @@ class CodeGen { } NodeList child = node->get_child(); - llvm::Value *lhs = gen(child[0]); + llvm::Value* lhs = gen(child[0]); if (lhs == nullptr) return nullptr; - llvm::Value *rhs = gen(child[1]); + llvm::Value* rhs = gen(child[1]); if (rhs == nullptr) return nullptr; - return builder.CreateCall( - get_rt("rt_bin_op", ptr_ty, {i64_ty, ptr_ty, ptr_ty}), - {builder.getInt64(code->second), lhs, rhs}); + return builder.CreateCall(get_rt("rt_bin_op", ptr_ty, {i64_ty, ptr_ty, ptr_ty}), + {builder.getInt64(code->second), lhs, rhs}); } // Mirrors visit_bin_op's short-circuit `and` / `or`: the result is always // an Int 0/1 derived from as_int(). - llvm::Value *gen_short_circuit(const std::shared_ptr &node, - bool is_and) { + llvm::Value* gen_short_circuit(const std::shared_ptr& node, bool is_and) { NodeList child = node->get_child(); - llvm::Value *lhs = gen(child[0]); + llvm::Value* lhs = gen(child[0]); if (lhs == nullptr) return nullptr; - llvm::Function *fn = builder.GetInsertBlock()->getParent(); - llvm::BasicBlock *rhs_bb = llvm::BasicBlock::Create(ctx, "sc.rhs", fn); - llvm::BasicBlock *short_bb = llvm::BasicBlock::Create(ctx, "sc.short", fn); - llvm::BasicBlock *merge_bb = llvm::BasicBlock::Create(ctx, "sc.merge", fn); + llvm::Function* fn = builder.GetInsertBlock()->getParent(); + llvm::BasicBlock* rhs_bb = llvm::BasicBlock::Create(ctx, "sc.rhs", fn); + llvm::BasicBlock* short_bb = llvm::BasicBlock::Create(ctx, "sc.short", fn); + llvm::BasicBlock* merge_bb = llvm::BasicBlock::Create(ctx, "sc.merge", fn); - llvm::Value *lhs_true = - builder.CreateICmpNE(as_int(lhs), builder.getInt64(0)); + llvm::Value* lhs_true = builder.CreateICmpNE(as_int(lhs), builder.getInt64(0)); if (is_and) { builder.CreateCondBr(lhs_true, rhs_bb, short_bb); } else { @@ -275,25 +258,24 @@ class CodeGen { } builder.SetInsertPoint(short_bb); - llvm::Value *short_value = make_int(is_and ? 0 : 1); + llvm::Value* short_value = make_int(is_and ? 0 : 1); builder.CreateBr(merge_bb); builder.SetInsertPoint(rhs_bb); - llvm::Value *rhs = gen(child[1]); + llvm::Value* rhs = gen(child[1]); if (rhs == nullptr) return nullptr; - llvm::Value *rhs_value = - builder.CreateCall(get_rt("rt_bool", ptr_ty, {ptr_ty}), {rhs}); - llvm::BasicBlock *rhs_end = builder.GetInsertBlock(); + llvm::Value* rhs_value = builder.CreateCall(get_rt("rt_bool", ptr_ty, {ptr_ty}), {rhs}); + llvm::BasicBlock* rhs_end = builder.GetInsertBlock(); builder.CreateBr(merge_bb); builder.SetInsertPoint(merge_bb); - llvm::PHINode *phi = builder.CreatePHI(ptr_ty, 2); + llvm::PHINode* phi = builder.CreatePHI(ptr_ty, 2); phi->addIncoming(short_value, short_bb); phi->addIncoming(rhs_value, rhs_end); return phi; } - llvm::Value *gen_unary_op(const std::shared_ptr &node) { + llvm::Value* gen_unary_op(const std::shared_ptr& node) { std::shared_ptr op = node->get_tok(); int64_t code; if (op->get_type() == TOKEN_ADD) { @@ -303,11 +285,10 @@ class CodeGen { } else if (op->get_type() == TOKEN_KEYWORD && op->get_value() == "not") { code = RT_OP_UNOT; } else { - error("compile error: unsupported unary operator " + op->get_type(), - node); + error("compile error: unsupported unary operator " + op->get_type(), node); return nullptr; } - llvm::Value *operand = gen(node->get_child()[0]); + llvm::Value* operand = gen(node->get_child()[0]); if (operand == nullptr) return nullptr; return builder.CreateCall(get_rt("rt_unary_op", ptr_ty, {i64_ty, ptr_ty}), {builder.getInt64(code), operand}); @@ -315,24 +296,24 @@ class CodeGen { /// ---- control flow ---- - llvm::Value *gen_if(const std::shared_ptr &node) { - IfNode *if_node = dynamic_cast(node.get()); - llvm::Value *cond = gen(if_node->get_condition()); + llvm::Value* gen_if(const std::shared_ptr& node) { + IfNode* if_node = dynamic_cast(node.get()); + llvm::Value* cond = gen(if_node->get_condition()); if (cond == nullptr) return nullptr; - llvm::Value *taken = builder.CreateICmpNE( + llvm::Value* taken = builder.CreateICmpNE( builder.CreateCall(get_rt("rt_cond_eq1", i64_ty, {ptr_ty}), {cond}), builder.getInt64(0)); - llvm::Function *fn = builder.GetInsertBlock()->getParent(); - llvm::BasicBlock *then_bb = llvm::BasicBlock::Create(ctx, "if.then", fn); - llvm::BasicBlock *else_bb = llvm::BasicBlock::Create(ctx, "if.else", fn); - llvm::BasicBlock *merge_bb = llvm::BasicBlock::Create(ctx, "if.merge", fn); - llvm::AllocaInst *slot = entry_alloca(ptr_ty); + llvm::Function* fn = builder.GetInsertBlock()->getParent(); + llvm::BasicBlock* then_bb = llvm::BasicBlock::Create(ctx, "if.then", fn); + llvm::BasicBlock* else_bb = llvm::BasicBlock::Create(ctx, "if.else", fn); + llvm::BasicBlock* merge_bb = llvm::BasicBlock::Create(ctx, "if.merge", fn); + llvm::AllocaInst* slot = entry_alloca(ptr_ty); builder.CreateCondBr(taken, then_bb, else_bb); bool merge_reachable = false; builder.SetInsertPoint(then_bb); - llvm::Value *then_value = gen_statements(if_node->get_expr()); + llvm::Value* then_value = gen_statements(if_node->get_expr()); if (!errors.empty()) return nullptr; if (then_value != nullptr) { builder.CreateStore(then_value, slot); @@ -343,9 +324,8 @@ class CodeGen { } builder.SetInsertPoint(else_bb); - llvm::Value *else_value = if_node->get_else().empty() - ? make_int(0) - : gen_statements(if_node->get_else()); + llvm::Value* else_value = + if_node->get_else().empty() ? make_int(0) : gen_statements(if_node->get_else()); if (!errors.empty()) return nullptr; if (else_value != nullptr) { builder.CreateStore(else_value, slot); @@ -363,22 +343,22 @@ class CodeGen { return builder.CreateLoad(ptr_ty, slot); } - llvm::Value *gen_while(const std::shared_ptr &node) { + llvm::Value* gen_while(const std::shared_ptr& node) { NodeList child = node->get_child(); - llvm::Function *fn = builder.GetInsertBlock()->getParent(); - llvm::BasicBlock *header = llvm::BasicBlock::Create(ctx, "while.cond", fn); - llvm::BasicBlock *body_bb = llvm::BasicBlock::Create(ctx, "while.body", fn); - llvm::BasicBlock *exit_bb = llvm::BasicBlock::Create(ctx, "while.exit", fn); + llvm::Function* fn = builder.GetInsertBlock()->getParent(); + llvm::BasicBlock* header = llvm::BasicBlock::Create(ctx, "while.cond", fn); + llvm::BasicBlock* body_bb = llvm::BasicBlock::Create(ctx, "while.body", fn); + llvm::BasicBlock* exit_bb = llvm::BasicBlock::Create(ctx, "while.exit", fn); - llvm::Value *mark = frame_mark(); + llvm::Value* mark = frame_mark(); builder.CreateBr(header); // One arena frame per iteration covers the condition and the body. builder.SetInsertPoint(header); frame_push(); - llvm::Value *cond = gen(child[0]); + llvm::Value* cond = gen(child[0]); if (cond == nullptr) return nullptr; - llvm::Value *enter = builder.CreateICmpEQ(as_int(cond), builder.getInt64(1)); + llvm::Value* enter = builder.CreateICmpEQ(as_int(cond), builder.getInt64(1)); builder.CreateCondBr(enter, body_bb, exit_bb); builder.SetInsertPoint(body_bb); @@ -396,14 +376,14 @@ class CodeGen { return make_none(); } - llvm::Value *gen_repeat(const std::shared_ptr &node) { + llvm::Value* gen_repeat(const std::shared_ptr& node) { NodeList child = node->get_child(); - llvm::Function *fn = builder.GetInsertBlock()->getParent(); - llvm::BasicBlock *body_bb = llvm::BasicBlock::Create(ctx, "repeat.body", fn); - llvm::BasicBlock *latch = llvm::BasicBlock::Create(ctx, "repeat.cond", fn); - llvm::BasicBlock *exit_bb = llvm::BasicBlock::Create(ctx, "repeat.exit", fn); + llvm::Function* fn = builder.GetInsertBlock()->getParent(); + llvm::BasicBlock* body_bb = llvm::BasicBlock::Create(ctx, "repeat.body", fn); + llvm::BasicBlock* latch = llvm::BasicBlock::Create(ctx, "repeat.cond", fn); + llvm::BasicBlock* exit_bb = llvm::BasicBlock::Create(ctx, "repeat.exit", fn); - llvm::Value *mark = frame_mark(); + llvm::Value* mark = frame_mark(); builder.CreateBr(body_bb); builder.SetInsertPoint(body_bb); @@ -417,9 +397,9 @@ class CodeGen { } builder.SetInsertPoint(latch); - llvm::Value *cond = gen(child[0]); + llvm::Value* cond = gen(child[0]); if (cond == nullptr) return nullptr; - llvm::Value *again = builder.CreateICmpEQ(as_int(cond), builder.getInt64(0)); + llvm::Value* again = builder.CreateICmpEQ(as_int(cond), builder.getInt64(0)); frame_release(mark); builder.CreateCondBr(again, body_bb, exit_bb); @@ -428,38 +408,36 @@ class CodeGen { return make_none(); } - llvm::Value *gen_for(const std::shared_ptr &node) { + llvm::Value* gen_for(const std::shared_ptr& node) { NodeList child = node->get_child(); // Evaluation order matches visit_for: assign, step (default 1), end. - llvm::Value *init = gen(child[0]); + llvm::Value* init = gen(child[0]); if (init == nullptr) return nullptr; - llvm::Value *step = child[2] != nullptr ? gen(child[2]) : make_int(1); + llvm::Value* step = child[2] != nullptr ? gen(child[2]) : make_int(1); if (step == nullptr) return nullptr; - llvm::Value *end = gen(child[1]); + llvm::Value* end = gen(child[1]); if (end == nullptr) return nullptr; - builder.CreateCall(get_rt("rt_for_step_check", builder.getVoidTy(), - {ptr_ty}), - {step}); + builder.CreateCall(get_rt("rt_for_step_check", builder.getVoidTy(), {ptr_ty}), {step}); const std::string var_name = child[0]->get_name(); - llvm::AllocaInst *slot = entry_alloca(ptr_ty); + llvm::AllocaInst* slot = entry_alloca(ptr_ty); builder.CreateStore(init, slot); // Dedicated frame keeping the latest loop-variable value alive even if // the body rebinds the variable (the interpreter holds it in a local). - llvm::Value *var_frame = frame_mark(); + llvm::Value* var_frame = frame_mark(); frame_push(); - llvm::Value *iter_mark = frame_mark(); + llvm::Value* iter_mark = frame_mark(); - llvm::Function *fn = builder.GetInsertBlock()->getParent(); - llvm::BasicBlock *header = llvm::BasicBlock::Create(ctx, "for.cond", fn); - llvm::BasicBlock *body_bb = llvm::BasicBlock::Create(ctx, "for.body", fn); - llvm::BasicBlock *latch = llvm::BasicBlock::Create(ctx, "for.latch", fn); - llvm::BasicBlock *exit_bb = llvm::BasicBlock::Create(ctx, "for.exit", fn); + llvm::Function* fn = builder.GetInsertBlock()->getParent(); + llvm::BasicBlock* header = llvm::BasicBlock::Create(ctx, "for.cond", fn); + llvm::BasicBlock* body_bb = llvm::BasicBlock::Create(ctx, "for.body", fn); + llvm::BasicBlock* latch = llvm::BasicBlock::Create(ctx, "for.latch", fn); + llvm::BasicBlock* exit_bb = llvm::BasicBlock::Create(ctx, "for.exit", fn); builder.CreateBr(header); builder.SetInsertPoint(header); - llvm::Value *keep_going = builder.CreateICmpNE( + llvm::Value* keep_going = builder.CreateICmpNE( builder.CreateCall(get_rt("rt_for_cond", i64_ty, {ptr_ty, ptr_ty, ptr_ty}), {builder.CreateLoad(ptr_ty, slot), end, step}), builder.getInt64(0)); @@ -478,13 +456,12 @@ class CodeGen { // Latch mirrors visit_for: the next value comes from the value read at // the previous latch, not from body reassignments of the variable. builder.SetInsertPoint(latch); - llvm::Value *next = builder.CreateCall( + llvm::Value* next = builder.CreateCall( get_rt("rt_bin_op", ptr_ty, {i64_ty, ptr_ty, ptr_ty}), {builder.getInt64(RT_OP_ADD), builder.CreateLoad(ptr_ty, slot), step}); builder.CreateCall(get_rt("rt_set_var", ptr_ty, {ptr_ty, ptr_ty}), {cstring(var_name), next}); - builder.CreateCall(get_rt("rt_loop_keep", builder.getVoidTy(), - {i64_ty, ptr_ty}), + builder.CreateCall(get_rt("rt_loop_keep", builder.getVoidTy(), {i64_ty, ptr_ty}), {var_frame, next}); builder.CreateStore(next, slot); frame_release(iter_mark); @@ -497,8 +474,8 @@ class CodeGen { // Emits a loop body (one or more statements). Returns true when the body // terminated the current block (break/continue/return on every path). - bool gen_body(const NodeList &body) { - for (const auto &stmt : body) { + bool gen_body(const NodeList& body) { + for (const auto& stmt : body) { if (gen(stmt) == nullptr) { return block_terminated() || !errors.empty(); } @@ -506,15 +483,14 @@ class CodeGen { return false; } - llvm::Value *gen_loop_jump(const std::shared_ptr &node, bool is_break) { + llvm::Value* gen_loop_jump(const std::shared_ptr& node, bool is_break) { if (loops.empty()) { - error(std::string("compile error: ") + - (is_break ? "break" : "continue") + + error(std::string("compile error: ") + (is_break ? "break" : "continue") + " outside of a loop is not supported by the compiler", node); return nullptr; } - const LoopContext &loop = loops.back(); + const LoopContext& loop = loops.back(); if (is_break) { frame_release(loop.iter_mark); builder.CreateBr(loop.exit); @@ -527,10 +503,10 @@ class CodeGen { return nullptr; } - llvm::Value *gen_return(const std::shared_ptr &node) { - llvm::Value *value = gen(node->get_child()[0]); + llvm::Value* gen_return(const std::shared_ptr& node) { + llvm::Value* value = gen(node->get_child()[0]); if (value == nullptr) return nullptr; - llvm::Function *fn = builder.GetInsertBlock()->getParent(); + llvm::Function* fn = builder.GetInsertBlock()->getParent(); if (fn->getName() == "main") { // Top-level `return` does not stop execution in the interpreter. return value; @@ -541,21 +517,20 @@ class CodeGen { /// ---- functions and calls ---- - llvm::Value *gen_algo_def(const std::shared_ptr &node) { + llvm::Value* gen_algo_def(const std::shared_ptr& node) { const std::string name = node->get_name(); if (name.find("::") != std::string::npos) { - error("compile error: Struct is not supported by the compiler yet", - node); + error("compile error: Struct is not supported by the compiler yet", node); return nullptr; } - AlgorithmDefNode *def = dynamic_cast(node.get()); + AlgorithmDefNode* def = dynamic_cast(node.get()); std::vector arg_names; - for (const auto &tok : node->get_toks()) { + for (const auto& tok : node->get_toks()) { arg_names.push_back(tok->get_value()); } - llvm::Function *fn = llvm::Function::Create( + llvm::Function* fn = llvm::Function::Create( llvm::FunctionType::get(ptr_ty, false), llvm::Function::PrivateLinkage, "ps.algo." + std::to_string(algo_counter++) + "." + name, module); @@ -563,9 +538,9 @@ class CodeGen { std::vector saved_loops; saved_loops.swap(loops); - llvm::BasicBlock *entry = llvm::BasicBlock::Create(ctx, "entry", fn); + llvm::BasicBlock* entry = llvm::BasicBlock::Create(ctx, "entry", fn); builder.SetInsertPoint(entry); - llvm::Value *last = gen_statements(def->get_body()); + llvm::Value* last = gen_statements(def->get_body()); if (!block_terminated() && errors.empty()) { builder.CreateRet(last != nullptr ? last : make_none()); } @@ -577,24 +552,26 @@ class CodeGen { } // Registration happens at the definition site, like visit_algo_def. - llvm::ArrayType *names_ty = llvm::ArrayType::get(ptr_ty, arg_names.size()); - std::vector name_ptrs; - for (const auto &arg : arg_names) { + llvm::ArrayType* names_ty = llvm::ArrayType::get(ptr_ty, arg_names.size()); + std::vector name_ptrs; + for (const auto& arg : arg_names) { name_ptrs.push_back(llvm::cast(cstring(arg))); } - auto *names_global = new llvm::GlobalVariable( - module, names_ty, true, llvm::GlobalValue::PrivateLinkage, - llvm::ConstantArray::get(names_ty, name_ptrs), "args"); + auto* names_global = + new llvm::GlobalVariable(module, names_ty, true, llvm::GlobalValue::PrivateLinkage, + llvm::ConstantArray::get(names_ty, name_ptrs), "args"); + const bool memoizable = is_memoizable_numeric_algo(node, name, arg_names); return builder.CreateCall( - get_rt("rt_define_algo", ptr_ty, {ptr_ty, ptr_ty, ptr_ty, i64_ty}), + get_rt("rt_define_algo", ptr_ty, {ptr_ty, ptr_ty, ptr_ty, i64_ty, i64_ty}), {cstring(name), fn, names_global, - builder.getInt64(static_cast(arg_names.size()))}); + builder.getInt64(static_cast(arg_names.size())), + builder.getInt64(memoizable ? 1 : 0)}); } - llvm::Value *gen_algo_call(const std::shared_ptr &node) { - AlgorithmCallNode *call = dynamic_cast(node.get()); + llvm::Value* gen_algo_call(const std::shared_ptr& node) { + AlgorithmCallNode* call = dynamic_cast(node.get()); std::shared_ptr callee_node = call->get_call(); - llvm::Value *callee; + llvm::Value* callee; if (callee_node->get_type() == NODE_VARACCESS) { callee = gen_var_access(callee_node); } else { @@ -602,20 +579,19 @@ class CodeGen { } if (callee == nullptr) return nullptr; - const NodeList &args = call->get_args(); - llvm::Value *argv; + const NodeList& args = call->get_args(); + llvm::Value* argv; if (args.empty()) { argv = llvm::ConstantPointerNull::get(ptr_ty); } else { - llvm::ArrayType *argv_ty = llvm::ArrayType::get(ptr_ty, args.size()); - llvm::Function *fn = builder.GetInsertBlock()->getParent(); + llvm::ArrayType* argv_ty = llvm::ArrayType::get(ptr_ty, args.size()); + llvm::Function* fn = builder.GetInsertBlock()->getParent(); llvm::IRBuilder<> tmp(&fn->getEntryBlock(), fn->getEntryBlock().begin()); - llvm::AllocaInst *slots = tmp.CreateAlloca(argv_ty); + llvm::AllocaInst* slots = tmp.CreateAlloca(argv_ty); for (size_t i = 0; i < args.size(); ++i) { - llvm::Value *arg = gen(args[i]); + llvm::Value* arg = gen(args[i]); if (arg == nullptr) return nullptr; - builder.CreateStore( - arg, builder.CreateConstInBoundsGEP2_64(argv_ty, slots, 0, i)); + builder.CreateStore(arg, builder.CreateConstInBoundsGEP2_64(argv_ty, slots, 0, i)); } argv = slots; } @@ -626,72 +602,68 @@ class CodeGen { /// ---- arrays, hash tables, members ---- - llvm::Value *gen_array(const std::shared_ptr &node) { - llvm::Value *array = builder.CreateCall(get_rt("rt_array_new", ptr_ty, {})); - for (const auto &element : node->get_child()) { - llvm::Value *value = gen(element); + llvm::Value* gen_array(const std::shared_ptr& node) { + llvm::Value* array = builder.CreateCall(get_rt("rt_array_new", ptr_ty, {})); + for (const auto& element : node->get_child()) { + llvm::Value* value = gen(element); if (value == nullptr) return nullptr; - builder.CreateCall(get_rt("rt_array_push", builder.getVoidTy(), - {ptr_ty, ptr_ty}), + builder.CreateCall(get_rt("rt_array_push", builder.getVoidTy(), {ptr_ty, ptr_ty}), {array, value}); } return array; } - llvm::Value *gen_array_access(const std::shared_ptr &node) { + llvm::Value* gen_array_access(const std::shared_ptr& node) { NodeList child = node->get_child(); - llvm::Value *container = gen(child[0]); + llvm::Value* container = gen(child[0]); if (container == nullptr) return nullptr; - llvm::Value *index = gen(child[1]); + llvm::Value* index = gen(child[1]); if (index == nullptr) return nullptr; - return builder.CreateCall(get_rt("rt_index", ptr_ty, {ptr_ty, ptr_ty}), - {container, index}); + return builder.CreateCall(get_rt("rt_index", ptr_ty, {ptr_ty, ptr_ty}), {container, index}); } - llvm::Value *gen_array_assign(const std::shared_ptr &node) { + llvm::Value* gen_array_assign(const std::shared_ptr& node) { NodeList child = node->get_child(); if (child[0]->get_type() == NODE_MEMACCESS) { NodeList member_child = child[0]->get_child(); - llvm::Value *object = gen(member_child[0]); + llvm::Value* object = gen(member_child[0]); if (object == nullptr) return nullptr; - llvm::Value *value = gen(child[1]); + llvm::Value* value = gen(child[1]); if (value == nullptr) return nullptr; - return builder.CreateCall( - get_rt("rt_member_assign", ptr_ty, {ptr_ty, ptr_ty, ptr_ty}), - {object, cstring(member_child[1]->get_name()), value}); + return builder.CreateCall(get_rt("rt_member_assign", ptr_ty, {ptr_ty, ptr_ty, ptr_ty}), + {object, cstring(member_child[1]->get_name()), value}); } if (child[0]->get_type() != NODE_ARRACCESS) { - error("compile error: assignment target must be an array element or " - "object member", - node); + error( + "compile error: assignment target must be an array element or " + "object member", + node); return nullptr; } NodeList access_child = child[0]->get_child(); - llvm::Value *container = gen(access_child[0]); + llvm::Value* container = gen(access_child[0]); if (container == nullptr) return nullptr; - llvm::Value *index = gen(access_child[1]); + llvm::Value* index = gen(access_child[1]); if (index == nullptr) return nullptr; - llvm::Value *value = gen(child[1]); + llvm::Value* value = gen(child[1]); if (value == nullptr) return nullptr; - return builder.CreateCall( - get_rt("rt_index_assign", ptr_ty, {ptr_ty, ptr_ty, ptr_ty}), - {container, index, value}); + return builder.CreateCall(get_rt("rt_index_assign", ptr_ty, {ptr_ty, ptr_ty, ptr_ty}), + {container, index, value}); } - llvm::Value *gen_member_access(const std::shared_ptr &node) { + llvm::Value* gen_member_access(const std::shared_ptr& node) { NodeList child = node->get_child(); - llvm::Value *object = gen(child[0]); + llvm::Value* object = gen(child[0]); if (object == nullptr) return nullptr; - return builder.CreateCall( - get_rt("rt_member_access", ptr_ty, {ptr_ty, ptr_ty}), - {object, cstring(child[1]->get_name())}); + return builder.CreateCall(get_rt("rt_member_access", ptr_ty, {ptr_ty, ptr_ty}), + {object, cstring(child[1]->get_name())}); } }; -} // namespace +} // namespace -bool Compiler::compile(const NodeList &ast, llvm::Module &module, - std::vector &errors) { +bool Compiler::compile(const NodeList& ast, llvm::Module& module, + std::vector& errors) { CodeGen codegen(module, errors); return codegen.run(ast); } diff --git a/src/compiler.h b/src/compiler.h index f6b9488..829a9ff 100644 --- a/src/compiler.h +++ b/src/compiler.h @@ -5,21 +5,22 @@ #ifndef COMPILER_H #define COMPILER_H -#include "node.h" #include #include +#include "node.h" + namespace llvm { class Module; -} // namespace llvm +} // namespace llvm class Compiler { -public: + public: // Lowers the parsed program into `module` (a `main` function plus one // function per Algorithm). Returns false and fills `errors` when the // program uses features the compiler does not support. - static bool compile(const NodeList &ast, llvm::Module &module, - std::vector &errors); + static bool compile(const NodeList& ast, llvm::Module& module, + std::vector& errors); }; #endif diff --git a/src/imports.h b/src/imports.h index 2f109d4..32e1bbf 100644 --- a/src/imports.h +++ b/src/imports.h @@ -16,8 +16,7 @@ struct ImportState { // Recursively replaces `import` lines in `text` with the imported file // contents. Returns false and fills `error` on unresolved, unreadable, or // circular imports. -bool expand_imports(const std::string &file_name, const std::string &text, - ImportState &state, std::string &expanded, - std::string &error); +bool expand_imports(const std::string& file_name, const std::string& text, ImportState& state, + std::string& expanded, std::string& error); #endif diff --git a/src/pseudo.cpp b/src/pseudo.cpp index 7e64ed8..b4ff492 100644 --- a/src/pseudo.cpp +++ b/src/pseudo.cpp @@ -1,4 +1,5 @@ #include "pseudo.h" +#include "analysis.h" #include "imports.h" #include "color.h" #include "interpreter.h" @@ -401,6 +402,8 @@ bool has_self_call(const std::shared_ptr& node, const std::string& algo_na return false; } +} // namespace + bool is_memoizable_numeric_algo(const std::shared_ptr& node, const std::string& algo_name, const std::vector& args) { @@ -418,6 +421,8 @@ bool is_memoizable_numeric_algo(const std::shared_ptr& node, return recursive; } +namespace { + std::shared_ptr single_return_numeric_expr(const std::shared_ptr& node, const std::string& algo_name, const std::vector& args) { diff --git a/src/pseudoc.cpp b/src/pseudoc.cpp index b5cec10..9c1bd2c 100644 --- a/src/pseudoc.cpp +++ b/src/pseudoc.cpp @@ -5,14 +5,6 @@ /// Compiles a .ps source file to a native executable: /// pseudoc [-o ] [--emit-llvm] [--runtime-lib ] -#include "compiler.h" -#include "error.h" -#include "imports.h" -#include "lexer.h" -#include "node.h" -#include "parser.h" -#include "token.h" - #include #include #include @@ -25,16 +17,24 @@ #include #include #include +#include #include #include -#include #include #include #include #include #include +#include "compiler.h" +#include "error.h" +#include "imports.h" +#include "lexer.h" +#include "node.h" +#include "parser.h" +#include "token.h" + namespace { namespace fs = std::filesystem; @@ -44,12 +44,12 @@ void usage() { "[--runtime-lib ]\n"; } -std::string find_runtime_lib(const std::string &flag_value, const char *argv0) { +std::string find_runtime_lib(const std::string& flag_value, const char* argv0) { std::vector candidates; if (!flag_value.empty()) { candidates.emplace_back(flag_value); } - if (const char *env = std::getenv("PSEUDO_RT_LIB")) { + if (const char* env = std::getenv("PSEUDO_RT_LIB")) { candidates.emplace_back(env); } std::error_code ec; @@ -59,7 +59,7 @@ std::string find_runtime_lib(const std::string &flag_value, const char *argv0) { } candidates.push_back(fs::current_path() / "build" / "libpseudort.a"); - for (const auto &candidate : candidates) { + for (const auto& candidate : candidates) { if (fs::exists(candidate, ec) && fs::is_regular_file(candidate, ec)) { return candidate.string(); } @@ -67,7 +67,7 @@ std::string find_runtime_lib(const std::string &flag_value, const char *argv0) { return ""; } -std::string shell_quote(const std::string &text) { +std::string shell_quote(const std::string& text) { std::string quoted = "'"; for (char c : text) { if (c == '\'') { @@ -80,9 +80,9 @@ std::string shell_quote(const std::string &text) { return quoted; } -} // namespace +} // namespace -int main(int argc, char **argv) { +int main(int argc, char** argv) { std::string input_path, output_path, runtime_lib_flag; bool emit_llvm = false; for (int i = 1; i < argc; ++i) { @@ -130,36 +130,32 @@ int main(int argc, char **argv) { ImportState import_state; std::string expanded_text, import_error; - if (!expand_imports(input_path, code, import_state, expanded_text, - import_error)) { + if (!expand_imports(input_path, code, import_state, expanded_text, import_error)) { std::cout << import_error << "\n"; return 1; } Lexer lexer(input_path, expanded_text); TokenList tokens = lexer.make_tokens(); - for (const auto &tok : tokens) { + for (const auto& tok : tokens) { if (tok->get_type() == TOKEN_ERROR) { - std::cout << "Error: " << tok->get_value() << ", line " - << tok->get_pos().line + 1 + std::cout << "Error: " << tok->get_value() << ", line " << tok->get_pos().line + 1 << ", column: " << tok->get_pos().column << "\n"; - std::cout << error_marker(expanded_text, tok->get_pos(), - tok->get_pos()); + std::cout << error_marker(expanded_text, tok->get_pos(), tok->get_pos()); return 1; } } Parser parser(tokens); NodeList ast = parser.parse(); - for (const auto &node : ast) { + for (const auto& node : ast) { if (node->get_type() == NODE_ERROR) { std::shared_ptr err_tok = node->get_tok(); if (err_tok) { std::cout << "Error: " << err_tok->get_value() << ", line " << err_tok->get_pos().line + 1 << ", column: " << err_tok->get_pos().column << "\n"; - std::cout << error_marker(expanded_text, err_tok->get_pos(), - err_tok->get_pos()); + std::cout << error_marker(expanded_text, err_tok->get_pos(), err_tok->get_pos()); } else { std::cout << "Error: " << node->get_node() << "\n"; } @@ -171,7 +167,7 @@ int main(int argc, char **argv) { llvm::Module module(input_path, context); std::vector compile_errors; if (!Compiler::compile(ast, module, compile_errors)) { - for (const auto &message : compile_errors) { + for (const auto& message : compile_errors) { std::cout << message << "\n"; } return 1; @@ -193,16 +189,14 @@ int main(int argc, char **argv) { std::string triple_name = llvm::sys::getDefaultTargetTriple(); std::string lookup_error; - const llvm::Target *target = - llvm::TargetRegistry::lookupTarget(triple_name, lookup_error); + const llvm::Target* target = llvm::TargetRegistry::lookupTarget(triple_name, lookup_error); if (target == nullptr) { std::cout << "target lookup failed: " << lookup_error << "\n"; return 1; } llvm::TargetOptions target_options; - llvm::TargetMachine *machine = target->createTargetMachine( - llvm::Triple(triple_name), "generic", "", target_options, - llvm::Reloc::PIC_); + llvm::TargetMachine* machine = target->createTargetMachine( + llvm::Triple(triple_name), "generic", "", target_options, llvm::Reloc::PIC_); module.setDataLayout(machine->createDataLayout()); module.setTargetTriple(llvm::Triple(triple_name)); @@ -222,15 +216,12 @@ int main(int argc, char **argv) { mpm.run(module, mam); fs::path object_path = - fs::temp_directory_path() / - ("pseudoc-" + std::to_string(::getpid()) + ".o"); + fs::temp_directory_path() / ("pseudoc-" + std::to_string(::getpid()) + ".o"); { std::error_code ec; - llvm::raw_fd_ostream object_stream(object_path.string(), ec, - llvm::sys::fs::OF_None); + llvm::raw_fd_ostream object_stream(object_path.string(), ec, llvm::sys::fs::OF_None); if (ec) { - std::cout << "cannot write " << object_path.string() << ": " - << ec.message() << "\n"; + std::cout << "cannot write " << object_path.string() << ": " << ec.message() << "\n"; return 1; } llvm::legacy::PassManager emit_pm; @@ -251,12 +242,11 @@ int main(int argc, char **argv) { } std::string linker = "c++"; - if (const char *env = std::getenv("PSEUDO_LD")) { + if (const char* env = std::getenv("PSEUDO_LD")) { linker = env; } - std::string command = linker + " " + shell_quote(object_path.string()) + - " " + shell_quote(runtime_lib) + " -o " + - shell_quote(output_path); + std::string command = linker + " " + shell_quote(object_path.string()) + " " + + shell_quote(runtime_lib) + " -o " + shell_quote(output_path); int status = std::system(command.c_str()); fs::remove(object_path); if (status != 0) { diff --git a/src/runtime.cpp b/src/runtime.cpp index 51cb52c..fc67757 100644 --- a/src/runtime.cpp +++ b/src/runtime.cpp @@ -3,17 +3,20 @@ /// -------------------- #include "runtime.h" -#include "color.h" -#include "interpreter.h" -#include "node.h" -#include "symboltable.h" -#include "value.h" + #include #include #include #include +#include #include +#include "color.h" +#include "interpreter.h" +#include "node.h" +#include "symboltable.h" +#include "value.h" + namespace { // Arena frames keep every runtime-created value alive until its frame is @@ -23,12 +26,12 @@ std::vector>> frames; // globals. Parents follow the caller chain, like the interpreter. std::vector> scopes; -[[noreturn]] void rt_fail(const std::shared_ptr &err) { +[[noreturn]] void rt_fail(const std::shared_ptr& err) { std::cout << err->get_num() << "\n"; exit(1); } -Value *track(std::shared_ptr value) { +Value* track(std::shared_ptr value) { if (value->get_type() == VALUE_ERROR) { rt_fail(value); } @@ -36,30 +39,48 @@ Value *track(std::shared_ptr value) { return value.get(); } -std::shared_ptr ref(Value *v) { return v->shared_from_this(); } +std::shared_ptr ref(Value* v) { return v->shared_from_this(); } -SymbolTable ¤t_scope() { return *scopes.back(); } +SymbolTable& current_scope() { return *scopes.back(); } class CompiledAlgoValue : public Value { -public: - CompiledAlgoValue(const std::string &_algo_name, Value *(*_fn)(), - std::vector _arg_names) - : Value(VALUE_ALGO), fn(_fn), algo_name(_algo_name), - arg_names(std::move(_arg_names)) {} + public: + CompiledAlgoValue(const std::string& _algo_name, Value* (*_fn)(), + std::vector _arg_names, bool _memoizable) + : Value(VALUE_ALGO), + fn(_fn), + algo_name(_algo_name), + arg_names(std::move(_arg_names)), + memoizable(_memoizable) {} std::string get_num() override { return algo_name; } std::string repr() override { return algo_name; } - std::shared_ptr execute(const NodeList &args = {}, - SymbolTable *parent = nullptr) override; + std::shared_ptr execute(const NodeList& args = {}, + SymbolTable* parent = nullptr) override; - Value *(*fn)(); + Value* (*fn)(); std::string algo_name; std::vector arg_names; + bool memoizable; + std::unordered_map> memo; }; -std::shared_ptr call_compiled(CompiledAlgoValue *algo, - const ValueList &args) { +// Mirrors numeric_cache_key in pseudo.cpp; empty when any argument is not a +// plain number. +std::string numeric_args_key(const ValueList& values) { + std::string key; + for (const auto& value : values) { + if (value->get_type() != VALUE_INT && value->get_type() != VALUE_FLOAT) return ""; + key += value->get_type(); + key += ':'; + key += value->get_num(); + key += '|'; + } + return key; +} + +std::shared_ptr call_compiled(CompiledAlgoValue* algo, const ValueList& args) { if (args.size() < algo->arg_names.size()) { return std::make_shared( VALUE_ERROR, Color(0xFF, 0x39, 0x6E).get() + "Too few arguments" RESET); @@ -69,26 +90,39 @@ std::shared_ptr call_compiled(CompiledAlgoValue *algo, VALUE_ERROR, Color(0xFF, 0x39, 0x6E).get() + "Too many arguments" RESET); } + std::string memo_key; + if (algo->memoizable) { + memo_key = numeric_args_key(args); + if (!memo_key.empty()) { + auto cached = algo->memo.find(memo_key); + if (cached != algo->memo.end()) { + return cached->second; + } + } + } + int64_t mark = rt_frame_mark(); rt_frame_push(); scopes.push_back(std::make_unique(¤t_scope())); for (size_t i = 0; i < args.size(); ++i) { scopes.back()->set(algo->arg_names[i], args[i]); } - Value *result = algo->fn(); + Value* result = algo->fn(); std::shared_ptr kept = ref(result); scopes.pop_back(); rt_frame_release(mark); + if (!memo_key.empty() && (kept->get_type() == VALUE_INT || kept->get_type() == VALUE_FLOAT)) { + algo->memo[memo_key] = kept; + } return kept; } -std::shared_ptr CompiledAlgoValue::execute(const NodeList &args, - SymbolTable *parent) { +std::shared_ptr CompiledAlgoValue::execute(const NodeList& args, SymbolTable* parent) { SymbolTable sym(parent); Interpreter interpreter(sym); ValueList evaluated; evaluated.reserve(args.size()); - for (const auto &arg : args) { + for (const auto& arg : args) { std::shared_ptr v = interpreter.visit(arg); if (v->get_type() == VALUE_ERROR) { return v; @@ -98,7 +132,7 @@ std::shared_ptr CompiledAlgoValue::execute(const NodeList &args, return call_compiled(this, evaluated); } -} // namespace +} // namespace extern "C" { @@ -107,76 +141,82 @@ void rt_init() { scopes.push_back(std::make_unique()); } -Value *rt_make_int(int64_t v) { - return track(std::make_shared>(VALUE_INT, v)); -} +Value* rt_make_int(int64_t v) { return track(std::make_shared>(VALUE_INT, v)); } -Value *rt_make_float(double v) { +Value* rt_make_float(double v) { return track(std::make_shared>(VALUE_FLOAT, v)); } -Value *rt_make_string(const char *s) { - return track( - std::make_shared>(VALUE_STRING, std::string(s))); +Value* rt_make_string(const char* s) { + return track(std::make_shared>(VALUE_STRING, std::string(s))); } -Value *rt_make_none() { return track(std::make_shared()); } +Value* rt_make_none() { return track(std::make_shared()); } -Value *rt_array_new() { - return track(std::make_shared(ValueList(0))); -} +Value* rt_array_new() { return track(std::make_shared(ValueList(0))); } -void rt_array_push(Value *arr, Value *v) { - dynamic_cast(arr)->push_back(ref(v)); -} +void rt_array_push(Value* arr, Value* v) { dynamic_cast(arr)->push_back(ref(v)); } -Value *rt_get_var(const char *name) { - return track(current_scope().get(name)); -} +Value* rt_get_var(const char* name) { return track(current_scope().get(name)); } -Value *rt_set_var(const char *name, Value *v) { +Value* rt_set_var(const char* name, Value* v) { current_scope().set(name, ref(v)); return track(current_scope().get(name)); } -Value *rt_bin_op(int64_t op, Value *a, Value *b) { +Value* rt_bin_op(int64_t op, Value* a, Value* b) { std::shared_ptr lhs = ref(a), rhs = ref(b); switch (op) { - case RT_OP_ADD: return track(lhs + rhs); - case RT_OP_SUB: return track(lhs - rhs); - case RT_OP_MUL: return track(lhs * rhs); - case RT_OP_DIV: return track(lhs / rhs); - case RT_OP_MOD: return track(lhs % rhs); - case RT_OP_POW: return track(pow(lhs, rhs)); - case RT_OP_EQUAL: return track(lhs == rhs); - case RT_OP_NEQ: return track(lhs != rhs); - case RT_OP_LESS: return track(lhs < rhs); - case RT_OP_GREATER: return track(lhs > rhs); - case RT_OP_LEQ: return track(lhs <= rhs); - case RT_OP_GEQ: return track(lhs >= rhs); - default: - rt_fail(std::make_shared(VALUE_ERROR, "Not a binary op\n")); + case RT_OP_ADD: + return track(lhs + rhs); + case RT_OP_SUB: + return track(lhs - rhs); + case RT_OP_MUL: + return track(lhs * rhs); + case RT_OP_DIV: + return track(lhs / rhs); + case RT_OP_MOD: + return track(lhs % rhs); + case RT_OP_POW: + return track(pow(lhs, rhs)); + case RT_OP_EQUAL: + return track(lhs == rhs); + case RT_OP_NEQ: + return track(lhs != rhs); + case RT_OP_LESS: + return track(lhs < rhs); + case RT_OP_GREATER: + return track(lhs > rhs); + case RT_OP_LEQ: + return track(lhs <= rhs); + case RT_OP_GEQ: + return track(lhs >= rhs); + default: + rt_fail(std::make_shared(VALUE_ERROR, "Not a binary op\n")); } } -Value *rt_unary_op(int64_t op, Value *a) { +Value* rt_unary_op(int64_t op, Value* a) { std::shared_ptr operand = ref(a); switch (op) { - case RT_OP_UPLUS: return track(operand); - case RT_OP_UNEG: return track(-operand); - case RT_OP_UNOT: return track(!operand); - default: - rt_fail(std::make_shared(VALUE_ERROR, "Not an unary op\n")); + case RT_OP_UPLUS: + return track(operand); + case RT_OP_UNEG: + return track(-operand); + case RT_OP_UNOT: + return track(!operand); + default: + rt_fail(std::make_shared(VALUE_ERROR, "Not an unary op\n")); } } -Value *rt_bool(Value *v) { return rt_make_int(v->as_int() != 0); } +Value* rt_bool(Value* v) { return rt_make_int(v->as_int() != 0); } -int64_t rt_cond_eq1(Value *v) { return std::stoll(v->get_num()) == 1; } +int64_t rt_cond_eq1(Value* v) { return std::stoll(v->get_num()) == 1; } -int64_t rt_as_int(Value *v) { return v->as_int(); } +int64_t rt_as_int(Value* v) { return v->as_int(); } -int64_t rt_for_cond(Value *i, Value *end, Value *step) { +int64_t rt_for_cond(Value* i, Value* end, Value* step) { if (step->as_double() > 0) { if (i->get_type() == VALUE_FLOAT || end->get_type() == VALUE_FLOAT) return i->as_double() <= end->as_double(); @@ -187,42 +227,39 @@ int64_t rt_for_cond(Value *i, Value *end, Value *step) { return i->as_int() >= end->as_int(); } -void rt_for_step_check(Value *step) { +void rt_for_step_check(Value* step) { if (step->as_double() == 0) { rt_fail(std::make_shared(VALUE_ERROR, "Infinite for loop\n")); } } -Value *rt_index(Value *obj, Value *idx) { +Value* rt_index(Value* obj, Value* idx) { std::shared_ptr container = ref(obj), index = ref(idx); if (container->get_type() == VALUE_STRING) { std::string str = container->as_string(); int p = index->as_int(); if (1 <= p && p <= static_cast(str.size())) { - return track(std::make_shared>( - VALUE_STRING, std::string(1, str[p - 1]))); + return track(std::make_shared>(VALUE_STRING, + std::string(1, str[p - 1]))); } return track(std::make_shared( VALUE_ERROR, "Index out of range, size: " + std::to_string(str.size()) + ", position: " + std::to_string(p))); } if (container->get_type() == VALUE_HASH_TABLE) { - return track(dynamic_cast(container.get())->get(index)); + return track(dynamic_cast(container.get())->get(index)); } if (container->get_type() != VALUE_ARRAY) { return track(std::make_shared( - VALUE_ERROR, - "Access can only apply on array, find " + container->get_type() + "\n")); + VALUE_ERROR, "Access can only apply on array, find " + container->get_type() + "\n")); } - return track( - dynamic_cast(container.get())->operator[](index->as_int())); + return track(dynamic_cast(container.get())->operator[](index->as_int())); } -Value *rt_index_assign(Value *obj, Value *idx, Value *v) { +Value* rt_index_assign(Value* obj, Value* idx, Value* v) { std::shared_ptr container = ref(obj), index = ref(idx), value = ref(v); if (container->get_type() == VALUE_HASH_TABLE) { - return track( - dynamic_cast(container.get())->set(index, value)); + return track(dynamic_cast(container.get())->set(index, value)); } if (container->get_type() != VALUE_ARRAY) { return track(std::make_shared( @@ -230,57 +267,54 @@ Value *rt_index_assign(Value *obj, Value *idx, Value *v) { } // Matches visit_array_assign: an out-of-range index assigns into the // array's error slot and is effectively ignored. - dynamic_cast(container.get())->operator[](index->as_int()) = - value; + dynamic_cast(container.get())->operator[](index->as_int()) = value; return track(value); } -Value *rt_member_access(Value *obj, const char *name) { +Value* rt_member_access(Value* obj, const char* name) { std::shared_ptr object = ref(obj); if (object->get_type() == VALUE_ARRAY || object->get_type() == VALUE_STRING || object->get_type() == VALUE_HASH_TABLE) { return track(std::make_shared(object, name)); } if (object->get_type() == VALUE_INSTANCE) { - return track(dynamic_cast(object.get()) - ->get_member(name, object)); + return track(dynamic_cast(object.get())->get_member(name, object)); } return track(std::make_shared( - VALUE_ERROR, - object->get_num() + " has no member " + std::string(name) + "\n")); + VALUE_ERROR, object->get_num() + " has no member " + std::string(name) + "\n")); } -Value *rt_member_assign(Value *obj, const char *name, Value *v) { +Value* rt_member_assign(Value* obj, const char* name, Value* v) { std::shared_ptr object = ref(obj), value = ref(v); if (object->get_type() == VALUE_INSTANCE) { - dynamic_cast(object.get())->set_member(name, value); + dynamic_cast(object.get())->set_member(name, value); return track(value); } return track(std::make_shared( VALUE_ERROR, "Assignment to member only supported for Struct Instances\n")); } -Value *rt_define_algo(const char *name, Value *(*fn)(), - const char *const *arg_names, int64_t nargs) { +Value* rt_define_algo(const char* name, Value* (*fn)(), const char* const* arg_names, int64_t nargs, + int64_t memoizable) { std::vector names; names.reserve(nargs); for (int64_t i = 0; i < nargs; ++i) { names.emplace_back(arg_names[i]); } std::shared_ptr algo = - std::make_shared(name, fn, std::move(names)); + std::make_shared(name, fn, std::move(names), memoizable != 0); current_scope().set(name, algo); return track(algo); } -Value *rt_call(Value *callee, Value **argv, int64_t argc) { +Value* rt_call(Value* callee, Value** argv, int64_t argc) { ValueList args; args.reserve(argc); for (int64_t i = 0; i < argc; ++i) { args.push_back(ref(argv[i])); } - if (auto *compiled = dynamic_cast(callee)) { + if (auto* compiled = dynamic_cast(callee)) { return track(call_compiled(compiled, args)); } @@ -288,7 +322,7 @@ Value *rt_call(Value *callee, Value **argv, int64_t argc) { // over the already-evaluated arguments as precomputed AST nodes. NodeList arg_nodes; arg_nodes.reserve(argc); - for (const auto &arg : args) { + for (const auto& arg : args) { arg_nodes.push_back(std::make_shared(arg)); } return track(callee->execute(arg_nodes, ¤t_scope())); @@ -304,10 +338,10 @@ void rt_frame_release(int64_t mark) { } } -void rt_loop_keep(int64_t frame_index, Value *v) { +void rt_loop_keep(int64_t frame_index, Value* v) { std::shared_ptr kept = ref(v); frames[frame_index].clear(); frames[frame_index].push_back(kept); } -} // extern "C" +} // extern "C" diff --git a/src/runtime.h b/src/runtime.h index 45dff6a..d22d792 100644 --- a/src/runtime.h +++ b/src/runtime.h @@ -44,45 +44,47 @@ extern "C" { void rt_init(); -Value *rt_make_int(int64_t v); -Value *rt_make_float(double v); -Value *rt_make_string(const char *s); -Value *rt_make_none(); -Value *rt_array_new(); -void rt_array_push(Value *arr, Value *v); +Value* rt_make_int(int64_t v); +Value* rt_make_float(double v); +Value* rt_make_string(const char* s); +Value* rt_make_none(); +Value* rt_array_new(); +void rt_array_push(Value* arr, Value* v); -Value *rt_get_var(const char *name); -Value *rt_set_var(const char *name, Value *v); +Value* rt_get_var(const char* name); +Value* rt_set_var(const char* name, Value* v); -Value *rt_bin_op(int64_t op, Value *a, Value *b); -Value *rt_unary_op(int64_t op, Value *a); +Value* rt_bin_op(int64_t op, Value* a, Value* b); +Value* rt_unary_op(int64_t op, Value* a); // Int 0/1 value from as_int() != 0 (used by short-circuit and/or). -Value *rt_bool(Value *v); +Value* rt_bool(Value* v); // stoll(get_num()) == 1, the interpreter's `if` condition. -int64_t rt_cond_eq1(Value *v); +int64_t rt_cond_eq1(Value* v); // as_int(), the interpreter's `while` / `repeat` condition. -int64_t rt_as_int(Value *v); +int64_t rt_as_int(Value* v); // Float-aware inclusive bound check matching Interpreter::visit_for. -int64_t rt_for_cond(Value *i, Value *end, Value *step); +int64_t rt_for_cond(Value* i, Value* end, Value* step); // Errors out (like the interpreter) when step == 0. -void rt_for_step_check(Value *step); +void rt_for_step_check(Value* step); -Value *rt_index(Value *obj, Value *idx); -Value *rt_index_assign(Value *obj, Value *idx, Value *v); -Value *rt_member_access(Value *obj, const char *name); -Value *rt_member_assign(Value *obj, const char *name, Value *v); +Value* rt_index(Value* obj, Value* idx); +Value* rt_index_assign(Value* obj, Value* idx, Value* v); +Value* rt_member_access(Value* obj, const char* name); +Value* rt_member_assign(Value* obj, const char* name, Value* v); -Value *rt_define_algo(const char *name, Value *(*fn)(), - const char *const *arg_names, int64_t nargs); -Value *rt_call(Value *callee, Value **argv, int64_t argc); +// `memoizable` enables the same by-argument result caching the interpreter +// applies to recursive pure-numeric algorithms. +Value* rt_define_algo(const char* name, Value* (*fn)(), const char* const* arg_names, int64_t nargs, + int64_t memoizable); +Value* rt_call(Value* callee, Value** argv, int64_t argc); int64_t rt_frame_mark(); void rt_frame_push(); void rt_frame_release(int64_t mark); // Replaces the contents of frame `frame_index` with just `v`: keeps the // current loop variable alive for one iteration without per-iteration growth. -void rt_loop_keep(int64_t frame_index, Value *v); +void rt_loop_keep(int64_t frame_index, Value* v); } #endif From 837982d33314db3e77da39278ab743ccc69d1ccf Mon Sep 17 00:00:00 2001 From: mtmatt Date: Wed, 10 Jun 2026 20:39:56 +0800 Subject: [PATCH 08/12] style: clang-format files touched by the compiler work Co-Authored-By: Claude Fable 5 --- src/interpreter.cpp | 418 ++++---- src/node.h | 332 +++--- src/pseudo.cpp | 2331 ++++++++++++++++++++----------------------- src/value.h | 178 ++-- 4 files changed, 1570 insertions(+), 1689 deletions(-) diff --git a/src/interpreter.cpp b/src/interpreter.cpp index c2589e4..0d17bfb 100644 --- a/src/interpreter.cpp +++ b/src/interpreter.cpp @@ -3,14 +3,16 @@ /// -------------------- #include "interpreter.h" -#include "node.h" -#include "value.h" + +#include #include #include -#include #include #include +#include "node.h" +#include "value.h" + namespace { constexpr int JIT_HOT_THRESHOLD = 8; @@ -42,77 +44,78 @@ bool has_assignment_node(const std::shared_ptr& node) { } return false; } -} // namespace +} // namespace std::shared_ptr Interpreter::visit(std::shared_ptr node) { if (std::optional> jit_result = try_visit_jit(node)) { return *jit_result; } - if(node->get_type() == NODE_VALUE) { + if (node->get_type() == NODE_VALUE) { return visit_number(node); } - if(node->get_type() == NODE_VARACCESS) { + if (node->get_type() == NODE_VARACCESS) { return visit_var_access(node); } - if(node->get_type() == NODE_VARASSIGN) { + if (node->get_type() == NODE_VARASSIGN) { return visit_var_assign(node); } - if(node->get_type() == NODE_BINOP) { + if (node->get_type() == NODE_BINOP) { return visit_bin_op(node); } - if(node->get_type() == NODE_UNARYOP) { + if (node->get_type() == NODE_UNARYOP) { return visit_unary_op(node); } - if(node->get_type() == NODE_IF) { + if (node->get_type() == NODE_IF) { return visit_if(node); } - if(node->get_type() == NODE_FOR) { + if (node->get_type() == NODE_FOR) { return visit_for(node); } - if(node->get_type() == NODE_WHILE) { + if (node->get_type() == NODE_WHILE) { return visit_while(node); } - if(node->get_type() == NODE_REPEAT) { + if (node->get_type() == NODE_REPEAT) { return visit_repeat(node); } - if(node->get_type() == NODE_ALGODEF) { + if (node->get_type() == NODE_ALGODEF) { return visit_algo_def(node); } - if(node->get_type() == NODE_STRUCTDEF) { + if (node->get_type() == NODE_STRUCTDEF) { return visit_struct_def(node); } - if(node->get_type() == NODE_ALGOCALL) { + if (node->get_type() == NODE_ALGOCALL) { return visit_algo_call(node); } - if(node->get_type() == NODE_ARRAY) { + if (node->get_type() == NODE_ARRAY) { return visit_array(node); } - if(node->get_type() == NODE_ARRACCESS) { + if (node->get_type() == NODE_ARRACCESS) { return visit_array_access(node); } - if(node->get_type() == NODE_ARRASSIGN) { + if (node->get_type() == NODE_ARRASSIGN) { return visit_array_assign(node); } - if(node->get_type() == NODE_MEMACCESS) { + if (node->get_type() == NODE_MEMACCESS) { return visit_member_access(node); } - if(node->get_type() == NODE_RETURN) { + if (node->get_type() == NODE_RETURN) { return visit_return(node); } - if(node->get_type() == NODE_BREAK) { + if (node->get_type() == NODE_BREAK) { return std::make_shared(VALUE_BREAK); } - if(node->get_type() == NODE_CONTINUE) { + if (node->get_type() == NODE_CONTINUE) { return std::make_shared(VALUE_CONTINUE); } - if(node->get_type() == NODE_PRECOMPUTED) { + if (node->get_type() == NODE_PRECOMPUTED) { return dynamic_cast(node.get())->get_value(); } return std::make_shared(VALUE_ERROR, "Fail to get result\n"); } -std::optional> Interpreter::try_visit_jit(const std::shared_ptr& node) { +std::optional> Interpreter::try_visit_jit( + const std::shared_ptr& node) { static std::unordered_map jit_cache; if (!is_jit_root(node)) { @@ -143,12 +146,15 @@ std::optional> Interpreter::try_visit_jit(const std::shar } std::shared_ptr Interpreter::visit_number(std::shared_ptr node) { - if(node->get_tok()->get_type() == TOKEN_INT) - return std::make_shared>(VALUE_INT, std::stoll(node->get_tok()->get_value())); - else if(node->get_tok()->get_type() == TOKEN_FLOAT) - return std::make_shared>(VALUE_FLOAT, std::stod(node->get_tok()->get_value())); - else if(node->get_tok()->get_type() == TOKEN_STRING) - return std::make_shared>(VALUE_STRING, node->get_tok()->get_value()); + if (node->get_tok()->get_type() == TOKEN_INT) + return std::make_shared>(VALUE_INT, + std::stoll(node->get_tok()->get_value())); + else if (node->get_tok()->get_type() == TOKEN_FLOAT) + return std::make_shared>(VALUE_FLOAT, + std::stod(node->get_tok()->get_value())); + else if (node->get_tok()->get_type() == TOKEN_STRING) + return std::make_shared>(VALUE_STRING, + node->get_tok()->get_value()); else return std::make_shared(VALUE_ERROR, "Not a value type\n"); } @@ -170,15 +176,15 @@ std::shared_ptr Interpreter::visit_var_assign(std::shared_ptr node) if (suffix->get_type() == VALUE_ERROR) { return suffix; } - if (suffix->get_type() == VALUE_STRING && current->append_string(suffix->as_string())) { + if (suffix->get_type() == VALUE_STRING && + current->append_string(suffix->as_string())) { return current; } } } } std::shared_ptr value = visit(child[0]); - if(value->get_type() == VALUE_ERROR) - return value; + if (value->get_type() == VALUE_ERROR) return value; symbol_table.set(var_name, value); return symbol_table.get(var_name); } @@ -187,42 +193,35 @@ std::shared_ptr Interpreter::visit_bin_op(std::shared_ptr node) { NodeList child = node->get_child(); std::shared_ptr a, b; a = visit(child[0]); - if(a->get_type() == VALUE_ERROR) - return a; - if(node->get_tok()->get_type() == TOKEN_KEYWORD && node->get_tok()->get_value() == "and") { - if(a->as_int() == 0) - return std::make_shared>(VALUE_INT, 0); + if (a->get_type() == VALUE_ERROR) return a; + if (node->get_tok()->get_type() == TOKEN_KEYWORD && node->get_tok()->get_value() == "and") { + if (a->as_int() == 0) return std::make_shared>(VALUE_INT, 0); b = visit(child[1]); - if(b->get_type() == VALUE_ERROR) - return b; + if (b->get_type() == VALUE_ERROR) return b; return std::make_shared>(VALUE_INT, b->as_int() != 0); } - if(node->get_tok()->get_type() == TOKEN_KEYWORD && node->get_tok()->get_value() == "or") { - if(a->as_int() != 0) - return std::make_shared>(VALUE_INT, 1); + if (node->get_tok()->get_type() == TOKEN_KEYWORD && node->get_tok()->get_value() == "or") { + if (a->as_int() != 0) return std::make_shared>(VALUE_INT, 1); b = visit(child[1]); - if(b->get_type() == VALUE_ERROR) - return b; + if (b->get_type() == VALUE_ERROR) return b; return std::make_shared>(VALUE_INT, b->as_int() != 0); } b = visit(child[1]); - if(b->get_type() == VALUE_ERROR) - return b; + if (b->get_type() == VALUE_ERROR) return b; return bin_op(a, b, node->get_tok()); } std::shared_ptr Interpreter::visit_unary_op(std::shared_ptr node) { NodeList child = node->get_child(); std::shared_ptr a = visit(child[0]); - if(a->get_type() == VALUE_ERROR) - return a; + if (a->get_type() == VALUE_ERROR) return a; return unary_op(a, node->get_tok()); } std::shared_ptr Interpreter::visit_array(std::shared_ptr node) { NodeList child = node->get_child(); ValueList array_value; - for(int i{0}; i < child.size(); ++i) { + for (int i{0}; i < child.size(); ++i) { array_value.push_back(visit(child[i])); } return std::make_shared(array_value); @@ -231,27 +230,27 @@ std::shared_ptr Interpreter::visit_array(std::shared_ptr node) { std::shared_ptr& Interpreter::visit_array_access(std::shared_ptr node) { NodeList child{node->get_child()}; std::shared_ptr arr{visit(child[0])}, index{visit(child[1])}; - if(arr->get_type() == VALUE_STRING) { + if (arr->get_type() == VALUE_STRING) { std::string str = arr->as_string(); int p = index->as_int(); if (1 <= p && p <= static_cast(str.size())) { - error = std::make_shared>( - VALUE_STRING, std::string(1, str[p - 1])); + error = + std::make_shared>(VALUE_STRING, std::string(1, str[p - 1])); } else { error = std::make_shared( VALUE_ERROR, "Index out of range, size: " + std::to_string(str.size()) + - ", position: " + std::to_string(p)); + ", position: " + std::to_string(p)); } return error; } - if(arr->get_type() == VALUE_HASH_TABLE) { + if (arr->get_type() == VALUE_HASH_TABLE) { algo_call_temp = arr; error = dynamic_cast(arr.get())->get(index); return error; } - if(arr->get_type() != VALUE_ARRAY) { - error = std::make_shared(VALUE_ERROR, "Access can only apply on array, find " + - arr->get_type() + "\n"); + if (arr->get_type() != VALUE_ARRAY) { + error = std::make_shared( + VALUE_ERROR, "Access can only apply on array, find " + arr->get_type() + "\n"); return error; } algo_call_temp = arr; @@ -260,11 +259,11 @@ std::shared_ptr& Interpreter::visit_array_access(std::shared_ptr no std::shared_ptr Interpreter::visit_array_assign(std::shared_ptr node) { NodeList child{node->get_child()}; - if(child[0]->get_type() == NODE_MEMACCESS) { + if (child[0]->get_type() == NODE_MEMACCESS) { // Handle member assignment: obj.member <- val - // visit_member_access currently returns a value (possibly a BoundMethodValue or just a value). - // But for assignment we need to set the member. - // We need to unpack NODE_MEMACCESS to get obj and member name. + // visit_member_access currently returns a value (possibly a BoundMethodValue or just a + // value). But for assignment we need to set the member. We need to unpack NODE_MEMACCESS to + // get obj and member name. std::shared_ptr obj_node = child[0]->get_child()[0]; std::shared_ptr member_node = child[0]->get_child()[1]; @@ -276,10 +275,12 @@ std::shared_ptr Interpreter::visit_array_assign(std::shared_ptr nod inst->set_member(member_node->get_name(), val); return val; } else { - return std::make_shared(VALUE_ERROR, "Assignment to member only supported for Struct Instances\n"); + return std::make_shared( + VALUE_ERROR, "Assignment to member only supported for Struct Instances\n"); } - } else if(child[0]->get_type() != NODE_ARRACCESS) { - return std::make_shared(VALUE_ERROR, "Access can only apply on array or object member\n"); + } else if (child[0]->get_type() != NODE_ARRACCESS) { + return std::make_shared(VALUE_ERROR, + "Access can only apply on array or object member\n"); } NodeList access_child{child[0]->get_child()}; std::shared_ptr obj{visit(access_child[0])}; @@ -290,17 +291,17 @@ std::shared_ptr Interpreter::visit_array_assign(std::shared_ptr nod if (value->get_type() == VALUE_ERROR) return value; return dynamic_cast(obj.get())->set(key, value); } - std::shared_ptr &arr{visit_array_access(child[0])}, value{visit(child[1])}; + std::shared_ptr&arr{visit_array_access(child[0])}, value{visit(child[1])}; return arr = value; } std::shared_ptr Interpreter::visit_member_access(std::shared_ptr node) { NodeList child{node->get_child()}; std::shared_ptr obj{visit(child[0])}; - std::shared_ptr &member{child[1]}; + std::shared_ptr& member{child[1]}; - if(obj->get_type() == VALUE_ARRAY || obj->get_type() == VALUE_STRING || - obj->get_type() == VALUE_HASH_TABLE) { + if (obj->get_type() == VALUE_ARRAY || obj->get_type() == VALUE_STRING || + obj->get_type() == VALUE_HASH_TABLE) { std::string member_name = member->get_name(); return std::make_shared(obj, member_name); } else if (obj->get_type() == VALUE_INSTANCE) { @@ -308,33 +309,33 @@ std::shared_ptr Interpreter::visit_member_access(std::shared_ptr no InstanceValue* inst = dynamic_cast(obj.get()); return inst->get_member(member_name, obj); } - error = std::make_shared(VALUE_ERROR, obj->get_num() + " has no member " + member->get_name() + "\n"); + error = std::make_shared( + VALUE_ERROR, obj->get_num() + " has no member " + member->get_name() + "\n"); return error; -} +} std::shared_ptr Interpreter::visit_if(std::shared_ptr node) { IfNode* if_node = dynamic_cast(node.get()); std::shared_ptr cond = visit(if_node->get_condition()); - if(cond->get_type() == VALUE_ERROR) - return cond; - if(std::stoll(cond->get_num()) == 1) { + if (cond->get_type() == VALUE_ERROR) return cond; + if (std::stoll(cond->get_num()) == 1) { std::shared_ptr ret; - for(auto expr : if_node->get_expr()) { + for (auto expr : if_node->get_expr()) { ret = visit(expr); - if(ret->get_type() == VALUE_ERROR || ret->get_type() == VALUE_RETURN || - ret->get_type() == VALUE_BREAK || ret->get_type() == VALUE_CONTINUE) { - return ret; - } + if (ret->get_type() == VALUE_ERROR || ret->get_type() == VALUE_RETURN || + ret->get_type() == VALUE_BREAK || ret->get_type() == VALUE_CONTINUE) { + return ret; + } } return ret; - } else if(!if_node->get_else().empty()) { + } else if (!if_node->get_else().empty()) { std::shared_ptr ret; - for(auto expr : if_node->get_else()) { + for (auto expr : if_node->get_else()) { ret = visit(expr); - if(ret->get_type() == VALUE_ERROR || ret->get_type() == VALUE_RETURN || - ret->get_type() == VALUE_BREAK || ret->get_type() == VALUE_CONTINUE) { - return ret; - } + if (ret->get_type() == VALUE_ERROR || ret->get_type() == VALUE_RETURN || + ret->get_type() == VALUE_BREAK || ret->get_type() == VALUE_CONTINUE) { + return ret; + } } return ret; } @@ -346,22 +347,22 @@ std::shared_ptr Interpreter::visit_for(std::shared_ptr node) { std::shared_ptr i = visit(child[0]); if (i->get_type() == VALUE_ERROR) return i; std::shared_ptr step; - if(child[2] != nullptr) { + if (child[2] != nullptr) { step = visit(child[2]); if (step->get_type() == VALUE_ERROR) return step; } else { step = std::make_shared>(VALUE_INT, 1); } std::shared_ptr end_value = visit(child[1]); - if(end_value->get_type() == VALUE_ERROR) return end_value; + if (end_value->get_type() == VALUE_ERROR) return end_value; std::function, std::shared_ptr)> condition; - if(step->as_double() > 0) { + if (step->as_double() > 0) { condition = [](std::shared_ptr i, std::shared_ptr end) -> bool { if (i->get_type() == VALUE_FLOAT || end->get_type() == VALUE_FLOAT) return i->as_double() <= end->as_double(); return i->as_int() <= end->as_int(); }; - } else if(step->as_double() < 0) { + } else if (step->as_double() < 0) { condition = [](std::shared_ptr i, std::shared_ptr end) -> bool { if (i->get_type() == VALUE_FLOAT || end->get_type() == VALUE_FLOAT) return i->as_double() >= end->as_double(); @@ -387,7 +388,8 @@ std::shared_ptr Interpreter::visit_for(std::shared_ptr node) { fast_assign_name = child[3]->get_name(); fast_assign_program = ExpressionJit::compile(assign_child[0]); if (!fast_assign_program && assign_child[0]->get_type() == NODE_ALGOCALL) { - AlgorithmCallNode* call_node = dynamic_cast(assign_child[0].get()); + AlgorithmCallNode* call_node = + dynamic_cast(assign_child[0].get()); if (call_node->get_call()->get_type() == NODE_VARACCESS) { std::shared_ptr callee = symbol_table.get(call_node->get_name()); AlgoValue* algo = dynamic_cast(callee.get()); @@ -402,7 +404,8 @@ std::shared_ptr Interpreter::visit_for(std::shared_ptr node) { if (fast_call_body_program) { bool args_compiled = true; for (const auto& arg : call_node->get_args()) { - std::optional arg_program = ExpressionJit::compile(arg); + std::optional arg_program = + ExpressionJit::compile(arg); if (!arg_program) { args_compiled = false; break; @@ -439,18 +442,16 @@ std::shared_ptr Interpreter::visit_for(std::shared_ptr node) { } ValueList ret; - while(condition(i, end_value)) { + while (condition(i, end_value)) { if (fast_assign_program) { std::optional> val = fast_assign_program->execute(symbol_table); if (!val) { fast_assign_program.reset(); std::shared_ptr fallback = visit(child[3]); - if(fallback->get_type() == VALUE_ERROR || fallback->get_type() == VALUE_RETURN) + if (fallback->get_type() == VALUE_ERROR || fallback->get_type() == VALUE_RETURN) return fallback; - if(fallback->get_type() == VALUE_BREAK) - goto end_for_loop; - if(fallback->get_type() == VALUE_CONTINUE) - goto next_for_iteration; + if (fallback->get_type() == VALUE_BREAK) goto end_for_loop; + if (fallback->get_type() == VALUE_CONTINUE) goto next_for_iteration; } else { if ((*val)->get_type() == VALUE_ERROR || (*val)->get_type() == VALUE_RETURN) return *val; @@ -464,8 +465,7 @@ std::shared_ptr Interpreter::visit_for(std::shared_ptr node) { std::optional> arg = fast_call_arg_programs[arg_index].execute(symbol_table); if (!arg || (*arg)->get_type() == VALUE_ERROR) { - if (arg && (*arg)->get_type() == VALUE_ERROR) - return *arg; + if (arg && (*arg)->get_type() == VALUE_ERROR) return *arg; failed = true; break; } @@ -480,7 +480,8 @@ std::shared_ptr Interpreter::visit_for(std::shared_ptr node) { fast_call_body_program->execute(symbol_table); if (!val) { failed = true; - } else if ((*val)->get_type() == VALUE_ERROR || (*val)->get_type() == VALUE_RETURN) { + } else if ((*val)->get_type() == VALUE_ERROR || + (*val)->get_type() == VALUE_RETURN) { return *val; } else if ((*val)->get_type() == VALUE_BREAK) { goto end_for_loop; @@ -491,8 +492,8 @@ std::shared_ptr Interpreter::visit_for(std::shared_ptr node) { } } - for (int arg_index = static_cast(had_saved_values.size()) - 1; - arg_index >= 0; --arg_index) { + for (int arg_index = static_cast(had_saved_values.size()) - 1; arg_index >= 0; + --arg_index) { if (had_saved_values[arg_index]) { symbol_table.set(fast_call_arg_names[arg_index], saved_values[arg_index]); } else { @@ -503,59 +504,48 @@ std::shared_ptr Interpreter::visit_for(std::shared_ptr node) { if (failed) { fast_call_body_program.reset(); std::shared_ptr fallback = visit(child[3]); - if(fallback->get_type() == VALUE_ERROR || fallback->get_type() == VALUE_RETURN) + if (fallback->get_type() == VALUE_ERROR || fallback->get_type() == VALUE_RETURN) return fallback; - if(fallback->get_type() == VALUE_BREAK) - goto end_for_loop; - if(fallback->get_type() == VALUE_CONTINUE) - goto next_for_iteration; + if (fallback->get_type() == VALUE_BREAK) goto end_for_loop; + if (fallback->get_type() == VALUE_CONTINUE) goto next_for_iteration; } } else if (fast_array && fast_array_index_program && fast_array_value_program) { - std::optional> index = fast_array_index_program->execute(symbol_table); - std::optional> val = fast_array_value_program->execute(symbol_table); + std::optional> index = + fast_array_index_program->execute(symbol_table); + std::optional> val = + fast_array_value_program->execute(symbol_table); if (!index || !val) { fast_array = nullptr; std::shared_ptr fallback = visit(child[3]); - if(fallback->get_type() == VALUE_ERROR || fallback->get_type() == VALUE_RETURN) + if (fallback->get_type() == VALUE_ERROR || fallback->get_type() == VALUE_RETURN) return fallback; - if(fallback->get_type() == VALUE_BREAK) - goto end_for_loop; - if(fallback->get_type() == VALUE_CONTINUE) - goto next_for_iteration; + if (fallback->get_type() == VALUE_BREAK) goto end_for_loop; + if (fallback->get_type() == VALUE_CONTINUE) goto next_for_iteration; } else { - if ((*index)->get_type() == VALUE_ERROR) - return *index; + if ((*index)->get_type() == VALUE_ERROR) return *index; if ((*val)->get_type() == VALUE_ERROR || (*val)->get_type() == VALUE_RETURN) return *val; - if ((*val)->get_type() == VALUE_BREAK) - goto end_for_loop; - if ((*val)->get_type() == VALUE_CONTINUE) - goto next_for_iteration; + if ((*val)->get_type() == VALUE_BREAK) goto end_for_loop; + if ((*val)->get_type() == VALUE_CONTINUE) goto next_for_iteration; fast_array->operator[]((*index)->as_int()) = *val; } - } else if(child.size() == 4) { + } else if (child.size() == 4) { std::shared_ptr val = visit(child[3]); - if(val->get_type() == VALUE_ERROR || val->get_type() == VALUE_RETURN) - return val; - if(val->get_type() == VALUE_BREAK) - goto end_for_loop; - if(val->get_type() == VALUE_CONTINUE) - goto next_for_iteration; + if (val->get_type() == VALUE_ERROR || val->get_type() == VALUE_RETURN) return val; + if (val->get_type() == VALUE_BREAK) goto end_for_loop; + if (val->get_type() == VALUE_CONTINUE) goto next_for_iteration; if (collect_loop_results) { ret.push_back(val); } } else { - for(int index{3}; index < child.size(); ++index) { + for (int index{3}; index < child.size(); ++index) { std::shared_ptr val{visit(child[index])}; - if(val->get_type() == VALUE_ERROR || val->get_type() == VALUE_RETURN) - return val; - if(val->get_type() == VALUE_BREAK) - goto end_for_loop; - if(val->get_type() == VALUE_CONTINUE) - goto next_for_iteration; + if (val->get_type() == VALUE_ERROR || val->get_type() == VALUE_RETURN) return val; + if (val->get_type() == VALUE_BREAK) goto end_for_loop; + if (val->get_type() == VALUE_CONTINUE) goto next_for_iteration; } } -next_for_iteration: + next_for_iteration: symbol_table.set(child[0]->get_name(), i + step); i = symbol_table.get(child[0]->get_name()); } @@ -564,46 +554,39 @@ std::shared_ptr Interpreter::visit_for(std::shared_ptr node) { static std::shared_ptr none = std::make_shared(); return none; } - if(child.size() != 4) - ret.push_back(std::make_shared()); + if (child.size() != 4) ret.push_back(std::make_shared()); return std::make_shared(ret); } std::shared_ptr Interpreter::visit_while(std::shared_ptr node) { NodeList child = node->get_child(); ValueList ret; - while(visit(child[0])->as_int() == 1) { - if(child.size() == 2) { + while (visit(child[0])->as_int() == 1) { + if (child.size() == 2) { std::shared_ptr val = visit(child[1]); - if(val->get_type() == VALUE_ERROR || val->get_type() == VALUE_RETURN) - return val; - if(val->get_type() == VALUE_BREAK) - break; - if(val->get_type() == VALUE_CONTINUE) - continue; + if (val->get_type() == VALUE_ERROR || val->get_type() == VALUE_RETURN) return val; + if (val->get_type() == VALUE_BREAK) break; + if (val->get_type() == VALUE_CONTINUE) continue; if (collect_loop_results) { ret.push_back(val); } } else { bool should_continue = false; bool should_break = false; - for(int index{1}; index < child.size(); ++index) { + for (int index{1}; index < child.size(); ++index) { std::shared_ptr ret{visit(child[index])}; - if(ret->get_type() == VALUE_ERROR || ret->get_type() == VALUE_RETURN) - return ret; - if(ret->get_type() == VALUE_BREAK) { + if (ret->get_type() == VALUE_ERROR || ret->get_type() == VALUE_RETURN) return ret; + if (ret->get_type() == VALUE_BREAK) { should_break = true; break; } - if(ret->get_type() == VALUE_CONTINUE) { + if (ret->get_type() == VALUE_CONTINUE) { should_continue = true; break; } } - if(should_break) - break; - if(should_continue) - continue; + if (should_break) break; + if (should_continue) continue; } } if (!collect_loop_results) { @@ -617,39 +600,33 @@ std::shared_ptr Interpreter::visit_repeat(std::shared_ptr node) { NodeList child = node->get_child(); ValueList ret; do { - if(child.size() == 2) { + if (child.size() == 2) { std::shared_ptr val = visit(child[1]); - if(val->get_type() == VALUE_ERROR || val->get_type() == VALUE_RETURN) - return val; - if(val->get_type() == VALUE_BREAK) - break; - if(val->get_type() == VALUE_CONTINUE) - continue; + if (val->get_type() == VALUE_ERROR || val->get_type() == VALUE_RETURN) return val; + if (val->get_type() == VALUE_BREAK) break; + if (val->get_type() == VALUE_CONTINUE) continue; if (collect_loop_results) { ret.push_back(val); } } else { bool should_continue = false; bool should_break = false; - for(int index{1}; index < child.size(); ++index) { + for (int index{1}; index < child.size(); ++index) { std::shared_ptr ret{visit(child[index])}; - if(ret->get_type() == VALUE_ERROR || ret->get_type() == VALUE_RETURN) - return ret; - if(ret->get_type() == VALUE_BREAK) { + if (ret->get_type() == VALUE_ERROR || ret->get_type() == VALUE_RETURN) return ret; + if (ret->get_type() == VALUE_BREAK) { should_break = true; break; } - if(ret->get_type() == VALUE_CONTINUE) { + if (ret->get_type() == VALUE_CONTINUE) { should_continue = true; break; } } - if(should_break) - break; - if(should_continue) - continue; + if (should_break) break; + if (should_continue) continue; } - } while(visit(child[0])->as_int() == 0); + } while (visit(child[0])->as_int() == 0); if (!collect_loop_results) { static std::shared_ptr none = std::make_shared(); return none; @@ -660,12 +637,12 @@ std::shared_ptr Interpreter::visit_repeat(std::shared_ptr node) { std::shared_ptr Interpreter::visit_algo_def(std::shared_ptr node) { std::string algo_name = node->get_name(); std::shared_ptr value = std::make_shared(algo_name, node); - + size_t pos = algo_name.find("::"); if (pos != std::string::npos) { std::string struct_name = algo_name.substr(0, pos); std::string method_name = algo_name.substr(pos + 2); - + std::shared_ptr struct_val = symbol_table.get(struct_name); if (struct_val->get_type() == VALUE_STRUCT) { StructValue* s = dynamic_cast(struct_val.get()); @@ -687,18 +664,19 @@ std::shared_ptr Interpreter::visit_algo_call(std::shared_ptr node) return *array_result; } - AlgorithmCallNode *algo_call_node = dynamic_cast(node.get()); + AlgorithmCallNode* algo_call_node = dynamic_cast(node.get()); std::shared_ptr algo_node = algo_call_node->get_call(); std::shared_ptr algo; - if(algo_node->get_type() == NODE_VARACCESS) + if (algo_node->get_type() == NODE_VARACCESS) algo = symbol_table.get(algo_call_node->get_name()); else algo = visit(algo_node); return algo->execute(algo_call_node->get_args(), &symbol_table); } -std::optional> Interpreter::try_visit_array_method_call(const std::shared_ptr& node) { - AlgorithmCallNode *algo_call_node = dynamic_cast(node.get()); +std::optional> Interpreter::try_visit_array_method_call( + const std::shared_ptr& node) { + AlgorithmCallNode* algo_call_node = dynamic_cast(node.get()); if (!algo_call_node) { return std::nullopt; } @@ -711,11 +689,9 @@ std::optional> Interpreter::try_visit_array_method_call(c NodeList member_child = call_node->get_child(); const std::string method_name = member_child[1]->get_name(); const bool supported_method = - method_name == "push" || method_name == "push_back" || - method_name == "pop" || method_name == "pop_back" || - method_name == "resize" || method_name == "size" || - method_name == "back" || method_name == "insert" || - method_name == "remove"; + method_name == "push" || method_name == "push_back" || method_name == "pop" || + method_name == "pop_back" || method_name == "resize" || method_name == "size" || + method_name == "back" || method_name == "insert" || method_name == "remove"; if (!supported_method || member_child[0]->get_type() != NODE_VARACCESS) { return std::nullopt; } @@ -724,7 +700,7 @@ std::optional> Interpreter::try_visit_array_method_call(c if (obj->get_type() != VALUE_ARRAY) { return std::nullopt; } - ArrayValue *arr_obj = dynamic_cast(obj.get()); + ArrayValue* arr_obj = dynamic_cast(obj.get()); const NodeList& args = algo_call_node->get_args(); auto visit_arg = [this](const std::shared_ptr& arg) -> std::shared_ptr { @@ -738,8 +714,8 @@ std::optional> Interpreter::try_visit_array_method_call(c if (method_name == "push" || method_name == "push_back") { if (args.size() != 1) { - return std::make_shared( - VALUE_ERROR, "Expect one argument for " + method_name + "\n"); + return std::make_shared(VALUE_ERROR, + "Expect one argument for " + method_name + "\n"); } std::shared_ptr arg = visit_arg(args[0]); if (arg->get_type() == VALUE_ERROR) { @@ -751,8 +727,8 @@ std::optional> Interpreter::try_visit_array_method_call(c if (method_name == "pop" || method_name == "pop_back") { if (!args.empty()) { - return std::make_shared( - VALUE_ERROR, "Expect zero argument for " + method_name + "\n"); + return std::make_shared(VALUE_ERROR, + "Expect zero argument for " + method_name + "\n"); } if (arr_obj->empty()) { std::cout << "Cannot " << method_name << " from an empty array\n"; @@ -763,8 +739,7 @@ std::optional> Interpreter::try_visit_array_method_call(c if (method_name == "resize") { if (args.size() != 1) { - return std::make_shared(VALUE_ERROR, - "Expect one argument for resize\n"); + return std::make_shared(VALUE_ERROR, "Expect one argument for resize\n"); } std::shared_ptr new_size_val = visit_arg(args[0]); if (new_size_val->get_type() == VALUE_ERROR) { @@ -791,8 +766,7 @@ std::optional> Interpreter::try_visit_array_method_call(c if (method_name == "insert") { if (args.size() != 2) { - return std::make_shared(VALUE_ERROR, - "Expect two arguments for insert\n"); + return std::make_shared(VALUE_ERROR, "Expect two arguments for insert\n"); } std::shared_ptr index = visit_arg(args[0]); if (index->get_type() == VALUE_ERROR) { @@ -807,8 +781,7 @@ std::optional> Interpreter::try_visit_array_method_call(c if (method_name == "remove") { if (args.size() != 1) { - return std::make_shared(VALUE_ERROR, - "Expect one argument for remove\n"); + return std::make_shared(VALUE_ERROR, "Expect one argument for remove\n"); } std::shared_ptr index = visit_arg(args[0]); if (index->get_type() == VALUE_ERROR) { @@ -819,20 +792,18 @@ std::optional> Interpreter::try_visit_array_method_call(c if (method_name == "size") { if (!args.empty()) { - return std::make_shared(VALUE_ERROR, - "Expect zero argument for size\n"); + return std::make_shared(VALUE_ERROR, "Expect zero argument for size\n"); } return arr_obj->size(); } if (method_name == "back") { if (!args.empty()) { - return std::make_shared(VALUE_ERROR, - "Expect zero arguments for back\n"); + return std::make_shared(VALUE_ERROR, "Expect zero arguments for back\n"); } if (arr_obj->empty()) { - return std::make_shared( - VALUE_ERROR, "Cannot call back on an empty array\n"); + return std::make_shared(VALUE_ERROR, + "Cannot call back on an empty array\n"); } return arr_obj->back(); } @@ -840,50 +811,50 @@ std::optional> Interpreter::try_visit_array_method_call(c return std::nullopt; } -std::shared_ptr Interpreter::bin_op( - std::shared_ptr a, std::shared_ptr b, std::shared_ptr op -) { - if(op->get_type() == TOKEN_ADD) +std::shared_ptr Interpreter::bin_op(std::shared_ptr a, std::shared_ptr b, + std::shared_ptr op) { + if (op->get_type() == TOKEN_ADD) return a + b; - else if(op->get_type() == TOKEN_SUB) + else if (op->get_type() == TOKEN_SUB) return a - b; - else if(op->get_type() == TOKEN_MUL) + else if (op->get_type() == TOKEN_MUL) return a * b; - else if(op->get_type() == TOKEN_DIV) + else if (op->get_type() == TOKEN_DIV) return a / b; - else if(op->get_type() == TOKEN_MOD) + else if (op->get_type() == TOKEN_MOD) return a % b; - else if(op->get_type() == TOKEN_POW) + else if (op->get_type() == TOKEN_POW) return pow(a, b); - else if(op->get_type() == TOKEN_EQUAL) + else if (op->get_type() == TOKEN_EQUAL) return a == b; - else if(op->get_type() == TOKEN_NEQ) + else if (op->get_type() == TOKEN_NEQ) return a != b; - else if(op->get_type() == TOKEN_LESS) + else if (op->get_type() == TOKEN_LESS) return a < b; - else if(op->get_type() == TOKEN_GREATER) + else if (op->get_type() == TOKEN_GREATER) return a > b; - else if(op->get_type() == TOKEN_LEQ) + else if (op->get_type() == TOKEN_LEQ) return a <= b; - else if(op->get_type() == TOKEN_GEQ) + else if (op->get_type() == TOKEN_GEQ) return a >= b; - else if(op->get_type() == TOKEN_KEYWORD && op->get_value() == "and") + else if (op->get_type() == TOKEN_KEYWORD && op->get_value() == "and") return a && b; - else if(op->get_type() == TOKEN_KEYWORD && op->get_value() == "or") + else if (op->get_type() == TOKEN_KEYWORD && op->get_value() == "or") return a || b; - + return std::make_shared(VALUE_ERROR, "Not a binary op\n"); } std::shared_ptr Interpreter::unary_op(std::shared_ptr a, std::shared_ptr op) { - if(op->get_type() == TOKEN_ADD) + if (op->get_type() == TOKEN_ADD) return a; - else if(op->get_type() == TOKEN_SUB) + else if (op->get_type() == TOKEN_SUB) return -a; - else if(op->get_type() == TOKEN_KEYWORD && op->get_value() == "not") + else if (op->get_type() == TOKEN_KEYWORD && op->get_value() == "not") return !a; return std::make_shared(VALUE_ERROR, "Not an unary op\n"); -}std::shared_ptr Interpreter::visit_struct_def(std::shared_ptr node) { +} +std::shared_ptr Interpreter::visit_struct_def(std::shared_ptr node) { auto struct_node = dynamic_cast(node.get()); std::string name = struct_node->get_name(); std::vector members; @@ -893,7 +864,8 @@ std::shared_ptr Interpreter::unary_op(std::shared_ptr a, std::shar std::map> methods; for (const auto& method_node : struct_node->get_child()) { - std::string method_name = method_node->get_name(); // This is the simple name "constructor", "add", etc. + std::string method_name = + method_node->get_name(); // This is the simple name "constructor", "add", etc. // We need to visit it to create an AlgoValue // But visit_algo_def puts it in symbol table. We don't want that for struct methods, // we want them inside the struct. diff --git a/src/node.h b/src/node.h index 752b129..4f8f779 100644 --- a/src/node.h +++ b/src/node.h @@ -7,10 +7,11 @@ #include #include +#include #include #include #include -#include + #include "token.h" const std::string NODE_VALUE{"VALUE"}; @@ -37,291 +38,310 @@ const std::string NODE_PRECOMPUTED("PRECOMPUTED"); const std::string TAB{" "}; class Node { -public: + public: Node() : node_id(next_node_id.fetch_add(1, std::memory_order_relaxed)) {} virtual std::string get_node() = 0; virtual ~Node() {}; - virtual std::vector> get_child() { return std::vector>(0);} - virtual std::string get_type() {return "NONE";} - virtual std::shared_ptr get_tok() { return nullptr;} - virtual TokenList get_toks() { return TokenList(0);} - virtual std::string get_name() { return "";} - std::size_t get_id() const { return node_id;} -private: + virtual std::vector> get_child() { + return std::vector>(0); + } + virtual std::string get_type() { return "NONE"; } + virtual std::shared_ptr get_tok() { return nullptr; } + virtual TokenList get_toks() { return TokenList(0); } + virtual std::string get_name() { return ""; } + std::size_t get_id() const { return node_id; } + + private: inline static std::atomic_size_t next_node_id{1}; std::size_t node_id; }; using NodeList = std::vector>; -class ErrorNode: public Node { -public: - ErrorNode(std::shared_ptr _tok) - : tok(_tok) {} +class ErrorNode : public Node { + public: + ErrorNode(std::shared_ptr _tok) : tok(_tok) {} std::string get_node() override; - std::shared_ptr get_tok() override { return tok;} - std::string get_type() override {return NODE_ERROR;} -protected: + std::shared_ptr get_tok() override { return tok; } + std::string get_type() override { return NODE_ERROR; } + + protected: std::shared_ptr tok; }; -class ValueNode: public Node { -public: - ValueNode(std::shared_ptr _tok) - : tok(_tok) {} +class ValueNode : public Node { + public: + ValueNode(std::shared_ptr _tok) : tok(_tok) {} std::string get_node() override; - std::string get_type() override {return NODE_VALUE;} - std::shared_ptr get_tok() override { return tok;} -protected: + std::string get_type() override { return NODE_VALUE; } + std::shared_ptr get_tok() override { return tok; } + + protected: std::shared_ptr tok; }; -class BinOpNode: public Node { -public: +class BinOpNode : public Node { + public: BinOpNode(std::shared_ptr left, std::shared_ptr right, std::shared_ptr tok) : left_node(left), right_node(right), op_tok(tok) {} std::string get_node() override; NodeList get_child() override; - std::string get_type() override {return NODE_BINOP;} - std::shared_ptr get_tok() override { return op_tok;} -protected: + std::string get_type() override { return NODE_BINOP; } + std::shared_ptr get_tok() override { return op_tok; } + + protected: std::shared_ptr left_node, right_node; std::shared_ptr op_tok; }; -class UnaryOpNode: public Node { -public: +class UnaryOpNode : public Node { + public: UnaryOpNode(std::shared_ptr _node, std::shared_ptr tok) : node(_node), op_tok(tok) {} std::string get_node() override; NodeList get_child() override; - std::string get_type() override { return NODE_UNARYOP;} - std::shared_ptr get_tok() override { return op_tok;} -protected: + std::string get_type() override { return NODE_UNARYOP; } + std::shared_ptr get_tok() override { return op_tok; } + + protected: std::shared_ptr node; std::shared_ptr op_tok; }; -class VarAssignNode: public Node { -public: - VarAssignNode(std::string _name, std::shared_ptr _node) - : name(_name), node(_node) {} +class VarAssignNode : public Node { + public: + VarAssignNode(std::string _name, std::shared_ptr _node) : name(_name), node(_node) {} std::string get_node() override; - NodeList get_child() override { return NodeList{node};} - std::string get_type() override { return NODE_VARASSIGN;} - std::shared_ptr get_tok() override { return nullptr;} - std::string get_name() override { return name;} -protected: + NodeList get_child() override { return NodeList{node}; } + std::string get_type() override { return NODE_VARASSIGN; } + std::shared_ptr get_tok() override { return nullptr; } + std::string get_name() override { return name; } + + protected: std::string name; std::shared_ptr node; }; -class VarAccessNode: public Node { -public: - VarAccessNode(std::shared_ptr _tok) - : tok(_tok) {} +class VarAccessNode : public Node { + public: + VarAccessNode(std::shared_ptr _tok) : tok(_tok) {} std::string get_node() override; - NodeList get_child() override { return NodeList(0);} - std::string get_type() override{ return NODE_VARACCESS;} - std::shared_ptr get_tok() override { return tok;} - std::string get_name() override {return tok->get_value();} -protected: + NodeList get_child() override { return NodeList(0); } + std::string get_type() override { return NODE_VARACCESS; } + std::shared_ptr get_tok() override { return tok; } + std::string get_name() override { return tok->get_value(); } + + protected: std::shared_ptr tok; }; -class IfNode: public Node { -public: +class IfNode : public Node { + public: IfNode(std::shared_ptr condition, NodeList expr, NodeList _else_node) : condition_node(condition), expr_node(expr), else_node(_else_node) {} std::string get_node() override; NodeList get_child() override { throw std::runtime_error("should not call get_child on if node"); } - const std::shared_ptr& get_condition() { return condition_node;} - const NodeList& get_expr() { return expr_node;} - const NodeList& get_else() { return else_node;} - std::string get_type() override{ return NODE_IF;} - std::shared_ptr get_tok() override { return nullptr;} - std::string get_name() override { return "";} -protected: - std::shared_ptr condition_node; + const std::shared_ptr& get_condition() { return condition_node; } + const NodeList& get_expr() { return expr_node; } + const NodeList& get_else() { return else_node; } + std::string get_type() override { return NODE_IF; } + std::shared_ptr get_tok() override { return nullptr; } + std::string get_name() override { return ""; } + + protected: + std::shared_ptr condition_node; NodeList expr_node, else_node; }; -class ForNode: public Node { -public: - ForNode( - std::shared_ptr _var_assign, std::shared_ptr _end_value, - std::shared_ptr _step_value, NodeList _body_node - ) : var_assign(_var_assign), end_value(_end_value), step_value(_step_value), body_node(_body_node) {} +class ForNode : public Node { + public: + ForNode(std::shared_ptr _var_assign, std::shared_ptr _end_value, + std::shared_ptr _step_value, NodeList _body_node) + : var_assign(_var_assign), + end_value(_end_value), + step_value(_step_value), + body_node(_body_node) {} std::string get_node() override; NodeList get_child() override { NodeList child{var_assign, end_value, step_value}; - for(auto node : body_node) child.push_back(node); + for (auto node : body_node) child.push_back(node); return child; } - std::string get_type() override { return NODE_FOR;} - std::shared_ptr get_tok() override { return nullptr;} - std::string get_name() override { return "";} -protected: + std::string get_type() override { return NODE_FOR; } + std::shared_ptr get_tok() override { return nullptr; } + std::string get_name() override { return ""; } + + protected: std::shared_ptr var_assign, end_value, step_value; NodeList body_node; }; -class WhileNode: public Node { -public: +class WhileNode : public Node { + public: WhileNode(std::shared_ptr _condition, NodeList _body_node) : condition(_condition), body_node(_body_node) {} std::string get_node() override; NodeList get_child() override { NodeList child{condition}; - for(auto node : body_node) child.push_back(node); + for (auto node : body_node) child.push_back(node); return child; } - std::string get_type() override { return NODE_WHILE;} - std::shared_ptr get_tok() override { return nullptr;} - std::string get_name() override { return "";} -protected: + std::string get_type() override { return NODE_WHILE; } + std::shared_ptr get_tok() override { return nullptr; } + std::string get_name() override { return ""; } + + protected: std::shared_ptr condition; NodeList body_node; }; -class RepeatNode: public Node { -public: +class RepeatNode : public Node { + public: RepeatNode(NodeList _body_node, std::shared_ptr _condition) : condition(_condition), body_node(_body_node) {} std::string get_node() override; NodeList get_child() override { NodeList child{condition}; - for(auto node : body_node) child.push_back(node); + for (auto node : body_node) child.push_back(node); return child; } - std::string get_type() override { return NODE_REPEAT;} - std::shared_ptr get_tok() override { return nullptr;} - std::string get_name() override { return "";} -protected: + std::string get_type() override { return NODE_REPEAT; } + std::shared_ptr get_tok() override { return nullptr; } + std::string get_name() override { return ""; } + + protected: std::shared_ptr condition; NodeList body_node; }; -class AlgorithmDefNode: public Node { -public: - AlgorithmDefNode(std::shared_ptr _algo_name, const TokenList &_args_name, NodeList _body_node = {}) +class AlgorithmDefNode : public Node { + public: + AlgorithmDefNode(std::shared_ptr _algo_name, const TokenList& _args_name, + NodeList _body_node = {}) : algo_name(_algo_name), args_name(_args_name), body_node(_body_node) {} std::string get_node() override; - NodeList get_child() override { return body_node;} - const NodeList& get_body() const { return body_node;} - std::string get_type() override { return NODE_ALGODEF;} - std::shared_ptr get_tok() override { return algo_name;} - TokenList get_toks() override { return args_name;} - std::string get_name() override { return algo_name->get_value();} -protected: + NodeList get_child() override { return body_node; } + const NodeList& get_body() const { return body_node; } + std::string get_type() override { return NODE_ALGODEF; } + std::shared_ptr get_tok() override { return algo_name; } + TokenList get_toks() override { return args_name; } + std::string get_name() override { return algo_name->get_value(); } + + protected: std::shared_ptr algo_name; TokenList args_name; NodeList body_node; }; -class AlgorithmCallNode: public Node { -public: - AlgorithmCallNode(std::shared_ptr _call_node, const NodeList &_args) +class AlgorithmCallNode : public Node { + public: + AlgorithmCallNode(std::shared_ptr _call_node, const NodeList& _args) : call_node(_call_node), args(_args) {} std::string get_node() override; - NodeList get_child() override { return args;} - const NodeList& get_args() const { return args;} - std::string get_type() override { return NODE_ALGOCALL;} - std::shared_ptr get_tok() override { return nullptr;} - std::string get_name() override { return call_node->get_name();} - std::shared_ptr get_call() { return call_node;} -protected: + NodeList get_child() override { return args; } + const NodeList& get_args() const { return args; } + std::string get_type() override { return NODE_ALGOCALL; } + std::shared_ptr get_tok() override { return nullptr; } + std::string get_name() override { return call_node->get_name(); } + std::shared_ptr get_call() { return call_node; } + + protected: std::shared_ptr call_node; NodeList args; }; -class ArrayNode: public Node { -public: - ArrayNode(const NodeList &_elements_node) - : elements_node(_elements_node) {} +class ArrayNode : public Node { + public: + ArrayNode(const NodeList& _elements_node) : elements_node(_elements_node) {} std::string get_node() override; - NodeList get_child() override { return elements_node;} - std::string get_type() override { return NODE_ARRAY;} - std::shared_ptr get_tok() override { return nullptr;} - std::string get_name() override { return "";} -protected: + NodeList get_child() override { return elements_node; } + std::string get_type() override { return NODE_ARRAY; } + std::shared_ptr get_tok() override { return nullptr; } + std::string get_name() override { return ""; } + + protected: NodeList elements_node; }; -class ArrayAccessNode: public Node { -public: +class ArrayAccessNode : public Node { + public: ArrayAccessNode(std::shared_ptr _arr, std::shared_ptr _index) : arr(_arr), index(_index) {} std::string get_node() override; - NodeList get_child() override { return NodeList{arr, index};} - std::string get_type() override { return NODE_ARRACCESS;} - std::shared_ptr get_tok() override { return nullptr;} -protected: + NodeList get_child() override { return NodeList{arr, index}; } + std::string get_type() override { return NODE_ARRACCESS; } + std::shared_ptr get_tok() override { return nullptr; } + + protected: std::shared_ptr arr, index; }; -class ArrayAssignNode: public Node { -public: +class ArrayAssignNode : public Node { + public: ArrayAssignNode(std::shared_ptr _arr, std::shared_ptr _value) : arr(_arr), value(_value) {} std::string get_node() override; - NodeList get_child() override { return NodeList{arr, value};} - std::string get_type() override { return NODE_ARRASSIGN;} - std::shared_ptr get_tok() override { return nullptr;} -protected: + NodeList get_child() override { return NodeList{arr, value}; } + std::string get_type() override { return NODE_ARRASSIGN; } + std::shared_ptr get_tok() override { return nullptr; } + + protected: std::shared_ptr arr, value; }; -class MemberAccessNode: public Node { -public: +class MemberAccessNode : public Node { + public: MemberAccessNode(std::shared_ptr _obj, std::shared_ptr _member) : obj(_obj), member(_member) {} std::string get_node() override; - NodeList get_child() override { return NodeList{obj, member};} - std::string get_type() override { return NODE_MEMACCESS;} - std::shared_ptr get_tok() override { return nullptr;} -protected: + NodeList get_child() override { return NodeList{obj, member}; } + std::string get_type() override { return NODE_MEMACCESS; } + std::shared_ptr get_tok() override { return nullptr; } + + protected: std::shared_ptr obj, member; }; -class StructDefNode: public Node { -public: - StructDefNode(std::shared_ptr _struct_name, const TokenList &_members, const NodeList &_methods) +class StructDefNode : public Node { + public: + StructDefNode(std::shared_ptr _struct_name, const TokenList& _members, + const NodeList& _methods) : struct_name(_struct_name), members(_members), methods(_methods) {} std::string get_node() override; - NodeList get_child() override { return methods;} - std::string get_type() override { return NODE_STRUCTDEF;} - std::shared_ptr get_tok() override { return struct_name;} - TokenList get_toks() override { return members;} - std::string get_name() override { return struct_name->get_value();} -protected: + NodeList get_child() override { return methods; } + std::string get_type() override { return NODE_STRUCTDEF; } + std::shared_ptr get_tok() override { return struct_name; } + TokenList get_toks() override { return members; } + std::string get_name() override { return struct_name->get_value(); } + + protected: std::shared_ptr struct_name; TokenList members; NodeList methods; }; -class ReturnNode: public Node { -public: - ReturnNode(std::shared_ptr _node) - : node(_node) {} +class ReturnNode : public Node { + public: + ReturnNode(std::shared_ptr _node) : node(_node) {} std::string get_node() override { return "RETURN " + node->get_node(); } - NodeList get_child() override { return NodeList{node};} - std::string get_type() override { return NODE_RETURN;} - std::shared_ptr get_tok() override { return nullptr;} - std::string get_name() override { return "";} -protected: + NodeList get_child() override { return NodeList{node}; } + std::string get_type() override { return NODE_RETURN; } + std::shared_ptr get_tok() override { return nullptr; } + std::string get_name() override { return ""; } + + protected: std::shared_ptr node; }; -class ControlNode: public Node { -public: - ControlNode(const std::string& _type) - : control_type(_type) {} +class ControlNode : public Node { + public: + ControlNode(const std::string& _type) : control_type(_type) {} std::string get_node() override { return control_type; } std::string get_type() override { return control_type; } -protected: + + protected: std::string control_type; }; diff --git a/src/pseudo.cpp b/src/pseudo.cpp index b4ff492..5cac55c 100644 --- a/src/pseudo.cpp +++ b/src/pseudo.cpp @@ -1,11 +1,5 @@ #include "pseudo.h" -#include "analysis.h" -#include "imports.h" -#include "color.h" -#include "interpreter.h" -#include "node.h" -#include "value.h" -#include "error.h" + #include #include #include @@ -20,13 +14,21 @@ #include #include +#include "analysis.h" +#include "color.h" +#include "error.h" +#include "imports.h" +#include "interpreter.h" +#include "node.h" +#include "value.h" + /// -------------------- /// Value /// -------------------- -std::ostream &operator<<(std::ostream &out, Value &number) { - out << number.get_num(); - return out; +std::ostream& operator<<(std::ostream& out, Value& number) { + out << number.get_num(); + return out; } int64_t Value::as_int() { return std::stoll(get_num()); } @@ -35,250 +37,249 @@ double Value::as_double() { return std::stod(get_num()); } std::string Value::as_string() { return get_num(); } -template std::string TypedValue::get_num() { - std::stringstream ss; - std::string ret; - if (type == VALUE_FLOAT || type == VALUE_INT) { - ss << value; - std::getline(ss, ret); - } else if (type == VALUE_STRING || type == VALUE_ERROR) { - ret = value; - } - return ret; +template +std::string TypedValue::get_num() { + std::stringstream ss; + std::string ret; + if (type == VALUE_FLOAT || type == VALUE_INT) { + ss << value; + std::getline(ss, ret); + } else if (type == VALUE_STRING || type == VALUE_ERROR) { + ret = value; + } + return ret; } -template int64_t TypedValue::as_int() { - if constexpr (std::is_same_v) { - return value; - } else if constexpr (std::is_same_v) { - return static_cast(value); - } else { - return std::stoll(value); - } +template +int64_t TypedValue::as_int() { + if constexpr (std::is_same_v) { + return value; + } else if constexpr (std::is_same_v) { + return static_cast(value); + } else { + return std::stoll(value); + } } -template double TypedValue::as_double() { - if constexpr (std::is_same_v) { - return value; - } else if constexpr (std::is_same_v) { - return static_cast(value); - } else { - return std::stod(value); - } +template +double TypedValue::as_double() { + if constexpr (std::is_same_v) { + return value; + } else if constexpr (std::is_same_v) { + return static_cast(value); + } else { + return std::stod(value); + } } -template std::string TypedValue::as_string() { - if constexpr (std::is_same_v) { - return value; - } else { - return get_num(); - } +template +std::string TypedValue::as_string() { + if constexpr (std::is_same_v) { + return value; + } else { + return get_num(); + } } -template bool TypedValue::append_string(const std::string& suffix) { - if constexpr (std::is_same_v) { - value += suffix; - return true; - } - return false; -} - -template std::string TypedValue::repr() { - std::stringstream ss; - std::string ret; - if (type == VALUE_FLOAT || type == VALUE_INT) { - ret = get_num(); - } else if (type == VALUE_STRING) { - ss << value; - - char ch{char(ss.get())}; - ret += '\"'; - while (!ss.eof()) { - if (REVERSE_ESCAPE_CHAR.count(ch)) { - ret += '\\'; - ret += REVERSE_ESCAPE_CHAR.at(ch); - } else { - ret += ch; - } - ch = ss.get(); - } - ret += '\"'; - } - return ret; +template +bool TypedValue::append_string(const std::string& suffix) { + if constexpr (std::is_same_v) { + value += suffix; + return true; + } + return false; } -std::string ArrayValue::get_num() { - std::stringstream ss; - ss << "{"; - if (!value.empty()) - ss << value[0]->repr(); - for (int i{1}; i < value.size(); ++i) { - ss << ", " << value[i]->repr(); - } - ss << "}"; - std::string ret; - std::getline(ss, ret); - return ret; +template +std::string TypedValue::repr() { + std::stringstream ss; + std::string ret; + if (type == VALUE_FLOAT || type == VALUE_INT) { + ret = get_num(); + } else if (type == VALUE_STRING) { + ss << value; + + char ch{char(ss.get())}; + ret += '\"'; + while (!ss.eof()) { + if (REVERSE_ESCAPE_CHAR.count(ch)) { + ret += '\\'; + ret += REVERSE_ESCAPE_CHAR.at(ch); + } else { + ret += ch; + } + ch = ss.get(); + } + ret += '\"'; + } + return ret; } -void ArrayValue::push_back(std::shared_ptr new_value) { - value.push_back(new_value); +std::string ArrayValue::get_num() { + std::stringstream ss; + ss << "{"; + if (!value.empty()) ss << value[0]->repr(); + for (int i{1}; i < value.size(); ++i) { + ss << ", " << value[i]->repr(); + } + ss << "}"; + std::string ret; + std::getline(ss, ret); + return ret; } +void ArrayValue::push_back(std::shared_ptr new_value) { value.push_back(new_value); } + std::shared_ptr ArrayValue::insert(int p, std::shared_ptr new_value) { - if (p < 1 || p > static_cast(value.size()) + 1) { - return std::make_shared( - VALUE_ERROR, "Index out of range, size: " + std::to_string(value.size()) + - ", position: " + std::to_string(p)); - } - value.insert(value.begin() + (p - 1), new_value); - return new_value; + if (p < 1 || p > static_cast(value.size()) + 1) { + return std::make_shared( + VALUE_ERROR, "Index out of range, size: " + std::to_string(value.size()) + + ", position: " + std::to_string(p)); + } + value.insert(value.begin() + (p - 1), new_value); + return new_value; } std::shared_ptr ArrayValue::remove(int p) { - if (p < 1 || p > static_cast(value.size())) { - return std::make_shared( - VALUE_ERROR, "Index out of range, size: " + std::to_string(value.size()) + - ", position: " + std::to_string(p)); - } - std::shared_ptr ret = value[p - 1]; - value.erase(value.begin() + (p - 1)); - return ret; + if (p < 1 || p > static_cast(value.size())) { + return std::make_shared( + VALUE_ERROR, "Index out of range, size: " + std::to_string(value.size()) + + ", position: " + std::to_string(p)); + } + std::shared_ptr ret = value[p - 1]; + value.erase(value.begin() + (p - 1)); + return ret; } std::shared_ptr ArrayValue::pop_back() { - if (value.empty()) - return std::make_shared(VALUE_ERROR, "Pop an empty array"); - std::shared_ptr ret = value.back(); - value.pop_back(); - return ret; + if (value.empty()) return std::make_shared(VALUE_ERROR, "Pop an empty array"); + std::shared_ptr ret = value.back(); + value.pop_back(); + return ret; } -std::shared_ptr &ArrayValue::operator[](int p) { - if (1 <= p && p <= value.size()) - return value[p - 1]; - error = std::make_shared( - VALUE_ERROR, "Index out of range, size: " + std::to_string(value.size()) + - ", position: " + std::to_string(p)); - return error; +std::shared_ptr& ArrayValue::operator[](int p) { + if (1 <= p && p <= value.size()) return value[p - 1]; + error = std::make_shared( + VALUE_ERROR, "Index out of range, size: " + std::to_string(value.size()) + + ", position: " + std::to_string(p)); + return error; } std::string HashTableValue::key_id(std::shared_ptr key) const { - if (key->get_type() == VALUE_ARRAY || key->get_type() == VALUE_INSTANCE || - key->get_type() == VALUE_STRUCT || key->get_type() == VALUE_HASH_TABLE || - key->get_type() == VALUE_ALGO) { - return key->get_type() + ":ptr:" + - std::to_string(reinterpret_cast(key.get())); - } - return key->get_type() + ":" + key->repr(); + if (key->get_type() == VALUE_ARRAY || key->get_type() == VALUE_INSTANCE || + key->get_type() == VALUE_STRUCT || key->get_type() == VALUE_HASH_TABLE || + key->get_type() == VALUE_ALGO) { + return key->get_type() + + ":ptr:" + std::to_string(reinterpret_cast(key.get())); + } + return key->get_type() + ":" + key->repr(); } std::string HashTableValue::get_num() { - std::stringstream ss; - ss << "{"; - if (!entries.empty()) { - ss << entries[0].key->repr() << ": " << entries[0].value->repr(); - } - for (size_t i = 1; i < entries.size(); ++i) { - ss << ", " << entries[i].key->repr() << ": " << entries[i].value->repr(); - } - ss << "}"; - return ss.str(); + std::stringstream ss; + ss << "{"; + if (!entries.empty()) { + ss << entries[0].key->repr() << ": " << entries[0].value->repr(); + } + for (size_t i = 1; i < entries.size(); ++i) { + ss << ", " << entries[i].key->repr() << ": " << entries[i].value->repr(); + } + ss << "}"; + return ss.str(); } std::shared_ptr HashTableValue::get(std::shared_ptr key) { - auto found = index.find(key_id(key)); - if (found == index.end()) { - return std::make_shared(); - } - return entries[found->second].value; + auto found = index.find(key_id(key)); + if (found == index.end()) { + return std::make_shared(); + } + return entries[found->second].value; } std::shared_ptr HashTableValue::set(std::shared_ptr key, std::shared_ptr value) { - std::string id = key_id(key); - auto found = index.find(id); - if (found != index.end()) { - entries[found->second].value = value; + std::string id = key_id(key); + auto found = index.find(id); + if (found != index.end()) { + entries[found->second].value = value; + return value; + } + index[id] = entries.size(); + entries.push_back({key, value}); return value; - } - index[id] = entries.size(); - entries.push_back({key, value}); - return value; } std::shared_ptr HashTableValue::remove(std::shared_ptr key) { - std::string id = key_id(key); - auto found = index.find(id); - if (found == index.end()) { - return std::make_shared(); - } + std::string id = key_id(key); + auto found = index.find(id); + if (found == index.end()) { + return std::make_shared(); + } - size_t removed = found->second; - std::shared_ptr value = entries[removed].value; - index.erase(found); - if (removed != entries.size() - 1) { - entries[removed] = entries.back(); - index[key_id(entries[removed].key)] = removed; - } - entries.pop_back(); - return value; + size_t removed = found->second; + std::shared_ptr value = entries[removed].value; + index.erase(found); + if (removed != entries.size() - 1) { + entries[removed] = entries.back(); + index[key_id(entries[removed].key)] = removed; + } + entries.pop_back(); + return value; } bool HashTableValue::contains(std::shared_ptr key) const { - return index.count(key_id(key)) != 0; + return index.count(key_id(key)) != 0; } std::shared_ptr HashTableValue::size() const { - return std::make_shared>(VALUE_INT, entries.size()); + return std::make_shared>(VALUE_INT, entries.size()); } std::shared_ptr HashTableValue::keys() const { - ValueList keys; - keys.reserve(entries.size()); - for (const Entry& entry : entries) { - keys.push_back(entry.key); - } - return std::make_shared(keys); + ValueList keys; + keys.reserve(entries.size()); + for (const Entry& entry : entries) { + keys.push_back(entry.key); + } + return std::make_shared(keys); } std::shared_ptr HashTableValue::values() const { - ValueList values; - values.reserve(entries.size()); - for (const Entry& entry : entries) { - values.push_back(entry.value); - } - return std::make_shared(values); + ValueList values; + values.reserve(entries.size()); + for (const Entry& entry : entries) { + values.push_back(entry.value); + } + return std::make_shared(values); } void HashTableValue::clear() { - entries.clear(); - index.clear(); + entries.clear(); + index.clear(); } -std::shared_ptr BaseAlgoValue::set_args(const NodeList &args, SymbolTable &sym, - Interpreter &interpreter) { - if (args.size() < arg_names.size()) { - return std::make_shared( - VALUE_ERROR, Color(0xFF, 0x39, 0x6E).get() + "Too few arguments" RESET); - } else if (args.size() > arg_names.size()) { - return std::make_shared(VALUE_ERROR, - Color(0xFF, 0x39, 0x6E).get() + - "Too many arguments" RESET); - } - - for (int i = 0; i < args.size(); ++i) { - std::shared_ptr v = interpreter.visit(args[i]); - if (v->get_type() == VALUE_ERROR) - return v; - sym.set(arg_names[i], v); - } - static std::shared_ptr none = std::make_shared(); - return none; +std::shared_ptr BaseAlgoValue::set_args(const NodeList& args, SymbolTable& sym, + Interpreter& interpreter) { + if (args.size() < arg_names.size()) { + return std::make_shared( + VALUE_ERROR, Color(0xFF, 0x39, 0x6E).get() + "Too few arguments" RESET); + } else if (args.size() > arg_names.size()) { + return std::make_shared( + VALUE_ERROR, Color(0xFF, 0x39, 0x6E).get() + "Too many arguments" RESET); + } + + for (int i = 0; i < args.size(); ++i) { + std::shared_ptr v = interpreter.visit(args[i]); + if (v->get_type() == VALUE_ERROR) return v; + sym.set(arg_names[i], v); + } + static std::shared_ptr none = std::make_shared(); + return none; } class ScopeCleaner { -public: + public: ScopeCleaner(SymbolTable& _sym) : sym(_sym) {} ~ScopeCleaner() { if (!sym.has_instances()) { @@ -291,134 +292,117 @@ class ScopeCleaner { std::shared_ptr self_ptr = val; std::shared_ptr dtor = inst->get_member("destructor", self_ptr); if (dtor->get_type() == VALUE_ALGO) { - dtor->execute({}, sym.get_parent()); + dtor->execute({}, sym.get_parent()); } } } } } -private: + + private: SymbolTable& sym; }; namespace { -bool is_pure_numeric_node(const std::shared_ptr& node, - const std::string& algo_name, +bool is_pure_numeric_node(const std::shared_ptr& node, const std::string& algo_name, const std::unordered_set& arg_names) { - if (!node) - return false; + if (!node) return false; - const std::string type = node->get_type(); - if (type == NODE_VALUE) { - const std::string token_type = node->get_tok()->get_type(); - return token_type == TOKEN_INT || token_type == TOKEN_FLOAT; - } - if (type == NODE_VARACCESS) { - return arg_names.count(node->get_name()) != 0; - } - if (type == NODE_BINOP) { - NodeList child = node->get_child(); - return child.size() == 2 && - is_pure_numeric_node(child[0], algo_name, arg_names) && - is_pure_numeric_node(child[1], algo_name, arg_names); - } - if (type == NODE_UNARYOP) { - NodeList child = node->get_child(); - return child.size() == 1 && - is_pure_numeric_node(child[0], algo_name, arg_names); - } - if (type == NODE_RETURN) { - NodeList child = node->get_child(); - return child.size() == 1 && - is_pure_numeric_node(child[0], algo_name, arg_names); - } - if (type == NODE_IF) { - IfNode* if_node = dynamic_cast(node.get()); - if (!is_pure_numeric_node(if_node->get_condition(), algo_name, arg_names)) - return false; - for (const auto& expr : if_node->get_expr()) { - if (!is_pure_numeric_node(expr, algo_name, arg_names)) - return false; + const std::string type = node->get_type(); + if (type == NODE_VALUE) { + const std::string token_type = node->get_tok()->get_type(); + return token_type == TOKEN_INT || token_type == TOKEN_FLOAT; } - for (const auto& expr : if_node->get_else()) { - if (!is_pure_numeric_node(expr, algo_name, arg_names)) - return false; + if (type == NODE_VARACCESS) { + return arg_names.count(node->get_name()) != 0; } - return true; - } - if (type == NODE_ALGOCALL) { - AlgorithmCallNode* call_node = dynamic_cast(node.get()); - if (call_node->get_call()->get_type() != NODE_VARACCESS || - call_node->get_name() != algo_name) { - return false; - } - for (const auto& arg : call_node->get_args()) { - if (!is_pure_numeric_node(arg, algo_name, arg_names)) - return false; + if (type == NODE_BINOP) { + NodeList child = node->get_child(); + return child.size() == 2 && is_pure_numeric_node(child[0], algo_name, arg_names) && + is_pure_numeric_node(child[1], algo_name, arg_names); + } + if (type == NODE_UNARYOP) { + NodeList child = node->get_child(); + return child.size() == 1 && is_pure_numeric_node(child[0], algo_name, arg_names); + } + if (type == NODE_RETURN) { + NodeList child = node->get_child(); + return child.size() == 1 && is_pure_numeric_node(child[0], algo_name, arg_names); + } + if (type == NODE_IF) { + IfNode* if_node = dynamic_cast(node.get()); + if (!is_pure_numeric_node(if_node->get_condition(), algo_name, arg_names)) return false; + for (const auto& expr : if_node->get_expr()) { + if (!is_pure_numeric_node(expr, algo_name, arg_names)) return false; + } + for (const auto& expr : if_node->get_else()) { + if (!is_pure_numeric_node(expr, algo_name, arg_names)) return false; + } + return true; + } + if (type == NODE_ALGOCALL) { + AlgorithmCallNode* call_node = dynamic_cast(node.get()); + if (call_node->get_call()->get_type() != NODE_VARACCESS || + call_node->get_name() != algo_name) { + return false; + } + for (const auto& arg : call_node->get_args()) { + if (!is_pure_numeric_node(arg, algo_name, arg_names)) return false; + } + return true; } - return true; - } - return false; + return false; } bool has_self_call(const std::shared_ptr& node, const std::string& algo_name) { - if (!node) - return false; + if (!node) return false; - if (node->get_type() == NODE_ALGOCALL) { - AlgorithmCallNode* call_node = dynamic_cast(node.get()); - if (call_node->get_call()->get_type() == NODE_VARACCESS && - call_node->get_name() == algo_name) { - return true; - } - for (const auto& arg : call_node->get_args()) { - if (has_self_call(arg, algo_name)) - return true; + if (node->get_type() == NODE_ALGOCALL) { + AlgorithmCallNode* call_node = dynamic_cast(node.get()); + if (call_node->get_call()->get_type() == NODE_VARACCESS && + call_node->get_name() == algo_name) { + return true; + } + for (const auto& arg : call_node->get_args()) { + if (has_self_call(arg, algo_name)) return true; + } + return false; } - return false; - } - - if (node->get_type() == NODE_IF) { - IfNode* if_node = dynamic_cast(node.get()); - if (has_self_call(if_node->get_condition(), algo_name)) - return true; - for (const auto& expr : if_node->get_expr()) { - if (has_self_call(expr, algo_name)) - return true; + + if (node->get_type() == NODE_IF) { + IfNode* if_node = dynamic_cast(node.get()); + if (has_self_call(if_node->get_condition(), algo_name)) return true; + for (const auto& expr : if_node->get_expr()) { + if (has_self_call(expr, algo_name)) return true; + } + for (const auto& expr : if_node->get_else()) { + if (has_self_call(expr, algo_name)) return true; + } + return false; } - for (const auto& expr : if_node->get_else()) { - if (has_self_call(expr, algo_name)) - return true; + + for (const auto& child : node->get_child()) { + if (has_self_call(child, algo_name)) return true; } return false; - } - - for (const auto& child : node->get_child()) { - if (has_self_call(child, algo_name)) - return true; - } - return false; } -} // namespace +} // namespace -bool is_memoizable_numeric_algo(const std::shared_ptr& node, - const std::string& algo_name, +bool is_memoizable_numeric_algo(const std::shared_ptr& node, const std::string& algo_name, const std::vector& args) { - AlgorithmDefNode* algo_node = dynamic_cast(node.get()); - if (!algo_node || args.empty()) - return false; - - bool recursive = false; - std::unordered_set arg_set(args.begin(), args.end()); - for (const auto& expr : algo_node->get_body()) { - if (!is_pure_numeric_node(expr, algo_name, arg_set)) - return false; - recursive = recursive || has_self_call(expr, algo_name); - } - return recursive; + AlgorithmDefNode* algo_node = dynamic_cast(node.get()); + if (!algo_node || args.empty()) return false; + + bool recursive = false; + std::unordered_set arg_set(args.begin(), args.end()); + for (const auto& expr : algo_node->get_body()) { + if (!is_pure_numeric_node(expr, algo_name, arg_set)) return false; + recursive = recursive || has_self_call(expr, algo_name); + } + return recursive; } namespace { @@ -426,784 +410,692 @@ namespace { std::shared_ptr single_return_numeric_expr(const std::shared_ptr& node, const std::string& algo_name, const std::vector& args) { - AlgorithmDefNode* algo_node = dynamic_cast(node.get()); - if (!algo_node || algo_node->get_body().size() != 1) - return nullptr; + AlgorithmDefNode* algo_node = dynamic_cast(node.get()); + if (!algo_node || algo_node->get_body().size() != 1) return nullptr; - std::shared_ptr ret = algo_node->get_body()[0]; - if (ret->get_type() != NODE_RETURN || has_self_call(ret, algo_name)) - return nullptr; + std::shared_ptr ret = algo_node->get_body()[0]; + if (ret->get_type() != NODE_RETURN || has_self_call(ret, algo_name)) return nullptr; - NodeList child = ret->get_child(); - if (child.size() != 1) - return nullptr; + NodeList child = ret->get_child(); + if (child.size() != 1) return nullptr; - std::unordered_set arg_set(args.begin(), args.end()); - if (!is_pure_numeric_node(child[0], algo_name, arg_set)) - return nullptr; - return child[0]; + std::unordered_set arg_set(args.begin(), args.end()); + if (!is_pure_numeric_node(child[0], algo_name, arg_set)) return nullptr; + return child[0]; } std::string numeric_cache_key(const ValueList& values) { - std::string key; - for (const auto& value : values) { - if (value->get_type() != VALUE_INT && value->get_type() != VALUE_FLOAT) - return ""; - key += value->get_type(); - key += ':'; - key += value->get_num(); - key += '|'; - } - return key; -} - -} // namespace - -std::shared_ptr AlgoValue::execute(const NodeList& args, SymbolTable *parent) { - static std::unordered_map memoizable_by_node; - static std::unordered_map>> memoized_results; - static std::unordered_map single_return_jit; - static std::unordered_set single_return_jit_disabled; - - SymbolTable sym(parent); - ScopeCleaner cleaner(sym); - Interpreter interpreter(sym); - const std::size_t node_id = value->get_id(); - auto memoizable_found = memoizable_by_node.find(node_id); - if (memoizable_found == memoizable_by_node.end()) { - memoizable_found = memoizable_by_node.emplace( - node_id, is_memoizable_numeric_algo(value, algo_name, arg_names)).first; - } - - if (memoizable_found->second) { - if (args.size() < arg_names.size()) { - return std::make_shared( - VALUE_ERROR, Color(0xFF, 0x39, 0x6E).get() + "Too few arguments" RESET); - } else if (args.size() > arg_names.size()) { - return std::make_shared(VALUE_ERROR, - Color(0xFF, 0x39, 0x6E).get() + - "Too many arguments" RESET); + std::string key; + for (const auto& value : values) { + if (value->get_type() != VALUE_INT && value->get_type() != VALUE_FLOAT) return ""; + key += value->get_type(); + key += ':'; + key += value->get_num(); + key += '|'; } + return key; +} - ValueList evaluated_args; - evaluated_args.reserve(args.size()); - for (int i = 0; i < args.size(); ++i) { - std::shared_ptr arg = interpreter.visit(args[i]); - if (arg->get_type() == VALUE_ERROR) - return arg; - evaluated_args.push_back(arg); - } - - const std::string cache_key = numeric_cache_key(evaluated_args); - if (!cache_key.empty()) { - auto& cache = memoized_results[node_id]; - auto cached = cache.find(cache_key); - if (cached != cache.end()) { - return cached->second; - } - - for (int i = 0; i < evaluated_args.size(); ++i) { - sym.set(arg_names[i], evaluated_args[i]); - } - - AlgorithmDefNode* algo_node = dynamic_cast(value.get()); - const NodeList& algo_body = algo_node->get_body(); - std::shared_ptr ret = std::make_shared(); - for (int i = 0; i < algo_body.size(); ++i) { - ret = interpreter.visit(algo_body[i]); - if (ret->get_type() == VALUE_RETURN) { - ret = dynamic_cast(ret.get())->get_value(); - break; +} // namespace + +std::shared_ptr AlgoValue::execute(const NodeList& args, SymbolTable* parent) { + static std::unordered_map memoizable_by_node; + static std::unordered_map>> + memoized_results; + static std::unordered_map single_return_jit; + static std::unordered_set single_return_jit_disabled; + + SymbolTable sym(parent); + ScopeCleaner cleaner(sym); + Interpreter interpreter(sym); + const std::size_t node_id = value->get_id(); + auto memoizable_found = memoizable_by_node.find(node_id); + if (memoizable_found == memoizable_by_node.end()) { + memoizable_found = + memoizable_by_node + .emplace(node_id, is_memoizable_numeric_algo(value, algo_name, arg_names)) + .first; + } + + if (memoizable_found->second) { + if (args.size() < arg_names.size()) { + return std::make_shared( + VALUE_ERROR, Color(0xFF, 0x39, 0x6E).get() + "Too few arguments" RESET); + } else if (args.size() > arg_names.size()) { + return std::make_shared( + VALUE_ERROR, Color(0xFF, 0x39, 0x6E).get() + "Too many arguments" RESET); } - if (ret->get_type() == VALUE_ERROR) { - return ret; + + ValueList evaluated_args; + evaluated_args.reserve(args.size()); + for (int i = 0; i < args.size(); ++i) { + std::shared_ptr arg = interpreter.visit(args[i]); + if (arg->get_type() == VALUE_ERROR) return arg; + evaluated_args.push_back(arg); } - } - if (ret->get_type() == VALUE_INT || ret->get_type() == VALUE_FLOAT) { - cache[cache_key] = ret; - } - return ret; - } - } - std::shared_ptr ret{set_args(args, sym, interpreter)}; - if (ret->get_type() == VALUE_ERROR) - return ret; + const std::string cache_key = numeric_cache_key(evaluated_args); + if (!cache_key.empty()) { + auto& cache = memoized_results[node_id]; + auto cached = cache.find(cache_key); + if (cached != cache.end()) { + return cached->second; + } + + for (int i = 0; i < evaluated_args.size(); ++i) { + sym.set(arg_names[i], evaluated_args[i]); + } - if (!single_return_jit_disabled.count(node_id)) { - auto compiled = single_return_jit.find(node_id); - if (compiled == single_return_jit.end()) { - std::shared_ptr return_expr = - single_return_numeric_expr(value, algo_name, arg_names); - if (return_expr) { - std::optional program = ExpressionJit::compile(return_expr); - if (program) { - compiled = single_return_jit.emplace(node_id, std::move(*program)).first; - } else { - single_return_jit_disabled.insert(node_id); + AlgorithmDefNode* algo_node = dynamic_cast(value.get()); + const NodeList& algo_body = algo_node->get_body(); + std::shared_ptr ret = std::make_shared(); + for (int i = 0; i < algo_body.size(); ++i) { + ret = interpreter.visit(algo_body[i]); + if (ret->get_type() == VALUE_RETURN) { + ret = dynamic_cast(ret.get())->get_value(); + break; + } + if (ret->get_type() == VALUE_ERROR) { + return ret; + } + } + if (ret->get_type() == VALUE_INT || ret->get_type() == VALUE_FLOAT) { + cache[cache_key] = ret; + } + return ret; } - } else { - single_return_jit_disabled.insert(node_id); - } } - if (compiled != single_return_jit.end()) { - std::optional> jit_result = compiled->second.execute(sym); - if (jit_result) { - return *jit_result; - } + + std::shared_ptr ret{set_args(args, sym, interpreter)}; + if (ret->get_type() == VALUE_ERROR) return ret; + + if (!single_return_jit_disabled.count(node_id)) { + auto compiled = single_return_jit.find(node_id); + if (compiled == single_return_jit.end()) { + std::shared_ptr return_expr = + single_return_numeric_expr(value, algo_name, arg_names); + if (return_expr) { + std::optional program = ExpressionJit::compile(return_expr); + if (program) { + compiled = single_return_jit.emplace(node_id, std::move(*program)).first; + } else { + single_return_jit_disabled.insert(node_id); + } + } else { + single_return_jit_disabled.insert(node_id); + } + } + if (compiled != single_return_jit.end()) { + std::optional> jit_result = compiled->second.execute(sym); + if (jit_result) { + return *jit_result; + } + } } - } - AlgorithmDefNode* algo_node = dynamic_cast(value.get()); - const NodeList& algo_body = algo_node->get_body(); + AlgorithmDefNode* algo_node = dynamic_cast(value.get()); + const NodeList& algo_body = algo_node->get_body(); - for (int i = 0; i < algo_body.size(); ++i) { - ret = interpreter.visit(algo_body[i]); - if (ret->get_type() == VALUE_RETURN) { - return dynamic_cast(ret.get())->get_value(); + for (int i = 0; i < algo_body.size(); ++i) { + ret = interpreter.visit(algo_body[i]); + if (ret->get_type() == VALUE_RETURN) { + return dynamic_cast(ret.get())->get_value(); + } } - } - return ret; + return ret; } -std::shared_ptr BuiltinAlgoValue::execute(const NodeList& args, - SymbolTable *parent) { - SymbolTable sym(parent); - ScopeCleaner cleaner(sym); - Interpreter interpreter(sym); - if (algo_name == "print") { - std::string output; - for (int i = 0; i < args.size(); ++i) { - std::shared_ptr arg = interpreter.visit(args[i]); - if (arg->get_type() == VALUE_ERROR) - return arg; - if (i > 0) - output += " "; - output += arg->get_num(); - } - return execute_print(output); - } - - std::shared_ptr ret{set_args(args, sym, interpreter)}; - if (ret->get_type() == VALUE_ERROR) - return ret; - if (algo_name == "read") { - return execute_read(); - } else if (algo_name == "read_line") { - return execute_read_line(); - } else if (algo_name == "open") { - return std::make_shared(VALUE_ERROR, "Not found!"); - } else if (algo_name == "clear") { - return execute_clear(); - } else if (algo_name == "quit") { - exit(0); - } else if (algo_name == "int") { - return execute_int(sym.get(arg_names[0])->get_num()); - } else if (algo_name == "float") { - return execute_float(sym.get(arg_names[0])->get_num()); - } else if (algo_name == "string") { - return execute_string(sym.get(arg_names[0])->get_num()); - } else if (algo_name == "HashTable") { - return std::make_shared(); - } - return ret; -} - -std::shared_ptr BoundMethodValue::execute(const NodeList& args, - SymbolTable *parent) { - if (obj->get_type() == VALUE_ARRAY) { - ArrayValue *arr_obj = dynamic_cast(obj.get()); +std::shared_ptr BuiltinAlgoValue::execute(const NodeList& args, SymbolTable* parent) { SymbolTable sym(parent); + ScopeCleaner cleaner(sym); Interpreter interpreter(sym); + if (algo_name == "print") { + std::string output; + for (int i = 0; i < args.size(); ++i) { + std::shared_ptr arg = interpreter.visit(args[i]); + if (arg->get_type() == VALUE_ERROR) return arg; + if (i > 0) output += " "; + output += arg->get_num(); + } + return execute_print(output); + } - if (method_name == "push" || method_name == "push_back") { - if (args.size() != 1) { - return std::make_shared( - VALUE_ERROR, "Expect one argument for " + method_name + "\n"); - } - std::shared_ptr arg = interpreter.visit(args[0]); - if (arg->get_type() == VALUE_ERROR) - return arg; - arr_obj->push_back(arg); - return arr_obj->back(); - } else if (method_name == "pop" || method_name == "pop_back") { - if (!args.empty()) { - return std::make_shared( - VALUE_ERROR, "Expect zero argument for " + method_name + "\n"); - } - if (arr_obj->size()->get_num() == "0") { - std::cout << "Cannot " << method_name << " from an empty array\n"; - return std::make_shared(); - } - return arr_obj->pop_back(); - } else if (method_name == "resize") { - if (args.size() != 1) { - return std::make_shared(VALUE_ERROR, - "Expect one argument for resize\n"); - } - std::shared_ptr new_size_val = interpreter.visit(args[0]); - if (new_size_val->get_type() == VALUE_ERROR) - return new_size_val; - if (new_size_val->get_type() != VALUE_INT) { - std::cout << "Argument for resize must be an integer\n"; - return std::make_shared(); - } - long long new_size; - try { - new_size = new_size_val->as_int(); - } catch (const std::out_of_range &oor) { - std::cout << "Resize argument out of range\n"; - return std::make_shared(); - } - if (new_size < 0) { - std::cout << "Resize argument cannot be negative\n"; - return std::make_shared(); - } - arr_obj->resize(static_cast(new_size)); - return obj; - } else if (method_name == "insert") { - if (args.size() != 2) { - return std::make_shared(VALUE_ERROR, - "Expect two arguments for insert\n"); - } - std::shared_ptr index = interpreter.visit(args[0]); - if (index->get_type() == VALUE_ERROR) - return index; - std::shared_ptr value = interpreter.visit(args[1]); - if (value->get_type() == VALUE_ERROR) - return value; - return arr_obj->insert(index->as_int(), value); - } else if (method_name == "remove") { - if (args.size() != 1) { - return std::make_shared(VALUE_ERROR, - "Expect one argument for remove\n"); - } - std::shared_ptr index = interpreter.visit(args[0]); - if (index->get_type() == VALUE_ERROR) - return index; - return arr_obj->remove(index->as_int()); - } else if (method_name == "size") { - if (!args.empty()) { - return std::make_shared(VALUE_ERROR, - "Expect zero argument for size\n"); - } - return arr_obj->size(); - } else if (method_name == "back") { - if (!args.empty()) { - return std::make_shared(VALUE_ERROR, - "Expect zero arguments for back\n"); - } - if (arr_obj->size()->get_num() == "0") { - return std::make_shared( - VALUE_ERROR, "Cannot call back on an empty array\n"); - } - return arr_obj->back(); + std::shared_ptr ret{set_args(args, sym, interpreter)}; + if (ret->get_type() == VALUE_ERROR) return ret; + if (algo_name == "read") { + return execute_read(); + } else if (algo_name == "read_line") { + return execute_read_line(); + } else if (algo_name == "open") { + return std::make_shared(VALUE_ERROR, "Not found!"); + } else if (algo_name == "clear") { + return execute_clear(); + } else if (algo_name == "quit") { + exit(0); + } else if (algo_name == "int") { + return execute_int(sym.get(arg_names[0])->get_num()); + } else if (algo_name == "float") { + return execute_float(sym.get(arg_names[0])->get_num()); + } else if (algo_name == "string") { + return execute_string(sym.get(arg_names[0])->get_num()); + } else if (algo_name == "HashTable") { + return std::make_shared(); } - } else if (obj->get_type() == VALUE_STRING) { - if (method_name == "size") { - if (!args.empty()) { - return std::make_shared(VALUE_ERROR, - "Expect zero argument for size\n"); - } - return std::make_shared>( - VALUE_INT, static_cast(obj->as_string().size())); + return ret; +} + +std::shared_ptr BoundMethodValue::execute(const NodeList& args, SymbolTable* parent) { + if (obj->get_type() == VALUE_ARRAY) { + ArrayValue* arr_obj = dynamic_cast(obj.get()); + SymbolTable sym(parent); + Interpreter interpreter(sym); + + if (method_name == "push" || method_name == "push_back") { + if (args.size() != 1) { + return std::make_shared( + VALUE_ERROR, "Expect one argument for " + method_name + "\n"); + } + std::shared_ptr arg = interpreter.visit(args[0]); + if (arg->get_type() == VALUE_ERROR) return arg; + arr_obj->push_back(arg); + return arr_obj->back(); + } else if (method_name == "pop" || method_name == "pop_back") { + if (!args.empty()) { + return std::make_shared( + VALUE_ERROR, "Expect zero argument for " + method_name + "\n"); + } + if (arr_obj->size()->get_num() == "0") { + std::cout << "Cannot " << method_name << " from an empty array\n"; + return std::make_shared(); + } + return arr_obj->pop_back(); + } else if (method_name == "resize") { + if (args.size() != 1) { + return std::make_shared(VALUE_ERROR, + "Expect one argument for resize\n"); + } + std::shared_ptr new_size_val = interpreter.visit(args[0]); + if (new_size_val->get_type() == VALUE_ERROR) return new_size_val; + if (new_size_val->get_type() != VALUE_INT) { + std::cout << "Argument for resize must be an integer\n"; + return std::make_shared(); + } + long long new_size; + try { + new_size = new_size_val->as_int(); + } catch (const std::out_of_range& oor) { + std::cout << "Resize argument out of range\n"; + return std::make_shared(); + } + if (new_size < 0) { + std::cout << "Resize argument cannot be negative\n"; + return std::make_shared(); + } + arr_obj->resize(static_cast(new_size)); + return obj; + } else if (method_name == "insert") { + if (args.size() != 2) { + return std::make_shared(VALUE_ERROR, + "Expect two arguments for insert\n"); + } + std::shared_ptr index = interpreter.visit(args[0]); + if (index->get_type() == VALUE_ERROR) return index; + std::shared_ptr value = interpreter.visit(args[1]); + if (value->get_type() == VALUE_ERROR) return value; + return arr_obj->insert(index->as_int(), value); + } else if (method_name == "remove") { + if (args.size() != 1) { + return std::make_shared(VALUE_ERROR, + "Expect one argument for remove\n"); + } + std::shared_ptr index = interpreter.visit(args[0]); + if (index->get_type() == VALUE_ERROR) return index; + return arr_obj->remove(index->as_int()); + } else if (method_name == "size") { + if (!args.empty()) { + return std::make_shared(VALUE_ERROR, "Expect zero argument for size\n"); + } + return arr_obj->size(); + } else if (method_name == "back") { + if (!args.empty()) { + return std::make_shared(VALUE_ERROR, + "Expect zero arguments for back\n"); + } + if (arr_obj->size()->get_num() == "0") { + return std::make_shared(VALUE_ERROR, + "Cannot call back on an empty array\n"); + } + return arr_obj->back(); + } + } else if (obj->get_type() == VALUE_STRING) { + if (method_name == "size") { + if (!args.empty()) { + return std::make_shared(VALUE_ERROR, "Expect zero argument for size\n"); + } + return std::make_shared>( + VALUE_INT, static_cast(obj->as_string().size())); + } + } else if (obj->get_type() == VALUE_HASH_TABLE) { + HashTableValue* table_obj = dynamic_cast(obj.get()); + SymbolTable sym(parent); + Interpreter interpreter(sym); + + if (method_name == "set") { + if (args.size() != 2) { + return std::make_shared(VALUE_ERROR, "Expect two arguments for set\n"); + } + std::shared_ptr key = interpreter.visit(args[0]); + if (key->get_type() == VALUE_ERROR) return key; + std::shared_ptr value = interpreter.visit(args[1]); + if (value->get_type() == VALUE_ERROR) return value; + return table_obj->set(key, value); + } else if (method_name == "get") { + if (args.size() != 1) { + return std::make_shared(VALUE_ERROR, "Expect one argument for get\n"); + } + std::shared_ptr key = interpreter.visit(args[0]); + if (key->get_type() == VALUE_ERROR) return key; + return table_obj->get(key); + } else if (method_name == "contains") { + if (args.size() != 1) { + return std::make_shared(VALUE_ERROR, + "Expect one argument for contains\n"); + } + std::shared_ptr key = interpreter.visit(args[0]); + if (key->get_type() == VALUE_ERROR) return key; + return std::make_shared>(VALUE_INT, table_obj->contains(key)); + } else if (method_name == "remove") { + if (args.size() != 1) { + return std::make_shared(VALUE_ERROR, + "Expect one argument for remove\n"); + } + std::shared_ptr key = interpreter.visit(args[0]); + if (key->get_type() == VALUE_ERROR) return key; + return table_obj->remove(key); + } else if (method_name == "size") { + if (!args.empty()) { + return std::make_shared(VALUE_ERROR, "Expect zero argument for size\n"); + } + return table_obj->size(); + } else if (method_name == "is_empty") { + if (!args.empty()) { + return std::make_shared(VALUE_ERROR, + "Expect zero argument for is_empty\n"); + } + return std::make_shared>(VALUE_INT, + table_obj->size()->as_int() == 0); + } else if (method_name == "keys") { + if (!args.empty()) { + return std::make_shared(VALUE_ERROR, "Expect zero argument for keys\n"); + } + return table_obj->keys(); + } else if (method_name == "values") { + if (!args.empty()) { + return std::make_shared(VALUE_ERROR, + "Expect zero argument for values\n"); + } + return table_obj->values(); + } else if (method_name == "clear") { + if (!args.empty()) { + return std::make_shared(VALUE_ERROR, + "Expect zero argument for clear\n"); + } + table_obj->clear(); + return obj; + } + } else if (obj->get_type() == VALUE_INSTANCE) { + InstanceValue* inst_obj = dynamic_cast(obj.get()); + // Find method + if (inst_obj->struct_def->methods.count(method_name)) { + std::shared_ptr method = inst_obj->struct_def->methods[method_name]; + // method is likely AlgoValue. + // We need to execute it with 'self' in scope. + // We can use the existing AlgoValue::execute, but we need to inject + // 'self'. Since AlgoValue::execute creates a new symbol table, we can't + // inject it easily from outside *before* it starts unless we modify it or + // subclass it. However, we can create a new AlgoValue or wrapper that + // injects 'self'. + + // Actually, let's copy the logic of AlgoValue::execute here but add self. + AlgoValue* algo_val = dynamic_cast(method.get()); + if (!algo_val) + return std::make_shared(VALUE_ERROR, "Method is not an algorithm"); + + SymbolTable sym(parent); + ScopeCleaner cleaner(sym); + Interpreter interpreter(sym); + + // Set self + sym.set("self", obj); + + std::shared_ptr ret{algo_val->set_args(args, sym, interpreter)}; + if (ret->get_type() == VALUE_ERROR) return ret; + + // Execute body + AlgorithmDefNode* algo_node = + dynamic_cast(algo_val->get_node_ptr().get()); + const NodeList& algo_body = algo_node->get_body(); + + std::shared_ptr res = ret; + for (int i = 0; i < algo_body.size(); ++i) { + res = interpreter.visit(algo_body[i]); + if (res->get_type() == VALUE_ERROR) return res; + if (res->get_type() == VALUE_RETURN) + return dynamic_cast(res.get())->get_value(); + } + return res; + } } - } else if (obj->get_type() == VALUE_HASH_TABLE) { - HashTableValue *table_obj = dynamic_cast(obj.get()); - SymbolTable sym(parent); - Interpreter interpreter(sym); + return std::make_shared( + VALUE_ERROR, "Unknown member or invalid object for " + method_name + "\n"); +} - if (method_name == "set") { - if (args.size() != 2) { - return std::make_shared(VALUE_ERROR, - "Expect two arguments for set\n"); - } - std::shared_ptr key = interpreter.visit(args[0]); - if (key->get_type() == VALUE_ERROR) - return key; - std::shared_ptr value = interpreter.visit(args[1]); - if (value->get_type() == VALUE_ERROR) - return value; - return table_obj->set(key, value); - } else if (method_name == "get") { - if (args.size() != 1) { - return std::make_shared(VALUE_ERROR, - "Expect one argument for get\n"); - } - std::shared_ptr key = interpreter.visit(args[0]); - if (key->get_type() == VALUE_ERROR) - return key; - return table_obj->get(key); - } else if (method_name == "contains") { - if (args.size() != 1) { - return std::make_shared( - VALUE_ERROR, "Expect one argument for contains\n"); - } - std::shared_ptr key = interpreter.visit(args[0]); - if (key->get_type() == VALUE_ERROR) - return key; - return std::make_shared>(VALUE_INT, - table_obj->contains(key)); - } else if (method_name == "remove") { - if (args.size() != 1) { - return std::make_shared(VALUE_ERROR, - "Expect one argument for remove\n"); - } - std::shared_ptr key = interpreter.visit(args[0]); - if (key->get_type() == VALUE_ERROR) - return key; - return table_obj->remove(key); - } else if (method_name == "size") { - if (!args.empty()) { - return std::make_shared(VALUE_ERROR, - "Expect zero argument for size\n"); - } - return table_obj->size(); - } else if (method_name == "is_empty") { - if (!args.empty()) { - return std::make_shared( - VALUE_ERROR, "Expect zero argument for is_empty\n"); - } - return std::make_shared>( - VALUE_INT, table_obj->size()->as_int() == 0); - } else if (method_name == "keys") { - if (!args.empty()) { - return std::make_shared(VALUE_ERROR, - "Expect zero argument for keys\n"); - } - return table_obj->keys(); - } else if (method_name == "values") { - if (!args.empty()) { - return std::make_shared(VALUE_ERROR, - "Expect zero argument for values\n"); - } - return table_obj->values(); - } else if (method_name == "clear") { - if (!args.empty()) { - return std::make_shared(VALUE_ERROR, - "Expect zero argument for clear\n"); - } - table_obj->clear(); - return obj; - } - } else if (obj->get_type() == VALUE_INSTANCE) { - InstanceValue *inst_obj = dynamic_cast(obj.get()); - // Find method - if (inst_obj->struct_def->methods.count(method_name)) { - std::shared_ptr method = - inst_obj->struct_def->methods[method_name]; - // method is likely AlgoValue. - // We need to execute it with 'self' in scope. - // We can use the existing AlgoValue::execute, but we need to inject - // 'self'. Since AlgoValue::execute creates a new symbol table, we can't - // inject it easily from outside *before* it starts unless we modify it or - // subclass it. However, we can create a new AlgoValue or wrapper that - // injects 'self'. - - // Actually, let's copy the logic of AlgoValue::execute here but add self. - AlgoValue *algo_val = dynamic_cast(method.get()); - if (!algo_val) - return std::make_shared(VALUE_ERROR, - "Method is not an algorithm"); +std::shared_ptr BuiltinAlgoValue::execute_print(const std::string& str) { + std::cout << str << "\n"; + return std::make_shared(); +} - SymbolTable sym(parent); - ScopeCleaner cleaner(sym); - Interpreter interpreter(sym); +std::shared_ptr BuiltinAlgoValue::execute_read() { + std::string ret; + std::cin >> ret; + std::cin.ignore(); + return std::make_shared>(VALUE_STRING, ret); +} - // Set self - sym.set("self", obj); +std::shared_ptr BuiltinAlgoValue::execute_read_line() { + std::string ret; + std::getline(std::cin, ret); + return std::make_shared>(VALUE_STRING, ret); +} - std::shared_ptr ret{algo_val->set_args(args, sym, interpreter)}; - if (ret->get_type() == VALUE_ERROR) - return ret; +std::shared_ptr BuiltinAlgoValue::execute_clear() { + std::system("clear"); + return std::make_shared(); +} - // Execute body - AlgorithmDefNode* algo_node = dynamic_cast(algo_val->get_node_ptr().get()); - const NodeList& algo_body = algo_node->get_body(); +std::shared_ptr BuiltinAlgoValue::execute_int(const std::string& str) { + if (str[0] != '-' && !std::isdigit(str[0])) { + return std::make_shared(VALUE_ERROR, + "Cannot convert \"" + str + "\" to an int"); + } + for (int i{1}; i < str.size(); ++i) + if (!std::isdigit(str[0])) + return std::make_shared(VALUE_ERROR, + "Cannot convert \"" + str + "\" to an int"); + return std::make_shared>(VALUE_INT, std::stoll(str)); +} - std::shared_ptr res = ret; - for (int i = 0; i < algo_body.size(); ++i) { - res = interpreter.visit(algo_body[i]); - if (res->get_type() == VALUE_ERROR) - return res; - if (res->get_type() == VALUE_RETURN) - return dynamic_cast(res.get())->get_value(); - } - return res; +std::shared_ptr BuiltinAlgoValue::execute_float(const std::string& str) { + int point{0}; + if (str[0] != '-' && !std::isdigit(str[0])) { + return std::make_shared(VALUE_ERROR, + "Cannot convert \"" + str + "\" to an int"); } - } - return std::make_shared(VALUE_ERROR, - "Unknown member or invalid object for " + - method_name + "\n"); + for (int i{1}; i < str.size(); ++i) { + if (!std::isdigit(str[0]) && (str[0] != '.' || point == 1)) { + return std::make_shared(VALUE_ERROR, + "Cannot convert \"" + str + "\" to an int"); + } + if (str[0] == '.') point++; + } + return std::make_shared>(VALUE_FLOAT, std::stod(str)); } -std::shared_ptr BuiltinAlgoValue::execute_print(const std::string &str) { - std::cout << str << "\n"; - return std::make_shared(); +std::shared_ptr BuiltinAlgoValue::execute_string(const std::string& str) { + return std::make_shared>(VALUE_STRING, str); } -std::shared_ptr BuiltinAlgoValue::execute_read() { - std::string ret; - std::cin >> ret; - std::cin.ignore(); - return std::make_shared>(VALUE_STRING, ret); +std::shared_ptr operator+(std::shared_ptr a, std::shared_ptr b) { + if (a->get_type() == VALUE_FLOAT || b->get_type() == VALUE_FLOAT) + return std::make_shared>(VALUE_FLOAT, a->as_double() + b->as_double()); + else if (a->get_type() == VALUE_INT && b->get_type() == VALUE_INT) + return std::make_shared>(VALUE_INT, a->as_int() + b->as_int()); + else if (a->get_type() == VALUE_STRING && b->get_type() == VALUE_STRING) + return std::make_shared>(VALUE_STRING, + a->as_string() + b->as_string()); + else + return std::make_shared(VALUE_ERROR, + Color(0xFF, 0x39, 0x6E).get() + + "Runtime ERROR: ADD operation can only apply on " + "number or two string\n" RESET); } -std::shared_ptr BuiltinAlgoValue::execute_read_line() { - std::string ret; - std::getline(std::cin, ret); - return std::make_shared>(VALUE_STRING, ret); +std::shared_ptr operator-(std::shared_ptr a, std::shared_ptr b) { + if (a->get_type() == VALUE_FLOAT || b->get_type() == VALUE_FLOAT) + return std::make_shared>(VALUE_FLOAT, a->as_double() - b->as_double()); + else if (a->get_type() == VALUE_INT && b->get_type() == VALUE_INT) + return std::make_shared>(VALUE_INT, a->as_int() - b->as_int()); + else + return std::make_shared( + VALUE_ERROR, Color(0xFF, 0x39, 0x6E).get() + + "Runtime ERROR: SUB operation can only apply on number\n" RESET); +} + +std::shared_ptr operator*(std::shared_ptr a, std::shared_ptr b) { + if (a->get_type() == VALUE_FLOAT || b->get_type() == VALUE_FLOAT) + return std::make_shared>(VALUE_FLOAT, a->as_double() * b->as_double()); + else if (a->get_type() == VALUE_INT && b->get_type() == VALUE_INT) + return std::make_shared>(VALUE_INT, a->as_int() * b->as_int()); + else if (a->get_type() == VALUE_STRING && b->get_type() == VALUE_INT) { + std::string ret, str_a{a->as_string()}; + int64_t times{b->as_int()}; + for (int i{0}; i < times; ++i) ret += str_a; + return std::make_shared>(VALUE_STRING, ret); + } else + return std::make_shared(VALUE_ERROR, + Color(0xFF, 0x39, 0x6E).get() + + "Runtime ERROR: MUL operation can only apply on " + "number or string and int\n" RESET); } -std::shared_ptr BuiltinAlgoValue::execute_clear() { - std::system("clear"); - return std::make_shared(); -} - -std::shared_ptr BuiltinAlgoValue::execute_int(const std::string &str) { - if (str[0] != '-' && !std::isdigit(str[0])) { - return std::make_shared(VALUE_ERROR, "Cannot convert \"" + str + - "\" to an int"); - } - for (int i{1}; i < str.size(); ++i) - if (!std::isdigit(str[0])) - return std::make_shared( - VALUE_ERROR, "Cannot convert \"" + str + "\" to an int"); - return std::make_shared>(VALUE_INT, std::stoll(str)); -} - -std::shared_ptr BuiltinAlgoValue::execute_float(const std::string &str) { - int point{0}; - if (str[0] != '-' && !std::isdigit(str[0])) { - return std::make_shared(VALUE_ERROR, "Cannot convert \"" + str + - "\" to an int"); - } - for (int i{1}; i < str.size(); ++i) { - if (!std::isdigit(str[0]) && (str[0] != '.' || point == 1)) { - return std::make_shared( - VALUE_ERROR, "Cannot convert \"" + str + "\" to an int"); - } - if (str[0] == '.') - point++; - } - return std::make_shared>(VALUE_FLOAT, std::stod(str)); -} - -std::shared_ptr -BuiltinAlgoValue::execute_string(const std::string &str) { - return std::make_shared>(VALUE_STRING, str); -} - -std::shared_ptr operator+(std::shared_ptr a, - std::shared_ptr b) { - if (a->get_type() == VALUE_FLOAT || b->get_type() == VALUE_FLOAT) - return std::make_shared>( - VALUE_FLOAT, a->as_double() + b->as_double()); - else if (a->get_type() == VALUE_INT && b->get_type() == VALUE_INT) - return std::make_shared>( - VALUE_INT, a->as_int() + b->as_int()); - else if (a->get_type() == VALUE_STRING && b->get_type() == VALUE_STRING) - return std::make_shared>( - VALUE_STRING, a->as_string() + b->as_string()); - else - return std::make_shared( - VALUE_ERROR, Color(0xFF, 0x39, 0x6E).get() + - "Runtime ERROR: ADD operation can only apply on " - "number or two string\n" RESET); -} - -std::shared_ptr operator-(std::shared_ptr a, - std::shared_ptr b) { - if (a->get_type() == VALUE_FLOAT || b->get_type() == VALUE_FLOAT) - return std::make_shared>( - VALUE_FLOAT, a->as_double() - b->as_double()); - else if (a->get_type() == VALUE_INT && b->get_type() == VALUE_INT) - return std::make_shared>( - VALUE_INT, a->as_int() - b->as_int()); - else - return std::make_shared( - VALUE_ERROR, - Color(0xFF, 0x39, 0x6E).get() + - "Runtime ERROR: SUB operation can only apply on number\n" RESET); -} - -std::shared_ptr operator*(std::shared_ptr a, - std::shared_ptr b) { - if (a->get_type() == VALUE_FLOAT || b->get_type() == VALUE_FLOAT) - return std::make_shared>( - VALUE_FLOAT, a->as_double() * b->as_double()); - else if (a->get_type() == VALUE_INT && b->get_type() == VALUE_INT) - return std::make_shared>( - VALUE_INT, a->as_int() * b->as_int()); - else if (a->get_type() == VALUE_STRING && b->get_type() == VALUE_INT) { - std::string ret, str_a{a->as_string()}; - int64_t times{b->as_int()}; - for (int i{0}; i < times; ++i) - ret += str_a; - return std::make_shared>(VALUE_STRING, ret); - } else - return std::make_shared( - VALUE_ERROR, Color(0xFF, 0x39, 0x6E).get() + - "Runtime ERROR: MUL operation can only apply on " - "number or string and int\n" RESET); -} - -std::shared_ptr operator/(std::shared_ptr a, - std::shared_ptr b) { - if (b->as_double() == 0.0) - return std::make_shared(VALUE_ERROR, - Color(0xFF, 0x39, 0x6E).get() + - "Runtime ERROR: DIV by 0\n" RESET); - if (a->get_type() == VALUE_FLOAT || b->get_type() == VALUE_FLOAT) - return std::make_shared>( - VALUE_FLOAT, a->as_double() / b->as_double()); - else if (a->get_type() == VALUE_INT && b->get_type() == VALUE_INT) - return std::make_shared>( - VALUE_INT, a->as_int() / b->as_int()); - else - return std::make_shared( - VALUE_ERROR, - Color(0xFF, 0x39, 0x6E).get() + - "Runtime ERROR: DIV operation can only apply on number\n" RESET); +std::shared_ptr operator/(std::shared_ptr a, std::shared_ptr b) { + if (b->as_double() == 0.0) + return std::make_shared( + VALUE_ERROR, Color(0xFF, 0x39, 0x6E).get() + "Runtime ERROR: DIV by 0\n" RESET); + if (a->get_type() == VALUE_FLOAT || b->get_type() == VALUE_FLOAT) + return std::make_shared>(VALUE_FLOAT, a->as_double() / b->as_double()); + else if (a->get_type() == VALUE_INT && b->get_type() == VALUE_INT) + return std::make_shared>(VALUE_INT, a->as_int() / b->as_int()); + else + return std::make_shared( + VALUE_ERROR, Color(0xFF, 0x39, 0x6E).get() + + "Runtime ERROR: DIV operation can only apply on number\n" RESET); } -std::shared_ptr operator%(std::shared_ptr a, - std::shared_ptr b) { - if (a->get_type() != VALUE_INT || b->get_type() != VALUE_INT) - return std::make_shared( - VALUE_ERROR, Color(0xFF, 0x39, 0x6E).get() + - "Cannot apply \"%\" operation on float\n" RESET); - return std::make_shared>( - VALUE_INT, a->as_int() % b->as_int()); -} - -std::shared_ptr operator==(std::shared_ptr a, - std::shared_ptr b) { - if (a->get_type() == VALUE_INSTANCE || b->get_type() == VALUE_INSTANCE || - a->get_type() == VALUE_ARRAY || b->get_type() == VALUE_ARRAY || - a->get_type() == VALUE_HASH_TABLE || b->get_type() == VALUE_HASH_TABLE || - a->get_type() == VALUE_STRUCT || b->get_type() == VALUE_STRUCT) - return std::make_shared>(VALUE_INT, a.get() == b.get()); - if (a->get_type() == VALUE_FLOAT || b->get_type() == VALUE_FLOAT) - return std::make_shared>( - VALUE_INT, a->as_double() == b->as_double()); - else - return std::make_shared>(VALUE_INT, - a->as_string() == b->as_string()); -} - -std::shared_ptr operator!=(std::shared_ptr a, - std::shared_ptr b) { - if (a->get_type() == VALUE_INSTANCE || b->get_type() == VALUE_INSTANCE || - a->get_type() == VALUE_ARRAY || b->get_type() == VALUE_ARRAY || - a->get_type() == VALUE_HASH_TABLE || b->get_type() == VALUE_HASH_TABLE || - a->get_type() == VALUE_STRUCT || b->get_type() == VALUE_STRUCT) - return std::make_shared>(VALUE_INT, a.get() != b.get()); - if (a->get_type() == VALUE_FLOAT || b->get_type() == VALUE_FLOAT) - return std::make_shared>( - VALUE_INT, a->as_double() != b->as_double()); - else - return std::make_shared>(VALUE_INT, - a->as_string() != b->as_string()); -} - -std::shared_ptr operator<(std::shared_ptr a, - std::shared_ptr b) { - if (a->get_type() == VALUE_FLOAT || b->get_type() == VALUE_FLOAT) - return std::make_shared>( - VALUE_INT, a->as_double() < b->as_double()); - else if (a->get_type() == VALUE_INT && b->get_type() == VALUE_INT) - return std::make_shared>( - VALUE_INT, a->as_int() < b->as_int()); - else - return std::make_shared>(VALUE_INT, - a->as_string() < b->as_string()); -} - -std::shared_ptr operator>(std::shared_ptr a, - std::shared_ptr b) { - if (a->get_type() == VALUE_FLOAT || b->get_type() == VALUE_FLOAT) - return std::make_shared>( - VALUE_INT, a->as_double() > b->as_double()); - else if (a->get_type() == VALUE_INT && b->get_type() == VALUE_INT) - return std::make_shared>( - VALUE_INT, a->as_int() > b->as_int()); - else - return std::make_shared>(VALUE_INT, - a->as_string() > b->as_string()); -} - -std::shared_ptr operator<=(std::shared_ptr a, - std::shared_ptr b) { - if (a->get_type() == VALUE_FLOAT || b->get_type() == VALUE_FLOAT) - return std::make_shared>( - VALUE_INT, a->as_double() <= b->as_double()); - else if (a->get_type() == VALUE_INT && b->get_type() == VALUE_INT) - return std::make_shared>( - VALUE_INT, a->as_int() <= b->as_int()); - else - return std::make_shared>(VALUE_INT, - a->as_string() <= b->as_string()); -} - -std::shared_ptr operator>=(std::shared_ptr a, - std::shared_ptr b) { - if (a->get_type() == VALUE_FLOAT || b->get_type() == VALUE_FLOAT) - return std::make_shared>( - VALUE_INT, a->as_double() >= b->as_double()); - else if (a->get_type() == VALUE_INT && b->get_type() == VALUE_INT) - return std::make_shared>( - VALUE_INT, a->as_int() >= b->as_int()); - else - return std::make_shared>(VALUE_INT, - a->as_string() >= b->as_string()); -} - -std::shared_ptr operator&&(std::shared_ptr a, - std::shared_ptr b) { - if (a->get_type() == VALUE_FLOAT || b->get_type() == VALUE_FLOAT) - return std::make_shared>( - VALUE_INT, - a->as_double() != 0 && b->as_double() != 0); - else if (a->get_type() == VALUE_INT && b->get_type() == VALUE_INT) - return std::make_shared>( - VALUE_INT, - a->as_int() != 0 && b->as_int() != 0); - else - return std::make_shared>( - VALUE_INT, a->as_int() && b->as_int()); -} - -std::shared_ptr operator||(std::shared_ptr a, - std::shared_ptr b) { - if (a->get_type() == VALUE_FLOAT || b->get_type() == VALUE_FLOAT) - return std::make_shared>( - VALUE_INT, - a->as_double() != 0 || b->as_double() != 0); - else - return std::make_shared>( - VALUE_INT, a->as_int() || b->as_int()); +std::shared_ptr operator%(std::shared_ptr a, std::shared_ptr b) { + if (a->get_type() != VALUE_INT || b->get_type() != VALUE_INT) + return std::make_shared( + VALUE_ERROR, + Color(0xFF, 0x39, 0x6E).get() + "Cannot apply \"%\" operation on float\n" RESET); + return std::make_shared>(VALUE_INT, a->as_int() % b->as_int()); +} + +std::shared_ptr operator==(std::shared_ptr a, std::shared_ptr b) { + if (a->get_type() == VALUE_INSTANCE || b->get_type() == VALUE_INSTANCE || + a->get_type() == VALUE_ARRAY || b->get_type() == VALUE_ARRAY || + a->get_type() == VALUE_HASH_TABLE || b->get_type() == VALUE_HASH_TABLE || + a->get_type() == VALUE_STRUCT || b->get_type() == VALUE_STRUCT) + return std::make_shared>(VALUE_INT, a.get() == b.get()); + if (a->get_type() == VALUE_FLOAT || b->get_type() == VALUE_FLOAT) + return std::make_shared>(VALUE_INT, a->as_double() == b->as_double()); + else + return std::make_shared>(VALUE_INT, a->as_string() == b->as_string()); +} + +std::shared_ptr operator!=(std::shared_ptr a, std::shared_ptr b) { + if (a->get_type() == VALUE_INSTANCE || b->get_type() == VALUE_INSTANCE || + a->get_type() == VALUE_ARRAY || b->get_type() == VALUE_ARRAY || + a->get_type() == VALUE_HASH_TABLE || b->get_type() == VALUE_HASH_TABLE || + a->get_type() == VALUE_STRUCT || b->get_type() == VALUE_STRUCT) + return std::make_shared>(VALUE_INT, a.get() != b.get()); + if (a->get_type() == VALUE_FLOAT || b->get_type() == VALUE_FLOAT) + return std::make_shared>(VALUE_INT, a->as_double() != b->as_double()); + else + return std::make_shared>(VALUE_INT, a->as_string() != b->as_string()); +} + +std::shared_ptr operator<(std::shared_ptr a, std::shared_ptr b) { + if (a->get_type() == VALUE_FLOAT || b->get_type() == VALUE_FLOAT) + return std::make_shared>(VALUE_INT, a->as_double() < b->as_double()); + else if (a->get_type() == VALUE_INT && b->get_type() == VALUE_INT) + return std::make_shared>(VALUE_INT, a->as_int() < b->as_int()); + else + return std::make_shared>(VALUE_INT, a->as_string() < b->as_string()); +} + +std::shared_ptr operator>(std::shared_ptr a, std::shared_ptr b) { + if (a->get_type() == VALUE_FLOAT || b->get_type() == VALUE_FLOAT) + return std::make_shared>(VALUE_INT, a->as_double() > b->as_double()); + else if (a->get_type() == VALUE_INT && b->get_type() == VALUE_INT) + return std::make_shared>(VALUE_INT, a->as_int() > b->as_int()); + else + return std::make_shared>(VALUE_INT, a->as_string() > b->as_string()); +} + +std::shared_ptr operator<=(std::shared_ptr a, std::shared_ptr b) { + if (a->get_type() == VALUE_FLOAT || b->get_type() == VALUE_FLOAT) + return std::make_shared>(VALUE_INT, a->as_double() <= b->as_double()); + else if (a->get_type() == VALUE_INT && b->get_type() == VALUE_INT) + return std::make_shared>(VALUE_INT, a->as_int() <= b->as_int()); + else + return std::make_shared>(VALUE_INT, a->as_string() <= b->as_string()); +} + +std::shared_ptr operator>=(std::shared_ptr a, std::shared_ptr b) { + if (a->get_type() == VALUE_FLOAT || b->get_type() == VALUE_FLOAT) + return std::make_shared>(VALUE_INT, a->as_double() >= b->as_double()); + else if (a->get_type() == VALUE_INT && b->get_type() == VALUE_INT) + return std::make_shared>(VALUE_INT, a->as_int() >= b->as_int()); + else + return std::make_shared>(VALUE_INT, a->as_string() >= b->as_string()); +} + +std::shared_ptr operator&&(std::shared_ptr a, std::shared_ptr b) { + if (a->get_type() == VALUE_FLOAT || b->get_type() == VALUE_FLOAT) + return std::make_shared>(VALUE_INT, + a->as_double() != 0 && b->as_double() != 0); + else if (a->get_type() == VALUE_INT && b->get_type() == VALUE_INT) + return std::make_shared>(VALUE_INT, + a->as_int() != 0 && b->as_int() != 0); + else + return std::make_shared>(VALUE_INT, a->as_int() && b->as_int()); +} + +std::shared_ptr operator||(std::shared_ptr a, std::shared_ptr b) { + if (a->get_type() == VALUE_FLOAT || b->get_type() == VALUE_FLOAT) + return std::make_shared>(VALUE_INT, + a->as_double() != 0 || b->as_double() != 0); + else + return std::make_shared>(VALUE_INT, a->as_int() || b->as_int()); } std::shared_ptr operator-(std::shared_ptr a) { - if (a->get_type() == VALUE_FLOAT) - return std::make_shared>(VALUE_FLOAT, - 0 - a->as_double()); - else - return std::make_shared>(VALUE_INT, - 0 - a->as_int()); + if (a->get_type() == VALUE_FLOAT) + return std::make_shared>(VALUE_FLOAT, 0 - a->as_double()); + else + return std::make_shared>(VALUE_INT, 0 - a->as_int()); } std::shared_ptr operator!(std::shared_ptr a) { - if (a->get_type() == VALUE_FLOAT) - return std::make_shared>(VALUE_FLOAT, - a->as_double() == 0); - else - return std::make_shared>(VALUE_INT, - a->as_int() == 0); + if (a->get_type() == VALUE_FLOAT) + return std::make_shared>(VALUE_FLOAT, a->as_double() == 0); + else + return std::make_shared>(VALUE_INT, a->as_int() == 0); } std::shared_ptr pow(std::shared_ptr a, std::shared_ptr b) { - if (a->as_double() == 0.0 && b->as_double() == 0.0) - return std::make_shared( - VALUE_ERROR, - Color(0xFF, 0x39, 0x6E).get() + "Runtime ERROR: 0 to the 0\n" RESET); - if (a->get_type() == VALUE_FLOAT || b->get_type() == VALUE_FLOAT) - return std::make_shared>( - VALUE_FLOAT, - std::pow(a->as_double(), b->as_double())); - else - return std::make_shared>( - VALUE_INT, - std::pow(a->as_int(), b->as_int())); -} - -std::shared_ptr InstanceValue::get_member(const std::string &name, std::shared_ptr self) { - if (members.count(name)) { - return members[name]; - } - // Check for methods in struct definition - if (struct_def->methods.count(name)) { - if (self.get() == nullptr) { - // Fallback if self not provided, but this shouldn't happen for method calls - // Create a copy? Or error? - // For now, create a copy as before, but warn? - return std::make_shared( - std::make_shared(*this), name); - } - return std::make_shared(self, name); - } - return std::make_shared(VALUE_ERROR, "Member not found: " + name); -} - -void InstanceValue::set_member(const std::string &name, - std::shared_ptr val) { - // If it's declared in struct def members, we can set it. - bool found = false; - for (const auto &mem : struct_def->members) { - if (mem == name) { - found = true; - break; - } - } - if (found) { - members[name] = val; - } else { - members[name] = val; // Just set it for now. - } -} -std::shared_ptr StructValue::execute(const NodeList& args, - SymbolTable *parent) { - // Constructor call - std::shared_ptr instance = - std::make_shared(std::make_shared(*this)); - - // Initialize members to NONE - for (const auto &member : members) { - instance->set_member(member, std::make_shared(VALUE_NONE)); - } - - // Call constructor if exists - if (methods.count("constructor")) { - std::shared_ptr ctor = methods["constructor"]; - // We need to bind the constructor to the instance - std::shared_ptr bound_ctor = - std::make_shared(instance, "constructor"); - // But BoundMethodValue execute logic for custom objects is not implemented - // in pseudo.cpp yet (only ArrayValue). We need to implement it. Actually, - // let's reuse AlgoValue::execute but inject 'self'. - - // Wait, BoundMethodValue holds the object and the method name. - // Its execute() needs to look up the method (which we have in 'ctor') and - // call it with 'self' = obj. - - // Actually, if we use BoundMethodValue, we need to implement execute for - // generic objects. Alternatively, we can manually call ctor->execute(args, - // parent) but we need to inject 'self'. AlgoValue::execute creates a new - // symbol table. We need to add 'self' to it. But AlgoValue::execute - // interface doesn't allow injecting symbols easily before execution. - // However, AlgoValue::execute does: - // SymbolTable sym(parent); - // set_args(args, sym, interpreter); - // ... - - // We can manually do what AlgoValue::execute does. - // Or we can modify AlgoValue to support binding? - // Or implement BoundMethodValue::execute properly. - } - - // For now, let's rely on BoundMethodValue which we will implement/update in - // pseudo.cpp. - if (methods.count("constructor")) { - std::shared_ptr bound_ctor = - std::make_shared(instance, "constructor"); - std::shared_ptr ret = bound_ctor->execute(args, parent); - if (ret->get_type() == VALUE_ERROR) - return ret; - } - - return instance; + if (a->as_double() == 0.0 && b->as_double() == 0.0) + return std::make_shared( + VALUE_ERROR, Color(0xFF, 0x39, 0x6E).get() + "Runtime ERROR: 0 to the 0\n" RESET); + if (a->get_type() == VALUE_FLOAT || b->get_type() == VALUE_FLOAT) + return std::make_shared>(VALUE_FLOAT, + std::pow(a->as_double(), b->as_double())); + else + return std::make_shared>(VALUE_INT, std::pow(a->as_int(), b->as_int())); +} + +std::shared_ptr InstanceValue::get_member(const std::string& name, + std::shared_ptr self) { + if (members.count(name)) { + return members[name]; + } + // Check for methods in struct definition + if (struct_def->methods.count(name)) { + if (self.get() == nullptr) { + // Fallback if self not provided, but this shouldn't happen for method calls + // Create a copy? Or error? + // For now, create a copy as before, but warn? + return std::make_shared(std::make_shared(*this), name); + } + return std::make_shared(self, name); + } + return std::make_shared(VALUE_ERROR, "Member not found: " + name); +} + +void InstanceValue::set_member(const std::string& name, std::shared_ptr val) { + // If it's declared in struct def members, we can set it. + bool found = false; + for (const auto& mem : struct_def->members) { + if (mem == name) { + found = true; + break; + } + } + if (found) { + members[name] = val; + } else { + members[name] = val; // Just set it for now. + } +} +std::shared_ptr StructValue::execute(const NodeList& args, SymbolTable* parent) { + // Constructor call + std::shared_ptr instance = + std::make_shared(std::make_shared(*this)); + + // Initialize members to NONE + for (const auto& member : members) { + instance->set_member(member, std::make_shared(VALUE_NONE)); + } + + // Call constructor if exists + if (methods.count("constructor")) { + std::shared_ptr ctor = methods["constructor"]; + // We need to bind the constructor to the instance + std::shared_ptr bound_ctor = + std::make_shared(instance, "constructor"); + // But BoundMethodValue execute logic for custom objects is not implemented + // in pseudo.cpp yet (only ArrayValue). We need to implement it. Actually, + // let's reuse AlgoValue::execute but inject 'self'. + + // Wait, BoundMethodValue holds the object and the method name. + // Its execute() needs to look up the method (which we have in 'ctor') and + // call it with 'self' = obj. + + // Actually, if we use BoundMethodValue, we need to implement execute for + // generic objects. Alternatively, we can manually call ctor->execute(args, + // parent) but we need to inject 'self'. AlgoValue::execute creates a new + // symbol table. We need to add 'self' to it. But AlgoValue::execute + // interface doesn't allow injecting symbols easily before execution. + // However, AlgoValue::execute does: + // SymbolTable sym(parent); + // set_args(args, sym, interpreter); + // ... + + // We can manually do what AlgoValue::execute does. + // Or we can modify AlgoValue to support binding? + // Or implement BoundMethodValue::execute properly. + } + + // For now, let's rely on BoundMethodValue which we will implement/update in + // pseudo.cpp. + if (methods.count("constructor")) { + std::shared_ptr bound_ctor = + std::make_shared(instance, "constructor"); + std::shared_ptr ret = bound_ctor->execute(args, parent); + if (ret->get_type() == VALUE_ERROR) return ret; + } + + return instance; } /// -------------------- @@ -1212,222 +1104,213 @@ std::shared_ptr StructValue::execute(const NodeList& args, namespace { -std::string trim(const std::string &str) { - size_t begin = 0; - while (begin < str.size() && - std::isspace(static_cast(str[begin]))) { - begin++; - } - - size_t end = str.size(); - while (end > begin && - std::isspace(static_cast(str[end - 1]))) { - end--; - } - return str.substr(begin, end - begin); -} - -bool parse_import_line(const std::string &line, std::string &target) { - std::string trimmed = trim(line); - const std::string keyword = "import"; - if (trimmed.rfind(keyword, 0) != 0) { - return false; - } - if (trimmed.size() > keyword.size() && - !std::isspace(static_cast(trimmed[keyword.size()]))) { - return false; - } +std::string trim(const std::string& str) { + size_t begin = 0; + while (begin < str.size() && std::isspace(static_cast(str[begin]))) { + begin++; + } - target = trim(trimmed.substr(keyword.size())); - if (target.empty()) { - return false; - } + size_t end = str.size(); + while (end > begin && std::isspace(static_cast(str[end - 1]))) { + end--; + } + return str.substr(begin, end - begin); +} + +bool parse_import_line(const std::string& line, std::string& target) { + std::string trimmed = trim(line); + const std::string keyword = "import"; + if (trimmed.rfind(keyword, 0) != 0) { + return false; + } + if (trimmed.size() > keyword.size() && + !std::isspace(static_cast(trimmed[keyword.size()]))) { + return false; + } - if (target.front() == '"' && target.back() == '"' && target.size() >= 2) { - target = target.substr(1, target.size() - 2); - } - return !target.empty(); + target = trim(trimmed.substr(keyword.size())); + if (target.empty()) { + return false; + } + + if (target.front() == '"' && target.back() == '"' && target.size() >= 2) { + target = target.substr(1, target.size() - 2); + } + return !target.empty(); } -std::vector -candidate_import_paths(const std::string &target, - const std::filesystem::path &base_dir) { - namespace fs = std::filesystem; - fs::path target_path(target); - std::vector candidates; +std::vector candidate_import_paths(const std::string& target, + const std::filesystem::path& base_dir) { + namespace fs = std::filesystem; + fs::path target_path(target); + std::vector candidates; + + if (target_path.is_absolute()) { + candidates.push_back(target_path); + } else { + if (!target_path.has_extension()) { + candidates.push_back(fs::current_path() / "lib" / (target + ".ps")); + } + candidates.push_back(base_dir / target_path); + candidates.push_back(fs::current_path() / target_path); + } - if (target_path.is_absolute()) { - candidates.push_back(target_path); - } else { if (!target_path.has_extension()) { - candidates.push_back(fs::current_path() / "lib" / (target + ".ps")); + candidates.push_back(base_dir / (target + ".ps")); + candidates.push_back(fs::current_path() / (target + ".ps")); } - candidates.push_back(base_dir / target_path); - candidates.push_back(fs::current_path() / target_path); - } - if (!target_path.has_extension()) { - candidates.push_back(base_dir / (target + ".ps")); - candidates.push_back(fs::current_path() / (target + ".ps")); - } + return candidates; +} - return candidates; +bool read_file(const std::filesystem::path& path, std::string& text) { + std::ifstream input(path); + if (!input) { + return false; + } + std::stringstream buffer; + buffer << input.rdbuf(); + text = buffer.str(); + if (!text.empty() && text.back() != '\n') { + text += '\n'; + } + return true; } -bool read_file(const std::filesystem::path &path, std::string &text) { - std::ifstream input(path); - if (!input) { +bool resolve_import(const std::string& target, const std::filesystem::path& base_dir, + std::filesystem::path& resolved) { + namespace fs = std::filesystem; + for (const auto& candidate : candidate_import_paths(target, base_dir)) { + std::error_code ec; + if (fs::exists(candidate, ec) && fs::is_regular_file(candidate, ec)) { + resolved = fs::weakly_canonical(candidate, ec); + if (ec) { + resolved = fs::absolute(candidate, ec); + } + return true; + } + } return false; - } - std::stringstream buffer; - buffer << input.rdbuf(); - text = buffer.str(); - if (!text.empty() && text.back() != '\n') { - text += '\n'; - } - return true; -} - -bool resolve_import(const std::string &target, - const std::filesystem::path &base_dir, - std::filesystem::path &resolved) { - namespace fs = std::filesystem; - for (const auto &candidate : candidate_import_paths(target, base_dir)) { - std::error_code ec; - if (fs::exists(candidate, ec) && fs::is_regular_file(candidate, ec)) { - resolved = fs::weakly_canonical(candidate, ec); - if (ec) { - resolved = fs::absolute(candidate, ec); - } - return true; - } - } - return false; -} - -} // namespace - -bool expand_imports(const std::string &file_name, const std::string &text, - ImportState &state, std::string &expanded, - std::string &error) { - namespace fs = std::filesystem; - fs::path current_path(file_name); - fs::path base_dir = current_path.has_parent_path() - ? fs::absolute(current_path).parent_path() - : fs::current_path(); - - std::stringstream input(text); - std::string line; - while (std::getline(input, line)) { - std::string target; - if (!parse_import_line(line, target)) { - expanded += line + "\n"; - continue; - } - - fs::path import_path; - if (!resolve_import(target, base_dir, import_path)) { - error = "Import ERROR: cannot resolve \"" + target + "\" from " + - base_dir.string(); - return false; - } - - std::string import_key = import_path.string(); - if (state.loaded.count(import_key)) { - continue; - } - if (state.loading.count(import_key)) { - error = "Import ERROR: circular import involving " + import_key; - return false; - } - - std::string import_text; - if (!read_file(import_path, import_text)) { - error = "Import ERROR: cannot read " + import_key; - return false; - } - - state.loading.insert(import_key); - std::string import_expanded; - if (!expand_imports(import_key, import_text, state, import_expanded, - error)) { - return false; - } - state.loading.erase(import_key); - state.loaded.insert(import_key); - expanded += import_expanded; - expanded += "\n"; - } - return true; -} - -std::string run(std::string file_name, std::string text, - SymbolTable &global_symbol_table) { - ImportState import_state; - std::string expanded_text; - std::string import_error; - if (!expand_imports(file_name, text, import_state, expanded_text, - import_error)) { - std::cout << import_error << "\n"; - return "ABORT"; - } - - Lexer lexer(file_name, expanded_text); - TokenList tokens = lexer.make_tokens(); - if (tokens.empty()) - return ""; - if (tokens[0]->get_type() == TOKEN_ERROR) { - // std::cout << "Tokens: " << tokens << "\n"; - // Detailed Lexer Error? - // Lexer returns TOKEN_ERROR in list. - // But lexer usually returns a list with one error token if it fails? - // Or a list where some tokens are errors. - // Check lexer.cpp. - // Lexer::make_tokens() returns a list. If error, it pushes ErrorToken. - // Let's iterate and find errors. - for (auto tok : tokens) { - if (tok->get_type() == TOKEN_ERROR) { - std::cout << "Error: " << tok->get_value() << ", line " << tok->get_pos().line + 1 << ", column: " << tok->get_pos().column << "\n"; - std::cout << error_marker(expanded_text, tok->get_pos(), tok->get_pos()); - return "ABORT"; +} + +} // namespace + +bool expand_imports(const std::string& file_name, const std::string& text, ImportState& state, + std::string& expanded, std::string& error) { + namespace fs = std::filesystem; + fs::path current_path(file_name); + fs::path base_dir = current_path.has_parent_path() ? fs::absolute(current_path).parent_path() + : fs::current_path(); + + std::stringstream input(text); + std::string line; + while (std::getline(input, line)) { + std::string target; + if (!parse_import_line(line, target)) { + expanded += line + "\n"; + continue; + } + + fs::path import_path; + if (!resolve_import(target, base_dir, import_path)) { + error = "Import ERROR: cannot resolve \"" + target + "\" from " + base_dir.string(); + return false; + } + + std::string import_key = import_path.string(); + if (state.loaded.count(import_key)) { + continue; + } + if (state.loading.count(import_key)) { + error = "Import ERROR: circular import involving " + import_key; + return false; + } + + std::string import_text; + if (!read_file(import_path, import_text)) { + error = "Import ERROR: cannot read " + import_key; + return false; + } + + state.loading.insert(import_key); + std::string import_expanded; + if (!expand_imports(import_key, import_text, state, import_expanded, error)) { + return false; } + state.loading.erase(import_key); + state.loaded.insert(import_key); + expanded += import_expanded; + expanded += "\n"; } - } - - Parser parser(tokens); - NodeList ast = parser.parse(); - - for (auto node : ast) { - if(node->get_type() == NODE_ERROR) { - // std::cout << "Nodes: " << node->get_node() << "\n"; - std::shared_ptr err_tok = node->get_tok(); - if(err_tok) { - std::cout << "Error: " << err_tok->get_value() << ", line " << err_tok->get_pos().line + 1 << ", column: " << err_tok->get_pos().column << "\n"; - std::cout << error_marker(expanded_text, err_tok->get_pos(), err_tok->get_pos()); - } else { - std::cout << "Error: " << node->get_node() << "\n"; - } - return "ABORT"; - } - } - - Interpreter interpreter(global_symbol_table, file_name == "stdin"); - ArrayValue *ret{new ArrayValue(ValueList(0))}; - for (auto node : ast) { - ret->push_back(interpreter.visit(node)); - if (ret->back()->get_type() == VALUE_ERROR) { - std::cout << ret->back()->get_num() << "\n"; - return "ABORT"; - } - } - - while (ret->get_type() == VALUE_ARRAY && - ret->back()->get_type() == VALUE_ARRAY) { - ret = dynamic_cast(ret->back().get()); - } - - if (file_name == "stdin" && ret->operator[](0)->get_type() != VALUE_NONE) { - std::cout << ret->get_num() << "\n"; - } - return ""; + return true; +} + +std::string run(std::string file_name, std::string text, SymbolTable& global_symbol_table) { + ImportState import_state; + std::string expanded_text; + std::string import_error; + if (!expand_imports(file_name, text, import_state, expanded_text, import_error)) { + std::cout << import_error << "\n"; + return "ABORT"; + } + + Lexer lexer(file_name, expanded_text); + TokenList tokens = lexer.make_tokens(); + if (tokens.empty()) return ""; + if (tokens[0]->get_type() == TOKEN_ERROR) { + // std::cout << "Tokens: " << tokens << "\n"; + // Detailed Lexer Error? + // Lexer returns TOKEN_ERROR in list. + // But lexer usually returns a list with one error token if it fails? + // Or a list where some tokens are errors. + // Check lexer.cpp. + // Lexer::make_tokens() returns a list. If error, it pushes ErrorToken. + // Let's iterate and find errors. + for (auto tok : tokens) { + if (tok->get_type() == TOKEN_ERROR) { + std::cout << "Error: " << tok->get_value() << ", line " << tok->get_pos().line + 1 + << ", column: " << tok->get_pos().column << "\n"; + std::cout << error_marker(expanded_text, tok->get_pos(), tok->get_pos()); + return "ABORT"; + } + } + } + + Parser parser(tokens); + NodeList ast = parser.parse(); + + for (auto node : ast) { + if (node->get_type() == NODE_ERROR) { + // std::cout << "Nodes: " << node->get_node() << "\n"; + std::shared_ptr err_tok = node->get_tok(); + if (err_tok) { + std::cout << "Error: " << err_tok->get_value() << ", line " + << err_tok->get_pos().line + 1 + << ", column: " << err_tok->get_pos().column << "\n"; + std::cout << error_marker(expanded_text, err_tok->get_pos(), err_tok->get_pos()); + } else { + std::cout << "Error: " << node->get_node() << "\n"; + } + return "ABORT"; + } + } + + Interpreter interpreter(global_symbol_table, file_name == "stdin"); + ArrayValue* ret{new ArrayValue(ValueList(0))}; + for (auto node : ast) { + ret->push_back(interpreter.visit(node)); + if (ret->back()->get_type() == VALUE_ERROR) { + std::cout << ret->back()->get_num() << "\n"; + return "ABORT"; + } + } + + while (ret->get_type() == VALUE_ARRAY && ret->back()->get_type() == VALUE_ARRAY) { + ret = dynamic_cast(ret->back().get()); + } + + if (file_name == "stdin" && ret->operator[](0)->get_type() != VALUE_NONE) { + std::cout << ret->get_num() << "\n"; + } + return ""; } diff --git a/src/value.h b/src/value.h index feb7d6b..fab534a 100644 --- a/src/value.h +++ b/src/value.h @@ -5,12 +5,13 @@ #ifndef VALUE_H #define VALUE_H -#include -#include -#include +#include #include +#include +#include #include -#include +#include + #include "node.h" const std::string VALUE_NONE{"NONE"}; @@ -27,41 +28,37 @@ const std::string VALUE_RETURN{"Return"}; const std::string VALUE_BREAK{"Break"}; const std::string VALUE_CONTINUE{"Continue"}; -const std::map REVERSE_ESCAPE_CHAR { - {'\n', 'n'}, {'\r', 'r'}, - {'\b', 'b'}, {'\"', '\"'}, - {'\'', '\''}, {'\\', '\\'}, - {'\t', 't'} -}; +const std::map REVERSE_ESCAPE_CHAR{ + {'\n', 'n'}, {'\r', 'r'}, {'\b', 'b'}, {'\"', '\"'}, {'\'', '\''}, {'\\', '\\'}, {'\t', 't'}}; class SymbolTable; class Interpreter; -class Value: public std::enable_shared_from_this { -public: - Value(const std::string& _type = VALUE_NONE) - : type(_type) {} - virtual std::string get_num() { return type;} - virtual std::string repr() { return type;} - virtual std::string get_type(){ return type;} +class Value : public std::enable_shared_from_this { + public: + Value(const std::string& _type = VALUE_NONE) : type(_type) {} + virtual std::string get_num() { return type; } + virtual std::string repr() { return type; } + virtual std::string get_type() { return type; } virtual int64_t as_int(); virtual double as_double(); virtual std::string as_string(); virtual bool append_string(const std::string&) { return false; } - virtual std::shared_ptr execute(const NodeList& args = {}, SymbolTable *parent = nullptr) - { return std::make_shared();}; - friend std::ostream& operator<<(std::ostream &out, Value &token); - -protected: + virtual std::shared_ptr execute(const NodeList& args = {}, + SymbolTable* parent = nullptr) { + return std::make_shared(); + }; + friend std::ostream& operator<<(std::ostream& out, Value& token); + + protected: std::string type; }; using ValueList = std::vector>; -template -class TypedValue: public Value { -public: - TypedValue(const std::string& _type, const T &_value) - : Value(_type), value(_value) {} +template +class TypedValue : public Value { + public: + TypedValue(const std::string& _type, const T& _value) : Value(_type), value(_value) {} std::string get_num() override; std::string repr() override; int64_t as_int() override; @@ -69,50 +66,53 @@ class TypedValue: public Value { std::string as_string() override; bool append_string(const std::string&) override; -protected: + protected: T value; }; using ErrorValue = TypedValue; -class BaseAlgoValue: public Value { -public: - BaseAlgoValue(const std::string &_algo_name, std::shared_ptr _value) +class BaseAlgoValue : public Value { + public: + BaseAlgoValue(const std::string& _algo_name, std::shared_ptr _value) : Value(VALUE_ALGO), value(_value), algo_name(_algo_name) { for (const auto& tok : value->get_toks()) { arg_names.push_back(tok->get_value()); } } - std::string get_num() override { return algo_name;} + std::string get_num() override { return algo_name; } virtual std::shared_ptr set_args(const NodeList&, SymbolTable&, Interpreter&); - std::string repr() override { return get_num();} + std::string repr() override { return get_num(); } -protected: + protected: std::string algo_name; std::shared_ptr value; std::vector arg_names; }; -class AlgoValue: public BaseAlgoValue { -public: - AlgoValue(const std::string &_algo_name, std::shared_ptr _value) +class AlgoValue : public BaseAlgoValue { + public: + AlgoValue(const std::string& _algo_name, std::shared_ptr _value) : BaseAlgoValue(_algo_name, _value) {} - std::string get_num() override { return algo_name;} - std::string repr() override { return get_num();} - std::shared_ptr execute(const NodeList& args = {}, SymbolTable *parent = nullptr) override; + std::string get_num() override { return algo_name; } + std::string repr() override { return get_num(); } + std::shared_ptr execute(const NodeList& args = {}, + SymbolTable* parent = nullptr) override; friend class BoundMethodValue; // Expose value for friends/derived or public use if needed for method binding std::shared_ptr get_node_ptr() { return value; } const std::vector& get_arg_names() const { return arg_names; } -protected: + + protected: }; -class BuiltinAlgoValue: public BaseAlgoValue { -public: - BuiltinAlgoValue(const std::string &_algo_name, std::shared_ptr _value) +class BuiltinAlgoValue : public BaseAlgoValue { + public: + BuiltinAlgoValue(const std::string& _algo_name, std::shared_ptr _value) : BaseAlgoValue(_algo_name, _value) {} - std::string get_num() override { return algo_name;} - std::shared_ptr execute(const NodeList& args = {}, SymbolTable *parent = nullptr) override; + std::string get_num() override { return algo_name; } + std::shared_ptr execute(const NodeList& args = {}, + SymbolTable* parent = nullptr) override; std::shared_ptr execute_print(const std::string&); std::shared_ptr execute_read(); std::shared_ptr execute_read_line(); @@ -120,36 +120,40 @@ class BuiltinAlgoValue: public BaseAlgoValue { std::shared_ptr execute_int(const std::string&); std::shared_ptr execute_float(const std::string&); std::shared_ptr execute_string(const std::string&); - std::string repr() override { return get_num();} -protected: + std::string repr() override { return get_num(); } + + protected: }; class BoundMethodValue : public Value { -public: + public: BoundMethodValue(std::shared_ptr _obj, std::string _method_name) : Value(VALUE_ALGO), obj(_obj), method_name(_method_name) {} - std::shared_ptr execute(const NodeList& args = {}, SymbolTable *parent = nullptr) override; + std::shared_ptr execute(const NodeList& args = {}, + SymbolTable* parent = nullptr) override; std::string get_num() override { return method_name; } std::string repr() override { return ""; } -protected: + + protected: std::shared_ptr obj; std::string method_name; }; -class ArrayValue: public Value { -public: - ArrayValue(ValueList _value) - : Value(VALUE_ARRAY), value(_value) {} +class ArrayValue : public Value { + public: + ArrayValue(ValueList _value) : Value(VALUE_ARRAY), value(_value) {} std::string get_num() override; std::shared_ptr& operator[](int p); void push_back(std::shared_ptr); std::shared_ptr insert(int p, std::shared_ptr); std::shared_ptr remove(int p); std::shared_ptr pop_back(); - bool empty() const { return value.empty();} - std::shared_ptr& size() { return sz = std::make_shared>(VALUE_INT, value.size());}; - std::shared_ptr& back() { return value.back();}; - std::string repr() override { return get_num();} + bool empty() const { return value.empty(); } + std::shared_ptr& size() { + return sz = std::make_shared>(VALUE_INT, value.size()); + }; + std::shared_ptr& back() { return value.back(); }; + std::string repr() override { return get_num(); } void resize(int new_size) { if (new_size < 0) { @@ -161,20 +165,20 @@ class ArrayValue: public Value { size_t old_size = value.size(); value.resize(new_size); for (size_t i = old_size; i < static_cast(new_size); ++i) { - value[i] = std::make_shared(); // Fill with default Value + value[i] = std::make_shared(); // Fill with default Value } } } std::shared_ptr sz, error; -protected: + + protected: ValueList value; }; -class HashTableValue: public Value { -public: - HashTableValue() - : Value(VALUE_HASH_TABLE) {} +class HashTableValue : public Value { + public: + HashTableValue() : Value(VALUE_HASH_TABLE) {} std::string get_num() override; std::string repr() override { return get_num(); } std::shared_ptr get(std::shared_ptr key); @@ -186,7 +190,7 @@ class HashTableValue: public Value { std::shared_ptr values() const; void clear(); -protected: + protected: struct Entry { std::shared_ptr key; std::shared_ptr value; @@ -219,8 +223,9 @@ std::shared_ptr operator-(std::shared_ptr); std::shared_ptr operator!(std::shared_ptr); class StructValue : public Value { -public: - StructValue(const std::string& _name, const std::vector& _members, const std::map>& _methods) + public: + StructValue(const std::string& _name, const std::vector& _members, + const std::map>& _methods) : Value(VALUE_STRUCT), name(_name), members(_members), methods(_methods) {} std::string get_num() override { return name; } @@ -229,18 +234,20 @@ class StructValue : public Value { std::vector members; std::map> methods; std::string name; - std::shared_ptr execute(const NodeList& args = {}, SymbolTable *parent = nullptr) override; + std::shared_ptr execute(const NodeList& args = {}, + SymbolTable* parent = nullptr) override; }; class InstanceValue : public Value { -public: + public: InstanceValue(std::shared_ptr _struct_def) : Value(VALUE_INSTANCE), struct_def(_struct_def) {} std::string get_num() override { return struct_def->name + " Instance"; } std::string repr() override { return "name + ">"; } - std::shared_ptr get_member(const std::string& name, std::shared_ptr self = nullptr); + std::shared_ptr get_member(const std::string& name, + std::shared_ptr self = nullptr); void set_member(const std::string& name, std::shared_ptr val); std::shared_ptr struct_def; @@ -248,32 +255,31 @@ class InstanceValue : public Value { }; class ReturnValue : public Value { -public: - ReturnValue(std::shared_ptr _value) - : Value(VALUE_RETURN), value(_value) {} + public: + ReturnValue(std::shared_ptr _value) : Value(VALUE_RETURN), value(_value) {} std::string get_num() override { return value->get_num(); } std::string repr() override { return value->repr(); } std::shared_ptr get_value() { return value; } -protected: + + protected: std::shared_ptr value; }; class ControlValue : public Value { -public: - ControlValue(const std::string& _type) - : Value(_type) {} + public: + ControlValue(const std::string& _type) : Value(_type) {} }; // Wraps an already-evaluated value as an AST node so compiled code can reuse // interpreter execution paths that expect argument nodes (builtins, methods). -class PrecomputedNode: public Node { -public: - explicit PrecomputedNode(std::shared_ptr _value) - : value(_value) {} - std::string get_node() override { return "PRECOMPUTED";} - std::string get_type() override { return NODE_PRECOMPUTED;} - std::shared_ptr get_value() { return value;} -protected: +class PrecomputedNode : public Node { + public: + explicit PrecomputedNode(std::shared_ptr _value) : value(_value) {} + std::string get_node() override { return "PRECOMPUTED"; } + std::string get_type() override { return NODE_PRECOMPUTED; } + std::shared_ptr get_value() { return value; } + + protected: std::shared_ptr value; }; From 35ea4736b3243a66120d9626eb0fc0274cb53ec5 Mon Sep 17 00:00:00 2001 From: mtmatt Date: Wed, 10 Jun 2026 20:45:25 +0800 Subject: [PATCH 09/12] style: satisfy clang-tidy include-cleaner and naming rules in touched files Co-Authored-By: Claude Fable 5 --- pseudoc | Bin 845032 -> 845032 bytes src/compiler.cpp | 15 +++++++++++---- src/interpreter.cpp | 17 +++++++++++++---- src/pseudo.cpp | 21 ++++++++++++++++----- src/pseudoc.cpp | 7 ++++++- src/runtime.cpp | 4 +++- 6 files changed, 49 insertions(+), 15 deletions(-) diff --git a/pseudoc b/pseudoc index e722f99b4b067f7e325d5ef9e44cf96fce1dac27..333112da4675b96d2bd501adfbc4dce4ca2f2bb9 100755 GIT binary patch delta 27845 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 gv~g}aqAAXhp2M&|8wg3PC delta 27837 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 #include #include #include +#include #include #include +#include #include #include +#include +#include +#include #include +#include #include #include @@ -133,7 +140,7 @@ class CodeGen { // runtime Value) or nullptr when the node terminated the current block // (break/continue/return) or reported a compile error. llvm::Value* gen(const std::shared_ptr& node) { - const std::string type = node->get_type(); + std::string type = node->get_type(); if (type == NODE_VALUE) return gen_literal(node); if (type == NODE_VARACCESS) return gen_var_access(node); if (type == NODE_VARASSIGN) return gen_var_assign(node); @@ -419,7 +426,7 @@ class CodeGen { if (end == nullptr) return nullptr; builder.CreateCall(get_rt("rt_for_step_check", builder.getVoidTy(), {ptr_ty}), {step}); - const std::string var_name = child[0]->get_name(); + std::string var_name = child[0]->get_name(); llvm::AllocaInst* slot = entry_alloca(ptr_ty); builder.CreateStore(init, slot); @@ -518,7 +525,7 @@ class CodeGen { /// ---- functions and calls ---- llvm::Value* gen_algo_def(const std::shared_ptr& node) { - const std::string name = node->get_name(); + std::string name = node->get_name(); if (name.find("::") != std::string::npos) { error("compile error: Struct is not supported by the compiler yet", node); return nullptr; @@ -560,7 +567,7 @@ class CodeGen { auto* names_global = new llvm::GlobalVariable(module, names_ty, true, llvm::GlobalValue::PrivateLinkage, llvm::ConstantArray::get(names_ty, name_ptrs), "args"); - const bool memoizable = is_memoizable_numeric_algo(node, name, arg_names); + bool memoizable = is_memoizable_numeric_algo(node, name, arg_names); return builder.CreateCall( get_rt("rt_define_algo", ptr_ty, {ptr_ty, ptr_ty, ptr_ty, i64_ty, i64_ty}), {cstring(name), fn, names_global, diff --git a/src/interpreter.cpp b/src/interpreter.cpp index 0d17bfb..26a00e0 100644 --- a/src/interpreter.cpp +++ b/src/interpreter.cpp @@ -4,13 +4,22 @@ #include "interpreter.h" +#include +#include #include #include +#include #include +#include #include +#include #include +#include +#include +#include "jit.h" #include "node.h" +#include "token.h" #include "value.h" namespace { @@ -24,7 +33,7 @@ bool is_jit_root(const std::shared_ptr& node) { bool has_assignment_node(const std::shared_ptr& node) { if (!node) return false; - const std::string type = node->get_type(); + std::string type = node->get_type(); if (type == NODE_VARASSIGN || type == NODE_ARRASSIGN) { return true; } @@ -687,8 +696,8 @@ std::optional> Interpreter::try_visit_array_method_call( } NodeList member_child = call_node->get_child(); - const std::string method_name = member_child[1]->get_name(); - const bool supported_method = + std::string method_name = member_child[1]->get_name(); + bool supported_method = method_name == "push" || method_name == "push_back" || method_name == "pop" || method_name == "pop_back" || method_name == "resize" || method_name == "size" || method_name == "back" || method_name == "insert" || method_name == "remove"; @@ -824,7 +833,7 @@ std::shared_ptr Interpreter::bin_op(std::shared_ptr a, std::shared else if (op->get_type() == TOKEN_MOD) return a % b; else if (op->get_type() == TOKEN_POW) - return pow(a, b); + return pow(a, b); // NOLINT(misc-include-cleaner): value.h overload else if (op->get_type() == TOKEN_EQUAL) return a == b; else if (op->get_type() == TOKEN_NEQ) diff --git a/src/pseudo.cpp b/src/pseudo.cpp index 5cac55c..e2d69da 100644 --- a/src/pseudo.cpp +++ b/src/pseudo.cpp @@ -2,16 +2,23 @@ #include #include +#include +#include +#include #include #include #include +#include #include #include #include +#include #include +#include #include #include #include +#include #include #include "analysis.h" @@ -19,7 +26,11 @@ #include "error.h" #include "imports.h" #include "interpreter.h" +#include "jit.h" +#include "lexer.h" #include "node.h" +#include "parser.h" +#include "token.h" #include "value.h" /// -------------------- @@ -309,9 +320,9 @@ bool is_pure_numeric_node(const std::shared_ptr& node, const std::string& const std::unordered_set& arg_names) { if (!node) return false; - const std::string type = node->get_type(); + std::string type = node->get_type(); if (type == NODE_VALUE) { - const std::string token_type = node->get_tok()->get_type(); + std::string token_type = node->get_tok()->get_type(); return token_type == TOKEN_INT || token_type == TOKEN_FLOAT; } if (type == NODE_VARACCESS) { @@ -448,7 +459,7 @@ std::shared_ptr AlgoValue::execute(const NodeList& args, SymbolTable* par SymbolTable sym(parent); ScopeCleaner cleaner(sym); Interpreter interpreter(sym); - const std::size_t node_id = value->get_id(); + std::size_t node_id = value->get_id(); auto memoizable_found = memoizable_by_node.find(node_id); if (memoizable_found == memoizable_by_node.end()) { memoizable_found = @@ -474,7 +485,7 @@ std::shared_ptr AlgoValue::execute(const NodeList& args, SymbolTable* par evaluated_args.push_back(arg); } - const std::string cache_key = numeric_cache_key(evaluated_args); + std::string cache_key = numeric_cache_key(evaluated_args); if (!cache_key.empty()) { auto& cache = memoized_results[node_id]; auto cached = cache.find(cache_key); @@ -1119,7 +1130,7 @@ std::string trim(const std::string& str) { bool parse_import_line(const std::string& line, std::string& target) { std::string trimmed = trim(line); - const std::string keyword = "import"; + std::string keyword = "import"; if (trimmed.rfind(keyword, 0) != 0) { return false; } diff --git a/src/pseudoc.cpp b/src/pseudoc.cpp index 9c1bd2c..48ca45d 100644 --- a/src/pseudoc.cpp +++ b/src/pseudoc.cpp @@ -5,12 +5,16 @@ /// Compiles a .ps source file to a native executable: /// pseudoc [-o ] [--emit-llvm] [--runtime-lib ] +#include +#include #include #include #include +#include #include #include #include +#include #include #include #include @@ -23,8 +27,9 @@ #include #include #include -#include +#include #include +#include #include #include "compiler.h" diff --git a/src/runtime.cpp b/src/runtime.cpp index fc67757..e54b83e 100644 --- a/src/runtime.cpp +++ b/src/runtime.cpp @@ -4,11 +4,13 @@ #include "runtime.h" +#include #include #include #include #include #include +#include #include #include "color.h" @@ -178,7 +180,7 @@ Value* rt_bin_op(int64_t op, Value* a, Value* b) { case RT_OP_MOD: return track(lhs % rhs); case RT_OP_POW: - return track(pow(lhs, rhs)); + return track(pow(lhs, rhs)); // NOLINT(misc-include-cleaner): value.h overload case RT_OP_EQUAL: return track(lhs == rhs); case RT_OP_NEQ: From 0db39d56e95e847d0b330f488af5913306560117 Mon Sep 17 00:00:00 2001 From: mtmatt Date: Wed, 10 Jun 2026 22:41:18 +0800 Subject: [PATCH 10/12] feat: compile structs in LLVM backend --- README.md | 2 - .../specs/2026-06-10-llvm-compiler-design.md | 16 +-- src/compiler.cpp | 125 ++++++++++++++---- src/pseudo.cpp | 21 ++- src/runtime.cpp | 82 ++++++++++-- src/runtime.h | 5 + test/compiler_tests.sh | 13 +- 7 files changed, 190 insertions(+), 74 deletions(-) diff --git a/README.md b/README.md index f314a24..2b416a9 100644 --- a/README.md +++ b/README.md @@ -31,8 +31,6 @@ applies. Compiled output is verified against the interpreter by Current limitations: -- `Struct` definitions are not supported yet (clear compile-time error); - `import` of struct-based modules such as `dsa` therefore also fails. - A loop used as a function's implicit return value evaluates to `NONE` instead of the interpreter's collected per-iteration array. diff --git a/docs/superpowers/specs/2026-06-10-llvm-compiler-design.md b/docs/superpowers/specs/2026-06-10-llvm-compiler-design.md index bafbede..0a1f14b 100644 --- a/docs/superpowers/specs/2026-06-10-llvm-compiler-design.md +++ b/docs/superpowers/specs/2026-06-10-llvm-compiler-design.md @@ -86,6 +86,12 @@ its `shared_ptr` in the current frame. Frames are pushed/popped: `rt_index_assign` mirroring `visit_member_access`, `visit_array_access`, `visit_array_assign` (string 1-indexing, hash get/set, array element assignment). +- Struct definitions: in-struct methods compile to private algorithm functions + and runtime `CompiledAlgoValue`s, then `rt_define_struct` registers a + `StructValue` with member and method maps. Later `Algorithm Struct::method` + definitions compile as global algorithms and call `rt_struct_add_method` at + the definition site, matching the interpreter's attachment timing. Bound + instance method calls execute with a parent scope containing `self`. - Array literals: `rt_array_new` + `rt_array_push`. - Errors: any `rt_*` function that produces or receives a `VALUE_ERROR` prints `err->get_num()` (same text the interpreter prints at top level) and exits @@ -104,14 +110,6 @@ its `shared_ptr` in the current frame. Frames are pushed/popped: by-argument memoization via `rt_define_algo(..., memoizable)`, using the shared `is_memoizable_numeric_algo` analysis (src/analysis.h). -### Unsupported in v1 (clean compile-time error) - -- `Struct` definitions / instances (`NODE_STRUCTDEF`, member assignment on - instances). The compiler reports "compile error: Struct is not supported by - the compiler yet" with the source location. `import` works (textual - expansion before parsing), but importing a file that defines structs (e.g. - `dsa`) hits the same error. - ### Intrusive changes to existing code (kept minimal) 1. `Value` inherits `std::enable_shared_from_this` (value.h). @@ -157,7 +155,7 @@ with `pseudoc` and asserts its stdout equals `./pseudo file.ps` stdout. Coverage: arithmetic/comparison/logic on ints/floats/strings, arrays + methods, hash tables, string indexing, if/for/while/repeat with break/continue, recursion (fib), nested functions, argument-count errors, -runtime errors (index out of range), and the struct compile-error path. +runtime errors (index out of range), and struct construction/method calls. Existing `make test` (gtest) must keep passing. ## Performance expectation diff --git a/src/compiler.cpp b/src/compiler.cpp index 671db6b..ada0a8c 100644 --- a/src/compiler.cpp +++ b/src/compiler.cpp @@ -111,6 +111,37 @@ class CodeGen { return tmp.CreateAlloca(type); } + llvm::Value* string_array(const std::vector& strings, + const std::string& global_name) { + if (strings.empty()) { + return llvm::ConstantPointerNull::get(ptr_ty); + } + + llvm::ArrayType* strings_ty = llvm::ArrayType::get(ptr_ty, strings.size()); + std::vector string_ptrs; + string_ptrs.reserve(strings.size()); + for (const auto& value : strings) { + string_ptrs.push_back(llvm::cast(cstring(value))); + } + return new llvm::GlobalVariable(module, strings_ty, true, llvm::GlobalValue::PrivateLinkage, + llvm::ConstantArray::get(strings_ty, string_ptrs), + global_name); + } + + llvm::Value* value_array(const std::vector& values) { + if (values.empty()) { + return llvm::ConstantPointerNull::get(ptr_ty); + } + + llvm::ArrayType* values_ty = llvm::ArrayType::get(ptr_ty, values.size()); + llvm::AllocaInst* slots = entry_alloca(values_ty); + for (size_t i = 0; i < values.size(); ++i) { + builder.CreateStore(values[i], + builder.CreateConstInBoundsGEP2_64(values_ty, slots, 0, i)); + } + return slots; + } + void error(const std::string& message, const std::shared_ptr& node) { std::string suffix; std::shared_ptr tok = node ? node->get_tok() : nullptr; @@ -159,10 +190,7 @@ class CodeGen { if (type == NODE_RETURN) return gen_return(node); if (type == NODE_BREAK) return gen_loop_jump(node, true); if (type == NODE_CONTINUE) return gen_loop_jump(node, false); - if (type == NODE_STRUCTDEF) { - error("compile error: Struct is not supported by the compiler yet", node); - return nullptr; - } + if (type == NODE_STRUCTDEF) return gen_struct_def(node); error("compile error: unsupported statement " + type, node); return nullptr; } @@ -524,19 +552,8 @@ class CodeGen { /// ---- functions and calls ---- - llvm::Value* gen_algo_def(const std::shared_ptr& node) { - std::string name = node->get_name(); - if (name.find("::") != std::string::npos) { - error("compile error: Struct is not supported by the compiler yet", node); - return nullptr; - } - + llvm::Function* emit_algo_function(const std::shared_ptr& node, const std::string& name) { AlgorithmDefNode* def = dynamic_cast(node.get()); - std::vector arg_names; - for (const auto& tok : node->get_toks()) { - arg_names.push_back(tok->get_value()); - } - llvm::Function* fn = llvm::Function::Create( llvm::FunctionType::get(ptr_ty, false), llvm::Function::PrivateLinkage, "ps.algo." + std::to_string(algo_counter++) + "." + name, module); @@ -557,22 +574,46 @@ class CodeGen { if (!errors.empty()) { return nullptr; } + return fn; + } - // Registration happens at the definition site, like visit_algo_def. - llvm::ArrayType* names_ty = llvm::ArrayType::get(ptr_ty, arg_names.size()); - std::vector name_ptrs; - for (const auto& arg : arg_names) { - name_ptrs.push_back(llvm::cast(cstring(arg))); + llvm::Value* gen_algo_value(const std::shared_ptr& node, const std::string& name, + bool define_global) { + std::vector arg_names; + for (const auto& tok : node->get_toks()) { + arg_names.push_back(tok->get_value()); + } + + llvm::Function* fn = emit_algo_function(node, name); + if (fn == nullptr) { + return nullptr; } - auto* names_global = - new llvm::GlobalVariable(module, names_ty, true, llvm::GlobalValue::PrivateLinkage, - llvm::ConstantArray::get(names_ty, name_ptrs), "args"); + bool memoizable = is_memoizable_numeric_algo(node, name, arg_names); - return builder.CreateCall( - get_rt("rt_define_algo", ptr_ty, {ptr_ty, ptr_ty, ptr_ty, i64_ty, i64_ty}), - {cstring(name), fn, names_global, - builder.getInt64(static_cast(arg_names.size())), - builder.getInt64(memoizable ? 1 : 0)}); + std::string rt_name = define_global ? "rt_define_algo" : "rt_make_algo"; + return builder.CreateCall(get_rt(rt_name, ptr_ty, {ptr_ty, ptr_ty, ptr_ty, i64_ty, i64_ty}), + {cstring(name), fn, string_array(arg_names, "args"), + builder.getInt64(static_cast(arg_names.size())), + builder.getInt64(memoizable ? 1 : 0)}); + } + + llvm::Value* gen_algo_def(const std::shared_ptr& node) { + std::string name = node->get_name(); + size_t scope = name.find("::"); + if (scope == std::string::npos) { + // Registration happens at the definition site, like visit_algo_def. + return gen_algo_value(node, name, true); + } + + std::string struct_name = name.substr(0, scope); + std::string method_name = name.substr(scope + 2); + llvm::Value* method = gen_algo_value(node, name, true); + if (method == nullptr) { + return nullptr; + } + builder.CreateCall(get_rt("rt_struct_add_method", ptr_ty, {ptr_ty, ptr_ty, ptr_ty}), + {cstring(struct_name), cstring(method_name), method}); + return method; } llvm::Value* gen_algo_call(const std::shared_ptr& node) { @@ -607,6 +648,32 @@ class CodeGen { {callee, argv, builder.getInt64(static_cast(args.size()))}); } + llvm::Value* gen_struct_def(const std::shared_ptr& node) { + std::vector member_names; + for (const auto& tok : node->get_toks()) { + member_names.push_back(tok->get_value()); + } + + std::vector method_names; + std::vector methods; + for (const auto& method_node : node->get_child()) { + std::string method_name = method_node->get_name(); + llvm::Value* method = gen_algo_value(method_node, method_name, false); + if (method == nullptr) { + return nullptr; + } + method_names.push_back(method_name); + methods.push_back(method); + } + + return builder.CreateCall( + get_rt("rt_define_struct", ptr_ty, {ptr_ty, ptr_ty, i64_ty, ptr_ty, ptr_ty, i64_ty}), + {cstring(node->get_name()), string_array(member_names, "members"), + builder.getInt64(static_cast(member_names.size())), + string_array(method_names, "method.names"), value_array(methods), + builder.getInt64(static_cast(methods.size()))}); + } + /// ---- arrays, hash tables, members ---- llvm::Value* gen_array(const std::shared_ptr& node) { diff --git a/src/pseudo.cpp b/src/pseudo.cpp index e2d69da..80ed2f9 100644 --- a/src/pseudo.cpp +++ b/src/pseudo.cpp @@ -759,18 +759,17 @@ std::shared_ptr BoundMethodValue::execute(const NodeList& args, SymbolTab // Find method if (inst_obj->struct_def->methods.count(method_name)) { std::shared_ptr method = inst_obj->struct_def->methods[method_name]; - // method is likely AlgoValue. - // We need to execute it with 'self' in scope. - // We can use the existing AlgoValue::execute, but we need to inject - // 'self'. Since AlgoValue::execute creates a new symbol table, we can't - // inject it easily from outside *before* it starts unless we modify it or - // subclass it. However, we can create a new AlgoValue or wrapper that - // injects 'self'. - - // Actually, let's copy the logic of AlgoValue::execute here but add self. AlgoValue* algo_val = dynamic_cast(method.get()); - if (!algo_val) - return std::make_shared(VALUE_ERROR, "Method is not an algorithm"); + if (!algo_val) { + if (method->get_type() != VALUE_ALGO) { + return std::make_shared(VALUE_ERROR, "Method is not an algorithm"); + } + // Compiled struct methods use their own execute path, with + // `self` provided by this parent binding scope. + SymbolTable sym(parent); + sym.set("self", obj); + return method->execute(args, &sym); + } SymbolTable sym(parent); ScopeCleaner cleaner(sym); diff --git a/src/runtime.cpp b/src/runtime.cpp index e54b83e..cf3363d 100644 --- a/src/runtime.cpp +++ b/src/runtime.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include #include #include @@ -82,7 +83,40 @@ std::string numeric_args_key(const ValueList& values) { return key; } -std::shared_ptr call_compiled(CompiledAlgoValue* algo, const ValueList& args) { +std::shared_ptr make_compiled_algo(const char* name, Value* (*fn)(), + const char* const* arg_names, int64_t nargs, + int64_t memoizable) { + std::vector names; + names.reserve(nargs); + for (int64_t i = 0; i < nargs; ++i) { + names.emplace_back(arg_names[i]); + } + return std::make_shared(name, fn, std::move(names), memoizable != 0); +} + +void run_scope_destructors(SymbolTable& scope) { + if (!scope.has_instances()) { + return; + } + for (const auto& [name, val] : scope.get_symbols()) { + (void)name; + if (val->get_type() != VALUE_INSTANCE || val.use_count() != 1) { + continue; + } + InstanceValue* inst = dynamic_cast(val.get()); + std::shared_ptr self_ptr = val; + std::shared_ptr dtor = inst->get_member("destructor", self_ptr); + if (dtor->get_type() == VALUE_ALGO) { + std::shared_ptr ret = dtor->execute({}, scope.get_parent()); + if (ret->get_type() == VALUE_ERROR) { + rt_fail(ret); + } + } + } +} + +std::shared_ptr call_compiled(CompiledAlgoValue* algo, const ValueList& args, + SymbolTable* parent = nullptr) { if (args.size() < algo->arg_names.size()) { return std::make_shared( VALUE_ERROR, Color(0xFF, 0x39, 0x6E).get() + "Too few arguments" RESET); @@ -105,14 +139,15 @@ std::shared_ptr call_compiled(CompiledAlgoValue* algo, const ValueList& a int64_t mark = rt_frame_mark(); rt_frame_push(); - scopes.push_back(std::make_unique(¤t_scope())); + scopes.push_back(std::make_unique(parent != nullptr ? parent : ¤t_scope())); for (size_t i = 0; i < args.size(); ++i) { scopes.back()->set(algo->arg_names[i], args[i]); } Value* result = algo->fn(); std::shared_ptr kept = ref(result); - scopes.pop_back(); rt_frame_release(mark); + run_scope_destructors(*scopes.back()); + scopes.pop_back(); if (!memo_key.empty() && (kept->get_type() == VALUE_INT || kept->get_type() == VALUE_FLOAT)) { algo->memo[memo_key] = kept; } @@ -131,7 +166,7 @@ std::shared_ptr CompiledAlgoValue::execute(const NodeList& args, SymbolTa } evaluated.push_back(v); } - return call_compiled(this, evaluated); + return call_compiled(this, evaluated, &sym); } } // namespace @@ -296,19 +331,44 @@ Value* rt_member_assign(Value* obj, const char* name, Value* v) { VALUE_ERROR, "Assignment to member only supported for Struct Instances\n")); } +Value* rt_make_algo(const char* name, Value* (*fn)(), const char* const* arg_names, int64_t nargs, + int64_t memoizable) { + return track(make_compiled_algo(name, fn, arg_names, nargs, memoizable)); +} + Value* rt_define_algo(const char* name, Value* (*fn)(), const char* const* arg_names, int64_t nargs, int64_t memoizable) { - std::vector names; - names.reserve(nargs); - for (int64_t i = 0; i < nargs; ++i) { - names.emplace_back(arg_names[i]); - } - std::shared_ptr algo = - std::make_shared(name, fn, std::move(names), memoizable != 0); + std::shared_ptr algo = make_compiled_algo(name, fn, arg_names, nargs, memoizable); current_scope().set(name, algo); return track(algo); } +Value* rt_define_struct(const char* name, const char* const* member_names, int64_t nmembers, + const char* const* method_names, Value** methods, int64_t nmethods) { + std::vector members; + members.reserve(nmembers); + for (int64_t i = 0; i < nmembers; ++i) { + members.emplace_back(member_names[i]); + } + + std::map> method_map; + for (int64_t i = 0; i < nmethods; ++i) { + method_map[method_names[i]] = ref(methods[i]); + } + + std::shared_ptr struct_value = std::make_shared(name, members, method_map); + current_scope().set(name, struct_value); + return track(struct_value); +} + +Value* rt_struct_add_method(const char* struct_name, const char* method_name, Value* method) { + std::shared_ptr struct_value = current_scope().get(struct_name); + if (struct_value->get_type() == VALUE_STRUCT) { + dynamic_cast(struct_value.get())->methods[method_name] = ref(method); + } + return track(ref(method)); +} + Value* rt_call(Value* callee, Value** argv, int64_t argc) { ValueList args; args.reserve(argc); diff --git a/src/runtime.h b/src/runtime.h index d22d792..b2abacc 100644 --- a/src/runtime.h +++ b/src/runtime.h @@ -75,8 +75,13 @@ Value* rt_member_assign(Value* obj, const char* name, Value* v); // `memoizable` enables the same by-argument result caching the interpreter // applies to recursive pure-numeric algorithms. +Value* rt_make_algo(const char* name, Value* (*fn)(), const char* const* arg_names, int64_t nargs, + int64_t memoizable); Value* rt_define_algo(const char* name, Value* (*fn)(), const char* const* arg_names, int64_t nargs, int64_t memoizable); +Value* rt_define_struct(const char* name, const char* const* member_names, int64_t nmembers, + const char* const* method_names, Value** methods, int64_t nmethods); +Value* rt_struct_add_method(const char* struct_name, const char* method_name, Value* method); Value* rt_call(Value* callee, Value** argv, int64_t argc); int64_t rt_frame_mark(); diff --git a/test/compiler_tests.sh b/test/compiler_tests.sh index bc89477..64dbd67 100755 --- a/test/compiler_tests.sh +++ b/test/compiler_tests.sh @@ -24,6 +24,7 @@ FILES=( "$ROOT/test/test_repeat.ps" "$ROOT/test/test_array_methods.ps" "$ROOT/test/test_string_index.ps" + "$ROOT/test/test_struct.ps" ) failures=0 @@ -50,18 +51,6 @@ for src in "${FILES[@]}"; do fi done -# Struct programs must be rejected at compile time with a clear message. -if "$PSEUDOC" "$ROOT/test/test_struct.ps" -o "$WORKDIR/struct.bin" > "$WORKDIR/struct.out" 2>&1; then - echo "FAIL struct-rejection: expected compile error" - failures=$((failures + 1)) -elif ! grep -q "Struct is not supported" "$WORKDIR/struct.out"; then - echo "FAIL struct-rejection: wrong error message" - sed 's/^/ /' "$WORKDIR/struct.out" - failures=$((failures + 1)) -else - echo "PASS struct-rejection" -fi - if [[ $failures -ne 0 ]]; then echo "$failures test(s) failed" exit 1 From d53773a7aa77c3d36283b9ea42389e43bd215d63 Mon Sep 17 00:00:00 2001 From: mtmatt Date: Wed, 10 Jun 2026 22:44:23 +0800 Subject: [PATCH 11/12] chore: remove tracked pseudoc binary --- .gitignore | 1 + pseudoc | Bin 845032 -> 0 bytes 2 files changed, 1 insertion(+) delete mode 100755 pseudoc diff --git a/.gitignore b/.gitignore index 29beb8d..5e5b306 100644 --- a/.gitignore +++ b/.gitignore @@ -32,6 +32,7 @@ *.app shell pseudo +pseudoc pseudo-lsp run_tests diff --git a/pseudoc b/pseudoc deleted file mode 100755 index 333112da4675b96d2bd501adfbc4dce4ca2f2bb9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 845032 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 z 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%0A*kFo@nJ%?_ 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 Y$T5oM Date: Wed, 10 Jun 2026 23:59:41 +0800 Subject: [PATCH 12/12] style: fix node destructor formatting --- src/node.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/node.h b/src/node.h index 4f8f779..c717192 100644 --- a/src/node.h +++ b/src/node.h @@ -41,7 +41,7 @@ class Node { public: Node() : node_id(next_node_id.fetch_add(1, std::memory_order_relaxed)) {} virtual std::string get_node() = 0; - virtual ~Node() {}; + virtual ~Node() {} virtual std::vector> get_child() { return std::vector>(0); }