import { BUILTIN_Add, BUILTIN_Arr, BUILTIN_Mul, BUILTIN_ToString, } from "../builtin"; import { ASTNode, NodeType } from "./common"; import { Lex } from "./lexer"; import { Parse } from "./parser"; export type SENTINEL_NO_BUILTIN = "__NO_BUILTIN__"; export type MapBuiltins = Node["children"] extends infer Children extends readonly ASTNode[] ? { [Idx in keyof Children]: Children[Idx] extends ASTNode ? Evaluate : never; } extends infer Args extends readonly any[] ? Node["name"] extends "tostring" ? BUILTIN_ToString : Node["name"] extends "arr" ? BUILTIN_Arr : Node["name"] extends "add" ? BUILTIN_Add : Node["name"] extends "mul" ? BUILTIN_Mul : SENTINEL_NO_BUILTIN : never : never; export type EvalError = `Eval error: ${T}`; export type Evaluate = Node["type"] extends NodeType.INT ? Node["value"] : Node["type"] extends NodeType.EXT ? MapBuiltins : EvalError<`Unhandled node type ${Node["type"]}`>; const input = `` as const; const lex_result = null as unknown as Lex; const parse_result = null as unknown as Parse; const eval_result = null as unknown as Evaluate;