Fixing parsing matches, now we can grab full expressions in the body, reducing the need for parens to wrap multi-line match cases

This commit is contained in:
Dustin Swan 2026-02-03 21:52:13 -07:00
parent 86422888de
commit fadf59c6aa
No known key found for this signature in database
GPG key ID: 30D46587E2100467

View file

@ -128,6 +128,22 @@ export class Parser {
return expr;
}
// Used in match, doesn't match another match
private parseExpressionNoMatch(): AST {
// Lambda
if (this.isLambdaStart()) {
return this.parseLambda();
}
// Let
if (this.current().kind === 'ident' && this.peek().kind === 'equals') {
return this.parseLet();
}
return this.parseInfix();
}
private parseMatch(expr: AST): AST {
const cases: MatchCase[] = [];
@ -135,7 +151,7 @@ export class Parser {
this.advance();
const pattern = this.parsePattern();
this.expect('backslash');
const result = this.parseInfix();
const result = this.parseExpressionNoMatch();
cases.push({ pattern, result })
}
@ -265,9 +281,9 @@ export class Parser {
const nameToken = this.expect('ident');
const name = (nameToken as { value: string }).value;
this.expect('equals');
const value = this.parseExpression();
const value = this.parseExpressionNoMatch();
this.expect('semicolon');
const body = this.parseExpression();
const body = this.parseExpressionNoMatch();
return { kind: 'let', name, value, body };
}