aboutsummaryrefslogtreecommitdiff
path: root/AGENTS/PITFALLS.md
diff options
context:
space:
mode:
author_ov4 <ov4@ov4.org>2026-07-26 12:11:00 +0000
committer_ov4 <ov4@ov4.org>2026-07-26 12:11:00 +0000
commitfdef2814d0d7e65573d1b666ae9bc561fa35a9f9 (patch)
tree043b9dbe477f85c82bb334d68363bc70196a9d47 /AGENTS/PITFALLS.md
parent4a25b279d8f6c662fa8152cfe42e038d1ea06901 (diff)
refactor: extract ParseBlock/ParseExprList, resync-based error recovery
Seven copy-pasted statement-block loops collapse into ParseBlock(terminators); five comma-separated expression-list loops collapse into ParseExprList(close, allowEmpty), which also fixes "arr[1 2] <- x" being silently accepted as arr[1,2] on the statement path. Error recovery now lives in one place: syncToStatementStart skips to the next statement-start/block-end token, so a bad statement no longer swallows the first token of the following good one. Drop the dead -1000/-1001 token check in ParsePrototypeArgs. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Diffstat (limited to 'AGENTS/PITFALLS.md')
-rw-r--r--AGENTS/PITFALLS.md8
1 files changed, 4 insertions, 4 deletions
diff --git a/AGENTS/PITFALLS.md b/AGENTS/PITFALLS.md
index 393f507..cd8cc92 100644
--- a/AGENTS/PITFALLS.md
+++ b/AGENTS/PITFALLS.md
@@ -7,10 +7,10 @@ test programs.
- **STRING `=` / `<>` compares pointer identity, not contents.** No strcmp anywhere;
two equal heap strings compare unequal.
-- **OUTPUT takes exactly one expression.** `OUTPUT a, ", ", b` silently drops everything
- after the comma — and if the dropped tail ends in an identifier, error recovery also
- swallows the first token of the *next* statement. Concatenate with `&`. Similarly
- INPUT only accepts a plain identifier — no `INPUT arr[i]`.
+- **OUTPUT takes exactly one expression.** `OUTPUT a, ", ", b` prints `a`, then the
+ stray `, ", ", b` produces parse errors (recovery resyncs at the next statement
+ start, so following statements survive; the compile still fails). Concatenate with
+ `&`. Similarly INPUT only accepts a plain identifier — no `INPUT arr[i]`.
- **Arrays cannot cross function boundaries.** `ArrayTable` is never scoped; metadata
SSA values belong to the declaring function, so referencing another function's array
produces invalid IR, and arrays can't be parameters.