Adding builtins as native-functions. desugaring symbols as native function application. except ~ which is the new pipe operator, > is now greater than

This commit is contained in:
Dustin Swan 2026-02-02 20:10:32 -07:00
parent 5b40e9d298
commit 216fe6bd30
No known key found for this signature in database
GPG key ID: 30D46587E2100467
7 changed files with 587 additions and 115 deletions

View file

@ -14,13 +14,21 @@ export type Token =
| { kind: 'open-bracket' }
| { kind: 'close-bracket' }
// Symbols
// Comparison
| { kind: 'equals' }
| { kind: 'equals-equals' }
| { kind: 'not-equals' }
| { kind: 'greater-than' }
| { kind: 'greater-equals' }
| { kind: 'less-than' }
| { kind: 'less-equals' }
// Symbols
| { kind: 'colon' }
| { kind: 'semicolon' }
| { kind: 'backslash' }
| { kind: 'pipe' }
| { kind: 'greater-than' }
| { kind: 'tilde' }
| { kind: 'comma' }
| { kind: 'ampersand' }
| { kind: 'underscore' }
@ -32,6 +40,8 @@ export type Token =
| { kind: 'minus' }
| { kind: 'star' }
| { kind: 'slash' }
| { kind: 'percent' }
| { kind: 'caret' }
| { kind: 'eof' }
@ -137,25 +147,49 @@ export function tokenize(source: string): Token[] {
}
switch (char) {
// Brackets
case '(': tokens.push({ kind: 'open-paren' }); break;
case ')': tokens.push({ kind: 'close-paren' }); break;
case '{': tokens.push({ kind: 'open-brace' }); break;
case '}': tokens.push({ kind: 'close-brace' }); break;
case '[': tokens.push({ kind: 'open-bracket' }); break;
case ']': tokens.push({ kind: 'close-bracket' }); break;
// Symbols
case '=': tokens.push({ kind: 'equals' }); break;
case '>': {
if (source[i + 1] == '=') {
tokens.push({ kind: 'greater-equals' });
i++;
} else {
tokens.push({ kind: 'greater-than' });
}
break;
}
case '<': {
if (source[i + 1] == '=') {
tokens.push({ kind: 'less-equals' });
i++;
} else {
tokens.push({ kind: 'less-than' });
}
break;
}
case '=': {
if (source[i + 1] == '=') {
tokens.push({ kind: 'equals-equals' });
i++;
} else {
tokens.push({ kind: 'equals' });
}
break;
}
case '!': {
if (source[i + 1] == '=') {
tokens.push({ kind: 'not-equals' });
i++;
} else {
throw new Error(`Unexpected character: ${char}`)
}
break;
}
case ':': tokens.push({ kind: 'colon' }); break;
case ';': tokens.push({ kind: 'semicolon' }); break;
case '\\': tokens.push({ kind: 'backslash' }); break;
case '~': tokens.push({ kind: 'tilde' }); break;
case '|': tokens.push({ kind: 'pipe' }); break;
// case '<': tokens.push({ kind: 'less-than' }); break;
case '>': tokens.push({ kind: 'greater-than' }); break;
case ',': tokens.push({ kind: 'comma' }); break;
case '&': tokens.push({ kind: 'ampersand' }); break;
case '_': tokens.push({ kind: 'underscore' }); break;
case '.': tokens.push({ kind: 'dot' }); break;
case '@': tokens.push({ kind: 'at' }); break;
@ -164,6 +198,16 @@ export function tokenize(source: string): Token[] {
case '-': tokens.push({ kind: 'minus' }); break;
case '*': tokens.push({ kind: 'star' }); break;
case '/': tokens.push({ kind: 'slash' }); break;
case '^': tokens.push({ kind: 'caret' }); break;
case '%': tokens.push({ kind: 'percent' }); break;
// Brackets
case '(': tokens.push({ kind: 'open-paren' }); break;
case ')': tokens.push({ kind: 'close-paren' }); break;
case '{': tokens.push({ kind: 'open-brace' }); break;
case '}': tokens.push({ kind: 'close-brace' }); break;
case '[': tokens.push({ kind: 'open-bracket' }); break;
case ']': tokens.push({ kind: 'close-bracket' }); break;
}
i++;