Better errors!
This commit is contained in:
parent
c44f06268f
commit
9d1b079361
8 changed files with 305 additions and 132 deletions
61
src/ast.ts
61
src/ast.ts
|
|
@ -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}`
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue