Files
hakorune/docs/reference/language/statements.md
Selfhosting Dev af11c6855b 🚀 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>
2025-09-15 01:21:37 +09:00

2.5 KiB
Raw Blame History

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.
  • Oneline multistatements 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

// 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 (Stage1/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)。
  • Oneline multistatements: accept ; as statement separator, but formatter should prefer newlines.
  • Unary minus: disambiguate from binary minus; implement after Stage1当面は括弧で回避