summaryrefslogtreecommitdiff
path: root/src/lib/core/lexer.ts
blob: 3315fb2a042e8d6847019799059eb3f9e4fe0f82 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
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: "";
}>;