summaryrefslogtreecommitdiff
path: root/src/lib/core
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/core')
-rw-r--r--src/lib/core/common.ts2
-rw-r--r--src/lib/core/lexer.ts19
-rw-r--r--src/lib/core/parser.ts23
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)`>>;