summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/lib/core/common.ts1
-rw-r--r--src/lib/core/eval.ts16
-rw-r--r--src/lib/core/parser.ts2
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)`>>;