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:
parent
5b40e9d298
commit
216fe6bd30
7 changed files with 587 additions and 115 deletions
74
src/lexer.ts
74
src/lexer.ts
|
|
@ -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++;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue