Better errors!

This commit is contained in:
Dustin Swan 2026-02-04 21:21:52 -07:00
parent c44f06268f
commit 9d1b079361
No known key found for this signature in database
GPG key ID: 30D46587E2100467
8 changed files with 305 additions and 132 deletions

View file

@ -5,16 +5,25 @@ import type { Value } from './types';
export type Literal = {
kind: 'literal'
value: Value
line: number
column: number
start: number
}
export type Variable = {
kind: 'variable'
name: string
line: number
column: number
start: number
}
export type Constructor = {
kind: 'constructor'
name: string
line: number
column: number
start: number
}
// Functions
@ -23,12 +32,18 @@ export type Lambda = {
kind: 'lambda'
params: string[]
body: AST
line: number
column: number
start: number
}
export type Apply = {
kind: 'apply'
func: AST
args: AST[]
line: number
column: number
start: number
}
// Bindings
@ -38,6 +53,9 @@ export type Let = {
name: string
value: AST
body: AST
line: number
column: number
start: number
}
// Matching
@ -46,11 +64,17 @@ export type Match = {
kind: 'match'
expr: AST
cases: MatchCase[]
line: number
column: number
start: number
}
export type MatchCase = {
pattern: Pattern
result: AST
line: number
column: number
start: number
}
export type Pattern =
@ -64,26 +88,46 @@ export type Pattern =
// Data Structures
export type ListSpread = {
kind: 'list-spread'
spread: AST;
line: number;
column: number;
start: number;
}
export type List = {
kind: 'list'
elements: (AST | { spread: AST })[]
elements: (AST | ListSpread)[]
line: number
column: number
start: number
}
export type Record = {
kind: 'record'
fields: { [key: string]: AST }
line: number
column: number
start: number
}
export type RecordAccess = {
kind: 'record-access'
record: AST
field: string
line: number
column: number
start: number
}
export type RecordUpdate = {
kind: 'record-update'
record: AST
updates: { [key: string]: AST }
line: number
column: number
start: number
}
// Top-level constructs
@ -92,19 +136,27 @@ export type Definition = {
kind: 'definition'
name: string
body: AST
// type?: string // TODO
line: number
column: number
start: number
}
export type TypeDef = {
kind: 'typedef'
name: string
variants: Array<{ name: string, args: string[] }>
line: number
column: number
start: number
}
export type Import = {
kind: 'import'
module: string
items: string[] | 'all'
line: number
column: number
start: number
}
export type AST =
@ -119,6 +171,7 @@ export type AST =
| RecordAccess
| RecordUpdate
| List
| ListSpread
| Definition
| TypeDef
| Import
@ -183,7 +236,7 @@ export function prettyPrint(ast: AST, indent = 0): string {
return `${i}match ${expr}\n${cases}`;
default:
return `${i}${ast.kind}`
return `Unknown AST kind: ${i}${(ast as any).kind}`
}
}
@ -215,5 +268,7 @@ function prettyPrintPattern(pattern: Pattern): string {
.join(', ');
return `{${fields}}`;
default:
return `Unknown AST kind: ${(pattern as any).kind}`
}
}