diff options
| author | Kai Stevenson <kai@kaistevenson.com> | 2025-10-28 22:49:46 -0700 |
|---|---|---|
| committer | Kai Stevenson <kai@kaistevenson.com> | 2025-10-28 22:49:46 -0700 |
| commit | 8896b33a652563d90cb211a85dd2f7213f42e5d1 (patch) | |
| tree | e9adf51a2ccf91e58f5e8edae4d3d6a4bb03e986 /src/lib/core/lexer.ts | |
parse, lex works
Diffstat (limited to 'src/lib/core/lexer.ts')
| -rw-r--r-- | src/lib/core/lexer.ts | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/src/lib/core/lexer.ts b/src/lib/core/lexer.ts new file mode 100644 index 0000000..3315fb2 --- /dev/null +++ b/src/lib/core/lexer.ts @@ -0,0 +1,64 @@ +import { LexerCtx, Token, TokenType } from "./common"; + +export type BreakingToken = + | TokenType.OPEN_PAREN + | TokenType.CLOSE_PAREN + | TokenType.COMMA + | TokenType.SEMICOLON + | TokenType.SPACE; + +export type IsWhitespace<T> = T extends `${TokenType.SPACE}` + ? true + : T extends `${TokenType.COMMA}` + ? true + : T extends `${TokenType.SEMICOLON}` + ? true + : false; + +export type ProcessNameCollection< + Cur extends LexerCtx, + Tail extends string, + _Token extends Token | null +> = { + next: Tail; + nameCollection: ""; + tokens: _Token extends null + ? [ + ...Cur["tokens"], + ...(Cur["nameCollection"] extends "" + ? [] + : [Token<TokenType.UNIQUE_SYMBOL, Cur["nameCollection"]>]) + ] + : [ + ...Cur["tokens"], + ...(Cur["nameCollection"] extends "" + ? [_Token] + : [Token<TokenType.UNIQUE_SYMBOL, Cur["nameCollection"]>, _Token]) + ]; +}; + +export type IsOpen<T> = T extends `${TokenType.OPEN_PAREN}` ? true : false; +export type IsClose<T> = T extends `${TokenType.CLOSE_PAREN}` ? true : false; + +export type _Lex<Ctx extends LexerCtx> = + Ctx["next"] extends `${infer Head}${infer Tail}` + ? IsWhitespace<Head> extends true + ? _Lex<ProcessNameCollection<Ctx, Tail, null>> + : IsOpen<Head> extends true + ? _Lex<ProcessNameCollection<Ctx, Tail, Token<TokenType.OPEN_PAREN>>> + : IsClose<Head> extends true + ? _Lex<ProcessNameCollection<Ctx, Tail, Token<TokenType.CLOSE_PAREN>>> + : _Lex<{ + next: Tail; + nameCollection: `${Ctx["nameCollection"]}${Head}`; + tokens: Ctx["tokens"]; + }> + : // : Ctx["next"] extends `${infer Head}` + // ? _Lex<{ next: Head; tokens: Ctx["tokens"] }> + Ctx["tokens"]; + +export type Lex<Raw extends string> = _Lex<{ + next: `${Raw};`; + tokens: []; + nameCollection: ""; +}>; |
