summaryrefslogtreecommitdiff
path: root/src/lib/core/parser.ts
diff options
context:
space:
mode:
authorKai Stevenson <kai@kaistevenson.com>2025-10-29 20:44:59 -0700
committerKai Stevenson <kai@kaistevenson.com>2025-10-29 20:44:59 -0700
commitf0ec687197f38e1ab52f3e69bd76849a51ed6436 (patch)
treeacb9bf4712ad49a19409efade6332188c32908e0 /src/lib/core/parser.ts
parentc20434533887618820985cbb25081255475852f2 (diff)
literals
Diffstat (limited to 'src/lib/core/parser.ts')
-rw-r--r--src/lib/core/parser.ts23
1 files changed, 18 insertions, 5 deletions
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)`>>;