parsing pattern matching

This commit is contained in:
Dustin Swan 2026-02-01 18:42:50 -07:00
parent d81318333e
commit 7f94cfe8cd
No known key found for this signature in database
GPG key ID: 30D46587E2100467
4 changed files with 176 additions and 11 deletions

View file

@ -127,7 +127,7 @@ export function prettyPrint(ast: AST, indent = 0): string {
switch (ast.kind) {
case 'literal':
return `${i}${ast.value.value}`;
return `${i}${ast.value}`;
case 'variable':
return `${i}${ast.name}`;
@ -154,17 +154,56 @@ export function prettyPrint(ast: AST, indent = 0): string {
return `${i}{${fields}}`;
case 'lambda':
const params = ast.params.join(', ')
const params = ast.params.join(', ');
return `${i}(${params}) => ${prettyPrint(ast.body)}`
case 'record-access':
return `${i}${prettyPrint(ast.record)}.${ast.field}`
return `${i}${prettyPrint(ast.record)}.${ast.field}`;
case 'record-update':
const updates = Object.entries(ast.updates).map(([k, v]) => `${k} = ${prettyPrint(v, 0)}`).join(', ');
return `${i}${prettyPrint(ast.record)} { ${updates} }`
case 'match':
const expr = prettyPrint(ast.expr, 0);
const cases = ast.cases
.map(c => ` | ${prettyPrintPattern(c.pattern)} -> ${prettyPrint(c.result, 0)}`)
.join('\n');
return `${i}match ${expr}\n${cases}`;
default:
return `${i}${ast.kind}`
}
}
function prettyPrintPattern(pattern: Pattern): string {
switch (pattern.kind) {
case 'wildcard':
return '_';
case 'var':
return pattern.name;
case 'literal':
return JSON.stringify(pattern.value);
case 'constructor':
if (pattern.args.length === 0) {
return pattern.name;
}
const args = pattern.args.map(prettyPrintPattern).join(' ');
return `(${pattern.name} ${args})`;
case 'list':
const elems = pattern.elements.map(prettyPrintPattern).join(', ');
return `[${elems}]`;
case 'record':
const fields = Object.entries(pattern.fields)
.map(([k, p]) => `${k} = ${prettyPrintPattern(p)}`)
.join(', ');
return `{${fields}}`;
}
}