diff options
Diffstat (limited to 'src/lib')
| -rw-r--r-- | src/lib/core/common.ts | 2 | ||||
| -rw-r--r-- | src/lib/core/lexer.ts | 19 | ||||
| -rw-r--r-- | src/lib/core/parser.ts | 23 |
3 files changed, 21 insertions, 23 deletions
diff --git a/src/lib/core/common.ts b/src/lib/core/common.ts index a17eff4..b5f494e 100644 --- a/src/lib/core/common.ts +++ b/src/lib/core/common.ts @@ -15,11 +15,9 @@ export enum TokenSubType { export type Token< Type extends TokenType = TokenType, - Subtype extends TokenSubType = TokenSubType, Name extends string = string > = { type: Type; - subType: Subtype; name: Name; }; diff --git a/src/lib/core/lexer.ts b/src/lib/core/lexer.ts index e9756bd..33a408a 100644 --- a/src/lib/core/lexer.ts +++ b/src/lib/core/lexer.ts @@ -7,7 +7,7 @@ export type BreakingToken = | TokenType.SEMICOLON | TokenType.SPACE; -export type IsWhitespace<T> = T extends `${TokenType.SPACE}` +export type IsWhitespace<T extends string> = T extends `${TokenType.SPACE}` ? true : T extends `${TokenType.COMMA}` ? true @@ -27,26 +27,13 @@ export type ProcessNameCollection< ...Ctx["tokens"], ...(Ctx["nameCollection"] extends "" ? [] - : [ - Token< - TokenType.NAME, - TokenSubType.REFERENCE, - Ctx["nameCollection"] - > - ]) + : [Token<TokenType.NAME, Ctx["nameCollection"]>]) ] : [ ...Ctx["tokens"], ...(Ctx["nameCollection"] extends "" ? [_Token] - : [ - Token< - TokenType.NAME, - TokenSubType.REFERENCE, - Ctx["nameCollection"] - >, - _Token - ]) + : [Token<TokenType.NAME, Ctx["nameCollection"]>, _Token]) ]; }; diff --git a/src/lib/core/parser.ts b/src/lib/core/parser.ts index 0f095fe..d608eca 100644 --- a/src/lib/core/parser.ts +++ b/src/lib/core/parser.ts @@ -107,10 +107,23 @@ export type StackWithoutLast<Stack extends ParserCtx["stack"]> = Stack extends [ ? [] : never; -export type ResolveNodeFromToken<_Token extends Token> = - _Token["subType"] extends TokenSubType.LITERAL - ? ASTNode<NodeType.INT, "UNNAMED", _Token["name"], []> - : ASTNode<NodeType.EXT, _Token["name"], null, []>; +type NULL_SENTINEL = { + NULL: true; +}; + +export type ParseNumberLiteral<T extends string> = + T extends `${infer Inner extends number}` ? Inner : NULL_SENTINEL; + +export type ParseStringLiteral<T extends string> = + T extends `"${infer Inner extends string}"` ? Inner : NULL_SENTINEL; + +export type ResolveNodeFromToken<_Token extends Token> = ParseNumberLiteral< + _Token["name"] +> extends number + ? ASTNode<NodeType.INT, "", ParseNumberLiteral<_Token["name"]>, []> + : ParseStringLiteral<_Token["name"]> extends string + ? ASTNode<NodeType.INT, "", ParseStringLiteral<_Token["name"]>, []> + : ASTNode<NodeType.EXT, _Token["name"], null, []>; export type _Parse<Ctx extends ParserCtx> = Ctx["remainingTokens"] extends [ infer Head extends Token, @@ -194,4 +207,4 @@ export type Parse<Raw extends readonly Token[]> = _Parse<{ stack: [ASTNode<NodeType.ROOT, "ROOT", null, []>]; }>; -const test_result = null as unknown as Parse<Lex<"test(a)">>; +const test_result = null as unknown as Parse<Lex<`test(135)`>>; |
