Commit 94e0eb5
feat(syntax,parser): core match_expr dispatch + Pattern AST (#61)
Adds `ExprKind::Match { scrutinee, arms }` and `MatchArm { pattern,
guard, body }` to `ephapax-syntax`, extends `Pattern` with `Literal`
and `Constructor` variants (joining the existing Wildcard/Var/Pair/
Tuple/Unit), and adds `parse_match_expr_core` + `parse_pattern_core`
to the core parser. `Rule::match_expr` is now dispatched from both
`parse_expression` and `parse_single_expr_core`, so the example from
the issue — `match x of | Some(v) => v | None => 0 end` — parses
through the core parser direct path instead of failing with
`"Unexpected single_expr: match_expr"`.
This is option 1 from the issue (structured AST + Pattern, not
desugar-to-Case). The runtime path (surface → desugar → core)
continues to lower its own `SurfaceExprKind::Match` to nested
`ExprKind::Case`, so the surface pipeline is unaffected. The new
core variant exists for the core-parser-direct path and tooling
consumers that want the structured shape.
Downstream consumers (11 exhaustive `match ExprKind` sites across
the workspace):
Walking arms (subexpression-correct, sound for analyses):
- ephapax-analysis/src/{escape,free_vars,liveness}.rs — walk
scrutinee + each arm body with pattern's bound_vars in scope
- ephapax-linear/src/{linear,affine}.rs — walk subexprs with
pattern bindings; TODO marker for proper N-arm branch-agreement
- ephapax-wasm/src/lib.rs free-vars collector — walk subexprs
Stub-erroring (forward-compatible, honest about scope):
- ephapax-typing/src/lib.rs — new `TypeError::NotYetSupportedInCore`
variant; the typechecker tells callers to use the surface path
- ephapax-wasm/src/lib.rs compile_expr — emits `unreachable`
- ephapax-interp/src/lib.rs — returns `RuntimeError::Unimplemented`
Structured render:
- ephapax-ir/src/lib.rs — `(match scrutinee (arm <pattern> <body>)
...)` with a `pattern_to_sexpr` helper
Pass-through (find_let_binding_span):
- ephapax-lsp/src/main.rs — recurses through scrutinee + arms
Tests (parser-level, hits AC):
- `test_parse_core_match_constructor_and_var_patterns` — the AC
example with Some(v)/None
- `test_parse_core_match_wildcard_pattern` — `_` + literal arms
- `test_parse_module_with_core_match` — the AC example wrapped in a
module declaration, dispatched via parse_expression
Workspace lib tests: 294 pass, 0 fail.
Closes #61.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>1 parent 931cae5 commit 94e0eb5
12 files changed
Lines changed: 497 additions & 3 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
311 | 311 | | |
312 | 312 | | |
313 | 313 | | |
| 314 | + | |
| 315 | + | |
| 316 | + | |
| 317 | + | |
| 318 | + | |
| 319 | + | |
| 320 | + | |
| 321 | + | |
| 322 | + | |
| 323 | + | |
| 324 | + | |
| 325 | + | |
| 326 | + | |
| 327 | + | |
| 328 | + | |
| 329 | + | |
| 330 | + | |
| 331 | + | |
| 332 | + | |
| 333 | + | |
| 334 | + | |
| 335 | + | |
| 336 | + | |
314 | 337 | | |
315 | 338 | | |
316 | 339 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
374 | 374 | | |
375 | 375 | | |
376 | 376 | | |
| 377 | + | |
| 378 | + | |
| 379 | + | |
| 380 | + | |
| 381 | + | |
| 382 | + | |
| 383 | + | |
| 384 | + | |
| 385 | + | |
| 386 | + | |
| 387 | + | |
| 388 | + | |
| 389 | + | |
| 390 | + | |
| 391 | + | |
| 392 | + | |
| 393 | + | |
| 394 | + | |
| 395 | + | |
| 396 | + | |
| 397 | + | |
| 398 | + | |
| 399 | + | |
| 400 | + | |
| 401 | + | |
377 | 402 | | |
378 | 403 | | |
379 | 404 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
195 | 195 | | |
196 | 196 | | |
197 | 197 | | |
| 198 | + | |
| 199 | + | |
| 200 | + | |
| 201 | + | |
| 202 | + | |
| 203 | + | |
| 204 | + | |
| 205 | + | |
| 206 | + | |
| 207 | + | |
198 | 208 | | |
199 | 209 | | |
200 | 210 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
194 | 194 | | |
195 | 195 | | |
196 | 196 | | |
| 197 | + | |
| 198 | + | |
| 199 | + | |
| 200 | + | |
| 201 | + | |
| 202 | + | |
| 203 | + | |
| 204 | + | |
| 205 | + | |
| 206 | + | |
| 207 | + | |
| 208 | + | |
| 209 | + | |
| 210 | + | |
197 | 211 | | |
198 | 212 | | |
199 | 213 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
200 | 200 | | |
201 | 201 | | |
202 | 202 | | |
| 203 | + | |
| 204 | + | |
| 205 | + | |
| 206 | + | |
| 207 | + | |
| 208 | + | |
| 209 | + | |
| 210 | + | |
| 211 | + | |
| 212 | + | |
| 213 | + | |
| 214 | + | |
| 215 | + | |
| 216 | + | |
| 217 | + | |
203 | 218 | | |
204 | 219 | | |
205 | 220 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
477 | 477 | | |
478 | 478 | | |
479 | 479 | | |
| 480 | + | |
| 481 | + | |
| 482 | + | |
480 | 483 | | |
481 | 484 | | |
482 | 485 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
548 | 548 | | |
549 | 549 | | |
550 | 550 | | |
| 551 | + | |
| 552 | + | |
| 553 | + | |
| 554 | + | |
| 555 | + | |
| 556 | + | |
| 557 | + | |
| 558 | + | |
| 559 | + | |
| 560 | + | |
| 561 | + | |
| 562 | + | |
| 563 | + | |
| 564 | + | |
| 565 | + | |
| 566 | + | |
| 567 | + | |
| 568 | + | |
| 569 | + | |
| 570 | + | |
| 571 | + | |
| 572 | + | |
| 573 | + | |
| 574 | + | |
| 575 | + | |
| 576 | + | |
| 577 | + | |
| 578 | + | |
| 579 | + | |
| 580 | + | |
| 581 | + | |
| 582 | + | |
| 583 | + | |
| 584 | + | |
| 585 | + | |
| 586 | + | |
| 587 | + | |
| 588 | + | |
| 589 | + | |
| 590 | + | |
| 591 | + | |
| 592 | + | |
| 593 | + | |
| 594 | + | |
| 595 | + | |
| 596 | + | |
| 597 | + | |
| 598 | + | |
| 599 | + | |
| 600 | + | |
| 601 | + | |
| 602 | + | |
| 603 | + | |
| 604 | + | |
| 605 | + | |
551 | 606 | | |
552 | 607 | | |
553 | 608 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
732 | 732 | | |
733 | 733 | | |
734 | 734 | | |
| 735 | + | |
| 736 | + | |
| 737 | + | |
| 738 | + | |
| 739 | + | |
| 740 | + | |
| 741 | + | |
| 742 | + | |
| 743 | + | |
| 744 | + | |
735 | 745 | | |
736 | 746 | | |
737 | 747 | | |
| |||
0 commit comments