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:
parent
86422888de
commit
fadf59c6aa
1 changed files with 19 additions and 3 deletions
|
|
@ -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 };
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue