parsing pattern matching
This commit is contained in:
parent
d81318333e
commit
7f94cfe8cd
4 changed files with 176 additions and 11 deletions
45
src/ast.ts
45
src/ast.ts
|
|
@ -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}}`;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue