diff options
| -rw-r--r-- | src/lib/core/common.ts | 1 | ||||
| -rw-r--r-- | src/lib/core/eval.ts | 16 | ||||
| -rw-r--r-- | src/lib/core/parser.ts | 2 |
3 files changed, 8 insertions, 11 deletions
diff --git a/src/lib/core/common.ts b/src/lib/core/common.ts index 8cff899..c1a1dc3 100644 --- a/src/lib/core/common.ts +++ b/src/lib/core/common.ts @@ -28,7 +28,6 @@ export type LexerCtx = { }; export enum NodeType { - ROOT = "ROOT", INT = "INT", EXT = "EXT", PARSER_ERROR = "PARSER_ERROR", diff --git a/src/lib/core/eval.ts b/src/lib/core/eval.ts index 10cc23c..74801bf 100644 --- a/src/lib/core/eval.ts +++ b/src/lib/core/eval.ts @@ -26,6 +26,10 @@ export type UnarrayIfOnlyHead<T extends readonly any[]> = T extends [ ? Head : T; +export type BUILTIN_ARR<Args extends readonly ASTNode[]> = { + [Idx in keyof Args]: Args[Idx] extends ASTNode ? Evaluate<Args[Idx]> : never; +}; + export type BUILTIN_ToString<Args extends readonly ASTNode[]> = ToStringInner< UnarrayIfOnlyHead<{ [Idx in keyof Args]: Args[Idx] extends ASTNode @@ -38,25 +42,19 @@ export type BUILTIN_ToString<Args extends readonly ASTNode[]> = ToStringInner< export type SENTINEL_NO_BUILTIN = "__NO_BUILTIN__"; export type MapBuiltins<Node extends ASTNode> = Node["name"] extends "tostring" ? BUILTIN_ToString<Node["children"]> + : Node["name"] extends "arr" + ? BUILTIN_ARR<Node["children"]> : SENTINEL_NO_BUILTIN; export type EvalError<T extends string> = `Eval error: ${T}`; export type Evaluate<Node extends ASTNode> = Node["type"] extends NodeType.INT ? Node["value"] - : Node["type"] extends NodeType.ROOT - ? Node["children"] extends infer Children extends readonly ASTNode[] - ? UnarrayIfOnlyHead<{ - [Idx in keyof Children]: Children[Idx] extends ASTNode - ? Evaluate<Children[Idx]> - : never; - }> - : EvalError<`Unexpected error parsing children of ${Node["type"]}`> : Node["type"] extends NodeType.EXT ? MapBuiltins<Node> : EvalError<`Unhandled node type ${Node["type"]}`>; -const input = `tostring(5, 2)` as const; +const input = `5, arr(5000)` as const; const lex_result = null as unknown as Lex<typeof input>; const parse_result = null as unknown as Parse<typeof lex_result>; const eval_result = null as unknown as Evaluate<typeof parse_result>; diff --git a/src/lib/core/parser.ts b/src/lib/core/parser.ts index 27133b2..79218e9 100644 --- a/src/lib/core/parser.ts +++ b/src/lib/core/parser.ts @@ -214,7 +214,7 @@ export type _Parse<Ctx extends ParserCtx> = Ctx["remainingTokens"] extends [ export type Parse<Raw extends readonly Token[]> = _Parse<{ lastToken: null; remainingTokens: Raw; - stack: [ASTNode<NodeType.ROOT, "ROOT", null, []>]; + stack: [ASTNode<NodeType.EXT, "arr", null, []>]; }>; const test_result = null as unknown as Parse<Lex<`test(135)`>>; |
