🚀 Start Phase 15.3: Nyash compiler MVP implementation
Major milestone: - Set up apps/selfhost-compiler/ directory structure - Implement basic Nyash compiler in Nyash (CompilerBox) - Stage-1: Basic arithmetic parser (int/string/+/-/*/括弧/return) - JSON v0 output compatible with --ny-parser-pipe - Runner integration with NYASH_USE_NY_COMPILER=1 flag - Comprehensive smoke tests for PHI/Bridge/Stage-2 Technical updates: - Updated CLAUDE.md with Phase 15.3 status and MIR14 details - Statement separation policy: newline-based with minimal ASI - Fixed runaway ny-parser-pipe processes (CPU 94.9%) - Clarified MIR14 as canonical instruction set (not 13/18) - LoopForm strategy: PHI auto-generation during reverse lowering Collaborative development: - ChatGPT5 implementing compiler skeleton - Codex provided LoopForm PHI generation guidance - Claude maintaining documentation and coordination 🎉 セルフホスティングの歴史的一歩!自分自身をコンパイルする日が近いにゃ! Co-Authored-By: ChatGPT <noreply@openai.com>
This commit is contained in:
70
docs/reference/language/statements.md
Normal file
70
docs/reference/language/statements.md
Normal file
@ -0,0 +1,70 @@
|
||||
# Statement Separation and Semicolons
|
||||
|
||||
Status: Adopted for Phase 15.3+; parser implementation is staged.
|
||||
|
||||
Policy
|
||||
- Newline as primary statement separator.
|
||||
- Semicolons are optional and only needed when multiple statements appear on one physical line.
|
||||
- Minimal ASI (auto semicolon insertion) rules to avoid surprises.
|
||||
|
||||
Rules (minimal and predictable)
|
||||
- Newline ends a statement when:
|
||||
- Parenthesis/brace/bracket depth is 0, and
|
||||
- The line does not end with a continuation token (`+ - * / . ,` etc.).
|
||||
- Newline does NOT end a statement when:
|
||||
- Inside any open grouping `(...)`, `[...]`, `{...}`; or
|
||||
- The previous token is a continuation token.
|
||||
- `return/break/continue` end the statement at newline unless the value is on the same line or grouped via parentheses.
|
||||
- `if/else` (and similar paired constructs): do not insert a semicolon between a block and a following `else`.
|
||||
- One‑line multi‑statements are allowed with semicolons: `x = 1; y = 2; print(y)`.
|
||||
- Method chains can break across lines after a dot: `obj\n .method()` (newline treated as whitespace).
|
||||
|
||||
Style guidance
|
||||
- Prefer newline separation (no semicolons) for readability.
|
||||
- Use semicolons only when placing multiple statements on a single line.
|
||||
|
||||
Examples
|
||||
```nyash
|
||||
// Preferred (no semicolons)
|
||||
local x = 5
|
||||
x = x + 1
|
||||
print(x)
|
||||
|
||||
// One line with multiple statements (use semicolons)
|
||||
local x = 5; x = x + 1; print(x)
|
||||
|
||||
// Line continuation by operator
|
||||
local n = 1 +
|
||||
2 +
|
||||
3
|
||||
|
||||
// Grouping across lines
|
||||
return (
|
||||
1 + 2 + 3
|
||||
)
|
||||
|
||||
// if / else on separate lines without inserting a semicolon
|
||||
if cond {
|
||||
x = x - 1
|
||||
}
|
||||
else {
|
||||
print(x)
|
||||
}
|
||||
|
||||
// Dot chain across lines
|
||||
local v = obj
|
||||
.methodA()
|
||||
.methodB(42)
|
||||
```
|
||||
|
||||
Implementation notes (parser)
|
||||
- Tokenizer keeps track of grouping depth.
|
||||
- At newline, attempt ASI only when depth==0 and previous token is not a continuation.
|
||||
- Error messages should suggest adding a continuation token or grouping when a newline unexpectedly ends a statement.
|
||||
|
||||
Parser dev notes (Stage‑1/2)
|
||||
- return + newline: treat bare `return` as statement end. To return an expression on the next line, require grouping with parentheses.
|
||||
- if/else: never insert a semicolon between a closed block and `else` (ASI禁止箇所)。
|
||||
- Dot chains: treat `.` followed by newline as whitespace (line continuation)。
|
||||
- One‑line multi‑statements: accept `;` as statement separator, but formatter should prefer newlines.
|
||||
- Unary minus: disambiguate from binary minus; implement after Stage‑1(当面は括弧で回避)。
|
||||
Reference in New Issue
Block a user