@enspirit/elo 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +322 -0
- package/bin/elo +2 -0
- package/bin/eloc +2 -0
- package/dist/src/ast.d.ts +309 -0
- package/dist/src/ast.d.ts.map +1 -0
- package/dist/src/ast.js +173 -0
- package/dist/src/ast.js.map +1 -0
- package/dist/src/bindings/javascript.d.ts +17 -0
- package/dist/src/bindings/javascript.d.ts.map +1 -0
- package/dist/src/bindings/javascript.js +350 -0
- package/dist/src/bindings/javascript.js.map +1 -0
- package/dist/src/bindings/ruby.d.ts +20 -0
- package/dist/src/bindings/ruby.d.ts.map +1 -0
- package/dist/src/bindings/ruby.js +365 -0
- package/dist/src/bindings/ruby.js.map +1 -0
- package/dist/src/bindings/sql.d.ts +20 -0
- package/dist/src/bindings/sql.d.ts.map +1 -0
- package/dist/src/bindings/sql.js +319 -0
- package/dist/src/bindings/sql.js.map +1 -0
- package/dist/src/cli.d.ts +3 -0
- package/dist/src/cli.d.ts.map +1 -0
- package/dist/src/cli.js +225 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/compile.d.ts +47 -0
- package/dist/src/compile.d.ts.map +1 -0
- package/dist/src/compile.js +55 -0
- package/dist/src/compile.js.map +1 -0
- package/dist/src/compilers/javascript.d.ts +41 -0
- package/dist/src/compilers/javascript.d.ts.map +1 -0
- package/dist/src/compilers/javascript.js +323 -0
- package/dist/src/compilers/javascript.js.map +1 -0
- package/dist/src/compilers/ruby.d.ts +40 -0
- package/dist/src/compilers/ruby.d.ts.map +1 -0
- package/dist/src/compilers/ruby.js +326 -0
- package/dist/src/compilers/ruby.js.map +1 -0
- package/dist/src/compilers/sql.d.ts +37 -0
- package/dist/src/compilers/sql.d.ts.map +1 -0
- package/dist/src/compilers/sql.js +164 -0
- package/dist/src/compilers/sql.js.map +1 -0
- package/dist/src/elo.d.ts +3 -0
- package/dist/src/elo.d.ts.map +1 -0
- package/dist/src/elo.js +187 -0
- package/dist/src/elo.js.map +1 -0
- package/dist/src/eloc.d.ts +3 -0
- package/dist/src/eloc.d.ts.map +1 -0
- package/dist/src/eloc.js +232 -0
- package/dist/src/eloc.js.map +1 -0
- package/dist/src/eval.d.ts +3 -0
- package/dist/src/eval.d.ts.map +1 -0
- package/dist/src/eval.js +196 -0
- package/dist/src/eval.js.map +1 -0
- package/dist/src/index.d.ts +17 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +36 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/ir.d.ts +295 -0
- package/dist/src/ir.d.ts.map +1 -0
- package/dist/src/ir.js +224 -0
- package/dist/src/ir.js.map +1 -0
- package/dist/src/parser.d.ts +137 -0
- package/dist/src/parser.d.ts.map +1 -0
- package/dist/src/parser.js +1266 -0
- package/dist/src/parser.js.map +1 -0
- package/dist/src/preludes/index.d.ts +14 -0
- package/dist/src/preludes/index.d.ts.map +1 -0
- package/dist/src/preludes/index.js +27 -0
- package/dist/src/preludes/index.js.map +1 -0
- package/dist/src/runtime.d.ts +23 -0
- package/dist/src/runtime.d.ts.map +1 -0
- package/dist/src/runtime.js +326 -0
- package/dist/src/runtime.js.map +1 -0
- package/dist/src/stdlib.d.ts +121 -0
- package/dist/src/stdlib.d.ts.map +1 -0
- package/dist/src/stdlib.js +237 -0
- package/dist/src/stdlib.js.map +1 -0
- package/dist/src/transform.d.ts +38 -0
- package/dist/src/transform.d.ts.map +1 -0
- package/dist/src/transform.js +322 -0
- package/dist/src/transform.js.map +1 -0
- package/dist/src/typedefs.d.ts +50 -0
- package/dist/src/typedefs.d.ts.map +1 -0
- package/dist/src/typedefs.js +294 -0
- package/dist/src/typedefs.js.map +1 -0
- package/dist/src/types.d.ts +54 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +62 -0
- package/dist/src/types.js.map +1 -0
- package/package.json +66 -0
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Standard Library for Elo
|
|
4
|
+
*
|
|
5
|
+
* Provides a type-based dispatch system for function implementations.
|
|
6
|
+
* Each target compiler (JS, Ruby, SQL) defines its own implementations
|
|
7
|
+
* that are looked up by function name and argument types.
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.StdLib = void 0;
|
|
11
|
+
exports.signatureKey = signatureKey;
|
|
12
|
+
exports.formatSignature = formatSignature;
|
|
13
|
+
exports.typeGeneralizations = typeGeneralizations;
|
|
14
|
+
exports.binaryOp = binaryOp;
|
|
15
|
+
exports.simpleBinaryOp = simpleBinaryOp;
|
|
16
|
+
exports.unaryOp = unaryOp;
|
|
17
|
+
exports.methodCall = methodCall;
|
|
18
|
+
exports.nullary = nullary;
|
|
19
|
+
exports.unaryMethod = unaryMethod;
|
|
20
|
+
exports.isBinaryOp = isBinaryOp;
|
|
21
|
+
exports.rubyMethod = rubyMethod;
|
|
22
|
+
exports.fnCall = fnCall;
|
|
23
|
+
exports.helperCall = helperCall;
|
|
24
|
+
const types_1 = require("./types");
|
|
25
|
+
/**
|
|
26
|
+
* Create a signature key for lookup
|
|
27
|
+
* e.g., "add:int,int" or "neg:float"
|
|
28
|
+
*/
|
|
29
|
+
function signatureKey(name, argTypes) {
|
|
30
|
+
const typeNames = argTypes.map(types_1.typeName).join(',');
|
|
31
|
+
return typeNames ? `${name}:${typeNames}` : name;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Format a function signature for user-friendly error messages
|
|
35
|
+
* e.g., "foo(Int, String)" or "upper(Any)"
|
|
36
|
+
*/
|
|
37
|
+
function formatSignature(name, argTypes) {
|
|
38
|
+
const typeNames = argTypes.map(t => (0, types_1.typeName)(t).charAt(0).toUpperCase() + (0, types_1.typeName)(t).slice(1)).join(', ');
|
|
39
|
+
return `${name}(${typeNames})`;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Generate all generalizations of argument types by progressively replacing
|
|
43
|
+
* concrete types with 'any'. Returns type arrays in order from most specific
|
|
44
|
+
* to most general.
|
|
45
|
+
*
|
|
46
|
+
* For [int, float]: returns [int,float], [any,float], [int,any], [any,any]
|
|
47
|
+
* Types that are already 'any' don't generate additional combinations.
|
|
48
|
+
*/
|
|
49
|
+
function typeGeneralizations(argTypes) {
|
|
50
|
+
if (argTypes.length === 0)
|
|
51
|
+
return [[]];
|
|
52
|
+
// Find indices of non-any types
|
|
53
|
+
const concreteIndices = [];
|
|
54
|
+
for (let i = 0; i < argTypes.length; i++) {
|
|
55
|
+
if (!(0, types_1.typeEquals)(argTypes[i], types_1.Types.any)) {
|
|
56
|
+
concreteIndices.push(i);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
// Generate all subsets of concrete indices to replace with 'any'
|
|
60
|
+
// Start with empty subset (most specific) to full subset (most general)
|
|
61
|
+
const result = [];
|
|
62
|
+
const numSubsets = 1 << concreteIndices.length;
|
|
63
|
+
for (let mask = 0; mask < numSubsets; mask++) {
|
|
64
|
+
const generalized = [...argTypes];
|
|
65
|
+
for (let i = 0; i < concreteIndices.length; i++) {
|
|
66
|
+
if (mask & (1 << i)) {
|
|
67
|
+
generalized[concreteIndices[i]] = types_1.Types.any;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
result.push(generalized);
|
|
71
|
+
}
|
|
72
|
+
return result;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* A library of function implementations for a target language
|
|
76
|
+
*/
|
|
77
|
+
class StdLib {
|
|
78
|
+
constructor() {
|
|
79
|
+
this.implementations = new Map();
|
|
80
|
+
this.fallback = null;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Register an implementation for a specific signature
|
|
84
|
+
*/
|
|
85
|
+
register(name, argTypes, emitter) {
|
|
86
|
+
const key = signatureKey(name, argTypes);
|
|
87
|
+
this.implementations.set(key, emitter);
|
|
88
|
+
return this;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Register a fallback for unmatched signatures
|
|
92
|
+
*/
|
|
93
|
+
registerFallback(handler) {
|
|
94
|
+
this.fallback = handler;
|
|
95
|
+
return this;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Look up an implementation by signature.
|
|
99
|
+
* Tries progressively more general type signatures before giving up.
|
|
100
|
+
* For example, for add(int, float), tries:
|
|
101
|
+
* add(int, float) -> add(any, float) -> add(int, any) -> add(any, any)
|
|
102
|
+
*
|
|
103
|
+
* If any argument type is 'any' and no match is found through generalization,
|
|
104
|
+
* falls back to finding any implementation with matching name and arity.
|
|
105
|
+
* This allows functions like abs(any) to find abs(int) or abs(float).
|
|
106
|
+
*/
|
|
107
|
+
lookup(name, argTypes) {
|
|
108
|
+
// First try typeGeneralizations (concrete → any)
|
|
109
|
+
for (const generalized of typeGeneralizations(argTypes)) {
|
|
110
|
+
const key = signatureKey(name, generalized);
|
|
111
|
+
const impl = this.implementations.get(key);
|
|
112
|
+
if (impl)
|
|
113
|
+
return impl;
|
|
114
|
+
}
|
|
115
|
+
// If any argument type is 'any', try to find any implementation with matching arity
|
|
116
|
+
// This is the "type specialization" fallback for dynamically-typed contexts
|
|
117
|
+
if (argTypes.some(t => (0, types_1.typeEquals)(t, types_1.Types.any))) {
|
|
118
|
+
const arity = argTypes.length;
|
|
119
|
+
for (const [key, impl] of this.implementations) {
|
|
120
|
+
// Check if key matches: "name:type1,type2,..." or just "name" for nullary
|
|
121
|
+
const colonIdx = key.indexOf(':');
|
|
122
|
+
const keyName = colonIdx === -1 ? key : key.substring(0, colonIdx);
|
|
123
|
+
if (keyName !== name)
|
|
124
|
+
continue;
|
|
125
|
+
// Check arity matches
|
|
126
|
+
const keyArity = colonIdx === -1 ? 0 : key.substring(colonIdx + 1).split(',').length;
|
|
127
|
+
if (keyArity === arity) {
|
|
128
|
+
return impl;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
return undefined;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Emit code for a function call
|
|
136
|
+
*/
|
|
137
|
+
emit(name, args, argTypes, ctx) {
|
|
138
|
+
const impl = this.lookup(name, argTypes);
|
|
139
|
+
if (impl) {
|
|
140
|
+
return impl(args, ctx);
|
|
141
|
+
}
|
|
142
|
+
if (this.fallback) {
|
|
143
|
+
return this.fallback(name, args, argTypes, ctx);
|
|
144
|
+
}
|
|
145
|
+
throw new Error(`Unknown function ${formatSignature(name, argTypes)}`);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
exports.StdLib = StdLib;
|
|
149
|
+
/**
|
|
150
|
+
* Helper to create a binary operator emitter
|
|
151
|
+
*/
|
|
152
|
+
function binaryOp(op, format) {
|
|
153
|
+
return (args, ctx) => {
|
|
154
|
+
const left = ctx.emitWithParens(args[0], op, 'left');
|
|
155
|
+
const right = ctx.emitWithParens(args[1], op, 'right');
|
|
156
|
+
return format(left, right);
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Helper to create a simple binary operator that just joins with the operator
|
|
161
|
+
*/
|
|
162
|
+
function simpleBinaryOp(op) {
|
|
163
|
+
return binaryOp(op, (left, right) => `${left} ${op} ${right}`);
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Helper to create a unary operator emitter
|
|
167
|
+
*/
|
|
168
|
+
function unaryOp(format, needsParensCheck) {
|
|
169
|
+
return (args, ctx) => {
|
|
170
|
+
const operand = ctx.emit(args[0]);
|
|
171
|
+
const needsParens = needsParensCheck(args[0]);
|
|
172
|
+
return format(operand, needsParens);
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Helper for method call style: arg0.method(arg1)
|
|
177
|
+
*/
|
|
178
|
+
function methodCall(method) {
|
|
179
|
+
return (args, ctx) => {
|
|
180
|
+
const obj = ctx.emit(args[0]);
|
|
181
|
+
const arg = ctx.emit(args[1]);
|
|
182
|
+
return `${obj}.${method}(${arg})`;
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Helper for nullary function (no args)
|
|
187
|
+
*/
|
|
188
|
+
function nullary(value) {
|
|
189
|
+
return () => value;
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Helper for unary method call: arg0.method()
|
|
193
|
+
*/
|
|
194
|
+
function unaryMethod(method) {
|
|
195
|
+
return (args, ctx) => `${ctx.emit(args[0])}.${method}`;
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Check if an IR expression is a binary operation (needs parens for postfix method calls)
|
|
199
|
+
*/
|
|
200
|
+
function isBinaryOp(ir) {
|
|
201
|
+
if (ir.type !== 'call')
|
|
202
|
+
return false;
|
|
203
|
+
const binaryOps = ['add', 'sub', 'mul', 'div', 'mod', 'pow', 'lt', 'gt', 'lte', 'gte', 'eq', 'neq', 'and', 'or'];
|
|
204
|
+
return binaryOps.includes(ir.fn);
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Helper for Ruby-style postfix method call that wraps binary expressions in parens.
|
|
208
|
+
* Use for: arg0.method() where Ruby's precedence requires parens around binary ops.
|
|
209
|
+
*/
|
|
210
|
+
function rubyMethod(method) {
|
|
211
|
+
return (args, ctx) => {
|
|
212
|
+
const emitted = ctx.emit(args[0]);
|
|
213
|
+
const needsParens = isBinaryOp(args[0]);
|
|
214
|
+
return needsParens ? `(${emitted}).${method}` : `${emitted}.${method}`;
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Helper for function call style: fn(arg0, arg1, ...)
|
|
219
|
+
*/
|
|
220
|
+
function fnCall(fnName) {
|
|
221
|
+
return (args, ctx) => {
|
|
222
|
+
const emittedArgs = args.map(a => ctx.emit(a)).join(', ');
|
|
223
|
+
return `${fnName}(${emittedArgs})`;
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Helper for runtime helper function call (tracks the helper as required)
|
|
228
|
+
* Used for dynamically-typed operations that need runtime support.
|
|
229
|
+
*/
|
|
230
|
+
function helperCall(helperName) {
|
|
231
|
+
return (args, ctx) => {
|
|
232
|
+
ctx.requireHelper?.(helperName);
|
|
233
|
+
const emittedArgs = args.map(a => ctx.emit(a)).join(', ');
|
|
234
|
+
return `${helperName}(${emittedArgs})`;
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
//# sourceMappingURL=stdlib.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stdlib.js","sourceRoot":"","sources":["../../src/stdlib.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AST to IR transformation
|
|
3
|
+
*
|
|
4
|
+
* Transforms the parsed AST into a typed intermediate representation.
|
|
5
|
+
* This phase:
|
|
6
|
+
* - Assigns types to literals
|
|
7
|
+
* - Rewrites operators as typed function calls
|
|
8
|
+
* - Rewrites temporal keywords as function calls
|
|
9
|
+
* - Tracks variable types through let bindings
|
|
10
|
+
*/
|
|
11
|
+
import { Expr } from './ast';
|
|
12
|
+
import { IRExpr } from './ir';
|
|
13
|
+
import { EloType } from './types';
|
|
14
|
+
/**
|
|
15
|
+
* Type environment: maps variable names to their inferred types
|
|
16
|
+
*/
|
|
17
|
+
export type TypeEnv = Map<string, EloType>;
|
|
18
|
+
/**
|
|
19
|
+
* Set of function names currently being defined (to detect recursion)
|
|
20
|
+
*/
|
|
21
|
+
type DefiningSet = Set<string>;
|
|
22
|
+
/**
|
|
23
|
+
* Options for the transform function
|
|
24
|
+
*/
|
|
25
|
+
export interface TransformOptions {
|
|
26
|
+
maxDepth?: number;
|
|
27
|
+
/**
|
|
28
|
+
* If true, allow undefined variables (for SQL where they represent column names).
|
|
29
|
+
* If false (default), undefined variables throw an error to prevent access to host globals.
|
|
30
|
+
*/
|
|
31
|
+
allowUndefinedVariables?: boolean;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Transform an AST expression into IR
|
|
35
|
+
*/
|
|
36
|
+
export declare function transform(expr: Expr, env?: TypeEnv, defining?: DefiningSet, options?: TransformOptions): IRExpr;
|
|
37
|
+
export {};
|
|
38
|
+
//# sourceMappingURL=transform.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transform.d.ts","sourceRoot":"","sources":["../../src/transform.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC;AAC7B,OAAO,EACL,MAAM,EA4BP,MAAM,MAAM,CAAC;AAEd,OAAO,EAAE,OAAO,EAAS,MAAM,SAAS,CAAC;AAGzC;;GAEG;AACH,MAAM,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE3C;;GAEG;AACH,KAAK,WAAW,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC;AAE/B;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,uBAAuB,CAAC,EAAE,OAAO,CAAC;CACnC;AAID;;GAEG;AACH,wBAAgB,SAAS,CACvB,IAAI,EAAE,IAAI,EACV,GAAG,GAAE,OAAmB,EACxB,QAAQ,GAAE,WAAuB,EACjC,OAAO,GAAE,gBAAqB,GAC7B,MAAM,CAIR"}
|
|
@@ -0,0 +1,322 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* AST to IR transformation
|
|
4
|
+
*
|
|
5
|
+
* Transforms the parsed AST into a typed intermediate representation.
|
|
6
|
+
* This phase:
|
|
7
|
+
* - Assigns types to literals
|
|
8
|
+
* - Rewrites operators as typed function calls
|
|
9
|
+
* - Rewrites temporal keywords as function calls
|
|
10
|
+
* - Tracks variable types through let bindings
|
|
11
|
+
*/
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.transform = transform;
|
|
14
|
+
const ir_1 = require("./ir");
|
|
15
|
+
const types_1 = require("./types");
|
|
16
|
+
const typedefs_1 = require("./typedefs");
|
|
17
|
+
const DEFAULT_MAX_DEPTH = 100;
|
|
18
|
+
/**
|
|
19
|
+
* Transform an AST expression into IR
|
|
20
|
+
*/
|
|
21
|
+
function transform(expr, env = new Map(), defining = new Set(), options = {}) {
|
|
22
|
+
const maxDepth = options.maxDepth ?? DEFAULT_MAX_DEPTH;
|
|
23
|
+
const allowUndefinedVariables = options.allowUndefinedVariables ?? false;
|
|
24
|
+
return transformWithDepth(expr, env, defining, 0, maxDepth, allowUndefinedVariables);
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Internal transform function that tracks depth
|
|
28
|
+
*/
|
|
29
|
+
function transformWithDepth(expr, env, defining, depth, maxDepth, allowUndefinedVariables) {
|
|
30
|
+
if (depth > maxDepth) {
|
|
31
|
+
throw new Error(`Maximum transform depth exceeded (${maxDepth})`);
|
|
32
|
+
}
|
|
33
|
+
const nextDepth = depth + 1;
|
|
34
|
+
const recurse = (e, newEnv = env, newDefining = defining) => transformWithDepth(e, newEnv, newDefining, nextDepth, maxDepth, allowUndefinedVariables);
|
|
35
|
+
switch (expr.type) {
|
|
36
|
+
case 'literal':
|
|
37
|
+
return transformLiteral(expr.value);
|
|
38
|
+
case 'string':
|
|
39
|
+
return (0, ir_1.irString)(expr.value);
|
|
40
|
+
case 'null':
|
|
41
|
+
return (0, ir_1.irNull)();
|
|
42
|
+
case 'date':
|
|
43
|
+
return (0, ir_1.irDate)(expr.value);
|
|
44
|
+
case 'datetime':
|
|
45
|
+
return (0, ir_1.irDateTime)(expr.value);
|
|
46
|
+
case 'duration':
|
|
47
|
+
return (0, ir_1.irDuration)(expr.value);
|
|
48
|
+
case 'variable':
|
|
49
|
+
// Allow _ (input variable) and variables defined in scope
|
|
50
|
+
// Reject undefined variables to prevent access to host globals (unless allowUndefinedVariables is set)
|
|
51
|
+
if (!allowUndefinedVariables && expr.name !== '_' && !env.has(expr.name)) {
|
|
52
|
+
throw new Error(`Undefined variable: '${expr.name}'`);
|
|
53
|
+
}
|
|
54
|
+
return (0, ir_1.irVariable)(expr.name, env.get(expr.name) ?? types_1.Types.any);
|
|
55
|
+
case 'binary':
|
|
56
|
+
return transformBinaryOp(expr.operator, expr.left, expr.right, env, defining, nextDepth, maxDepth, allowUndefinedVariables);
|
|
57
|
+
case 'unary':
|
|
58
|
+
return transformUnaryOp(expr.operator, expr.operand, env, defining, nextDepth, maxDepth, allowUndefinedVariables);
|
|
59
|
+
case 'temporal_keyword':
|
|
60
|
+
return transformTemporalKeyword(expr.keyword);
|
|
61
|
+
case 'function_call':
|
|
62
|
+
return transformFunctionCall(expr.name, expr.args, env, defining, nextDepth, maxDepth, allowUndefinedVariables);
|
|
63
|
+
case 'member_access':
|
|
64
|
+
return (0, ir_1.irMemberAccess)(recurse(expr.object), expr.property);
|
|
65
|
+
case 'let':
|
|
66
|
+
return transformLet(expr.bindings, expr.body, env, defining, nextDepth, maxDepth, allowUndefinedVariables);
|
|
67
|
+
case 'if':
|
|
68
|
+
return (0, ir_1.irIf)(recurse(expr.condition), recurse(expr.then), recurse(expr.else));
|
|
69
|
+
case 'lambda':
|
|
70
|
+
return transformLambda(expr.params, expr.body, env, defining, nextDepth, maxDepth, allowUndefinedVariables);
|
|
71
|
+
case 'object':
|
|
72
|
+
return (0, ir_1.irObject)(expr.properties.map((prop) => ({
|
|
73
|
+
key: prop.key,
|
|
74
|
+
value: recurse(prop.value),
|
|
75
|
+
})));
|
|
76
|
+
case 'array':
|
|
77
|
+
return (0, ir_1.irArray)(expr.elements.map((el) => recurse(el)));
|
|
78
|
+
case 'alternative':
|
|
79
|
+
return transformAlternative(expr.alternatives, env, defining, nextDepth, maxDepth, allowUndefinedVariables);
|
|
80
|
+
case 'apply': {
|
|
81
|
+
const fnIR = recurse(expr.fn);
|
|
82
|
+
const argsIR = expr.args.map((arg) => recurse(arg));
|
|
83
|
+
const argTypes = argsIR.map(ir_1.inferType);
|
|
84
|
+
return (0, ir_1.irApply)(fnIR, argsIR, argTypes, types_1.Types.any);
|
|
85
|
+
}
|
|
86
|
+
case 'datapath':
|
|
87
|
+
return (0, ir_1.irDataPath)(expr.segments);
|
|
88
|
+
case 'typedef': {
|
|
89
|
+
// Transform type definition
|
|
90
|
+
const irTypeExpr = transformTypeExprWithContext(expr.typeExpr, env, defining, nextDepth, maxDepth, allowUndefinedVariables);
|
|
91
|
+
// Add type name to environment as a parser function type
|
|
92
|
+
const newEnv = new Map(env);
|
|
93
|
+
newEnv.set(expr.name, types_1.Types.fn);
|
|
94
|
+
const bodyIR = transformWithDepth(expr.body, newEnv, defining, nextDepth, maxDepth, allowUndefinedVariables);
|
|
95
|
+
return (0, ir_1.irTypeDef)(expr.name, irTypeExpr, bodyIR);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Transform an AST type expression to IR type expression
|
|
101
|
+
*/
|
|
102
|
+
function transformTypeExprWithContext(typeExpr, env, defining, depth, maxDepth, allowUndefinedVariables) {
|
|
103
|
+
switch (typeExpr.kind) {
|
|
104
|
+
case 'type_ref':
|
|
105
|
+
return (0, ir_1.irTypeRef)(typeExpr.name);
|
|
106
|
+
case 'type_schema': {
|
|
107
|
+
const props = typeExpr.properties.map(prop => ({
|
|
108
|
+
key: prop.key,
|
|
109
|
+
typeExpr: transformTypeExprWithContext(prop.typeExpr, env, defining, depth, maxDepth, allowUndefinedVariables),
|
|
110
|
+
optional: prop.optional,
|
|
111
|
+
}));
|
|
112
|
+
// Transform extras if it's a TypeExpr, otherwise pass through as-is
|
|
113
|
+
let extras;
|
|
114
|
+
if (typeExpr.extras === 'closed' || typeExpr.extras === 'ignored' || typeExpr.extras === undefined) {
|
|
115
|
+
extras = typeExpr.extras;
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
extras = transformTypeExprWithContext(typeExpr.extras, env, defining, depth, maxDepth, allowUndefinedVariables);
|
|
119
|
+
}
|
|
120
|
+
return (0, ir_1.irTypeSchema)(props, extras);
|
|
121
|
+
}
|
|
122
|
+
case 'subtype_constraint': {
|
|
123
|
+
// Transform the base type
|
|
124
|
+
const baseTypeIR = transformTypeExprWithContext(typeExpr.baseType, env, defining, depth, maxDepth, allowUndefinedVariables);
|
|
125
|
+
// Transform the constraint with the variable in scope
|
|
126
|
+
const constraintEnv = new Map(env);
|
|
127
|
+
constraintEnv.set(typeExpr.variable, types_1.Types.any);
|
|
128
|
+
const constraintIR = transformWithDepth(typeExpr.constraint, constraintEnv, defining, depth, maxDepth, allowUndefinedVariables);
|
|
129
|
+
return (0, ir_1.irSubtypeConstraint)(baseTypeIR, typeExpr.variable, constraintIR);
|
|
130
|
+
}
|
|
131
|
+
case 'array_type':
|
|
132
|
+
return (0, ir_1.irArrayType)(transformTypeExprWithContext(typeExpr.elementType, env, defining, depth, maxDepth, allowUndefinedVariables));
|
|
133
|
+
case 'union_type':
|
|
134
|
+
return (0, ir_1.irUnionType)(typeExpr.types.map(t => transformTypeExprWithContext(t, env, defining, depth, maxDepth, allowUndefinedVariables)));
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Transform a literal value (number or boolean)
|
|
139
|
+
*/
|
|
140
|
+
function transformLiteral(value) {
|
|
141
|
+
if (typeof value === 'boolean') {
|
|
142
|
+
return (0, ir_1.irBool)(value);
|
|
143
|
+
}
|
|
144
|
+
// Distinguish int from float
|
|
145
|
+
if (Number.isInteger(value)) {
|
|
146
|
+
return (0, ir_1.irInt)(value);
|
|
147
|
+
}
|
|
148
|
+
return (0, ir_1.irFloat)(value);
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Transform a binary operator into a typed function call
|
|
152
|
+
*/
|
|
153
|
+
function transformBinaryOp(operator, left, right, env, defining, depth, maxDepth, allowUndefinedVariables) {
|
|
154
|
+
const leftIR = transformWithDepth(left, env, defining, depth, maxDepth, allowUndefinedVariables);
|
|
155
|
+
const rightIR = transformWithDepth(right, env, defining, depth, maxDepth, allowUndefinedVariables);
|
|
156
|
+
const leftType = (0, ir_1.inferType)(leftIR);
|
|
157
|
+
const rightType = (0, ir_1.inferType)(rightIR);
|
|
158
|
+
const fn = opNameMap[operator];
|
|
159
|
+
if (!fn) {
|
|
160
|
+
throw new Error(`Unknown binary operator: ${operator}`);
|
|
161
|
+
}
|
|
162
|
+
const resultType = typedefs_1.eloTypeDefs.lookup(fn, [leftType, rightType]);
|
|
163
|
+
return (0, ir_1.irCall)(fn, [leftIR, rightIR], [leftType, rightType], resultType);
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Transform a unary operator into a typed function call
|
|
167
|
+
*/
|
|
168
|
+
function transformUnaryOp(operator, operand, env, defining, depth, maxDepth, allowUndefinedVariables) {
|
|
169
|
+
const operandIR = transformWithDepth(operand, env, defining, depth, maxDepth, allowUndefinedVariables);
|
|
170
|
+
const operandType = (0, ir_1.inferType)(operandIR);
|
|
171
|
+
const fn = unaryOpNameMap[operator];
|
|
172
|
+
if (!fn) {
|
|
173
|
+
throw new Error(`Unknown unary operator: ${operator}`);
|
|
174
|
+
}
|
|
175
|
+
const resultType = typedefs_1.eloTypeDefs.lookup(fn, [operandType]);
|
|
176
|
+
return (0, ir_1.irCall)(fn, [operandIR], [operandType], resultType);
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Transform a temporal keyword into a function call
|
|
180
|
+
*/
|
|
181
|
+
function transformTemporalKeyword(keyword) {
|
|
182
|
+
const today = () => (0, ir_1.irCall)('today', [], [], types_1.Types.date);
|
|
183
|
+
const now = () => (0, ir_1.irCall)('now', [], [], types_1.Types.datetime);
|
|
184
|
+
switch (keyword) {
|
|
185
|
+
case 'TODAY':
|
|
186
|
+
return today();
|
|
187
|
+
case 'NOW':
|
|
188
|
+
return now();
|
|
189
|
+
case 'TOMORROW':
|
|
190
|
+
return (0, ir_1.irCall)('add', [today(), (0, ir_1.irDuration)('P1D')], [types_1.Types.date, types_1.Types.duration], types_1.Types.date);
|
|
191
|
+
case 'YESTERDAY':
|
|
192
|
+
return (0, ir_1.irCall)('sub', [today(), (0, ir_1.irDuration)('P1D')], [types_1.Types.date, types_1.Types.duration], types_1.Types.date);
|
|
193
|
+
case 'SOD':
|
|
194
|
+
return (0, ir_1.irCall)('start_of_day', [now()], [types_1.Types.datetime], types_1.Types.datetime);
|
|
195
|
+
case 'EOD':
|
|
196
|
+
return (0, ir_1.irCall)('end_of_day', [now()], [types_1.Types.datetime], types_1.Types.datetime);
|
|
197
|
+
case 'SOW':
|
|
198
|
+
return (0, ir_1.irCall)('start_of_week', [now()], [types_1.Types.datetime], types_1.Types.datetime);
|
|
199
|
+
case 'EOW':
|
|
200
|
+
return (0, ir_1.irCall)('end_of_week', [now()], [types_1.Types.datetime], types_1.Types.datetime);
|
|
201
|
+
case 'SOM':
|
|
202
|
+
return (0, ir_1.irCall)('start_of_month', [now()], [types_1.Types.datetime], types_1.Types.datetime);
|
|
203
|
+
case 'EOM':
|
|
204
|
+
return (0, ir_1.irCall)('end_of_month', [now()], [types_1.Types.datetime], types_1.Types.datetime);
|
|
205
|
+
case 'SOQ':
|
|
206
|
+
return (0, ir_1.irCall)('start_of_quarter', [now()], [types_1.Types.datetime], types_1.Types.datetime);
|
|
207
|
+
case 'EOQ':
|
|
208
|
+
return (0, ir_1.irCall)('end_of_quarter', [now()], [types_1.Types.datetime], types_1.Types.datetime);
|
|
209
|
+
case 'SOY':
|
|
210
|
+
return (0, ir_1.irCall)('start_of_year', [now()], [types_1.Types.datetime], types_1.Types.datetime);
|
|
211
|
+
case 'EOY':
|
|
212
|
+
return (0, ir_1.irCall)('end_of_year', [now()], [types_1.Types.datetime], types_1.Types.datetime);
|
|
213
|
+
case 'BOT':
|
|
214
|
+
return (0, ir_1.irCall)('bot', [], [], types_1.Types.datetime);
|
|
215
|
+
case 'EOT':
|
|
216
|
+
return (0, ir_1.irCall)('eot', [], [], types_1.Types.datetime);
|
|
217
|
+
default:
|
|
218
|
+
throw new Error(`Unknown temporal keyword: ${keyword}`);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Transform a function call
|
|
223
|
+
*
|
|
224
|
+
* If the function name is a variable in the environment (i.e., a lambda),
|
|
225
|
+
* we emit an 'apply' node. Otherwise, we emit a 'call' to the stdlib.
|
|
226
|
+
*/
|
|
227
|
+
function transformFunctionCall(name, args, env, defining, depth, maxDepth, allowUndefinedVariables) {
|
|
228
|
+
// Check for recursive call
|
|
229
|
+
if (defining.has(name)) {
|
|
230
|
+
throw new Error(`Recursive function calls are not allowed: '${name}' cannot call itself`);
|
|
231
|
+
}
|
|
232
|
+
const argsIR = args.map((arg) => transformWithDepth(arg, env, defining, depth, maxDepth, allowUndefinedVariables));
|
|
233
|
+
const argTypes = argsIR.map(ir_1.inferType);
|
|
234
|
+
// Check if the name is a variable holding a lambda
|
|
235
|
+
const varType = env.get(name);
|
|
236
|
+
if (varType && varType.kind === 'fn') {
|
|
237
|
+
// Lambda application: emit irApply
|
|
238
|
+
const fnVar = (0, ir_1.irVariable)(name, varType);
|
|
239
|
+
return (0, ir_1.irApply)(fnVar, argsIR, argTypes, types_1.Types.any);
|
|
240
|
+
}
|
|
241
|
+
// stdlib function call
|
|
242
|
+
const resultType = typedefs_1.eloTypeDefs.lookup(name, argTypes);
|
|
243
|
+
return (0, ir_1.irCall)(name, argsIR, argTypes, resultType);
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Transform a let expression
|
|
247
|
+
*/
|
|
248
|
+
function transformLet(bindings, body, env, defining, depth, maxDepth, allowUndefinedVariables) {
|
|
249
|
+
// Build a new environment with the bindings
|
|
250
|
+
const newEnv = new Map(env);
|
|
251
|
+
const irBindings = bindings.map((binding) => {
|
|
252
|
+
// If the value is a lambda, add the binding name to the defining set
|
|
253
|
+
// to detect recursive calls within the lambda body
|
|
254
|
+
const isLambda = binding.value.type === 'lambda';
|
|
255
|
+
const newDefining = isLambda ? new Set([...defining, binding.name]) : defining;
|
|
256
|
+
const valueIR = transformWithDepth(binding.value, newEnv, newDefining, depth, maxDepth, allowUndefinedVariables);
|
|
257
|
+
const valueType = (0, ir_1.inferType)(valueIR);
|
|
258
|
+
newEnv.set(binding.name, valueType);
|
|
259
|
+
return { name: binding.name, value: valueIR };
|
|
260
|
+
});
|
|
261
|
+
const bodyIR = transformWithDepth(body, newEnv, defining, depth, maxDepth, allowUndefinedVariables);
|
|
262
|
+
return (0, ir_1.irLet)(irBindings, bodyIR);
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Transform a lambda expression
|
|
266
|
+
*/
|
|
267
|
+
function transformLambda(params, body, env, defining, depth, maxDepth, allowUndefinedVariables) {
|
|
268
|
+
// Build a new environment with params as 'any' type
|
|
269
|
+
const newEnv = new Map(env);
|
|
270
|
+
const irParams = params.map((name) => {
|
|
271
|
+
newEnv.set(name, types_1.Types.any);
|
|
272
|
+
return { name, inferredType: types_1.Types.any };
|
|
273
|
+
});
|
|
274
|
+
const bodyIR = transformWithDepth(body, newEnv, defining, depth, maxDepth, allowUndefinedVariables);
|
|
275
|
+
const resultType = (0, ir_1.inferType)(bodyIR);
|
|
276
|
+
return (0, ir_1.irLambda)(irParams, bodyIR, resultType);
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Transform an alternative expression: a | b | c
|
|
280
|
+
*
|
|
281
|
+
* The result type is inferred as:
|
|
282
|
+
* - If all alternatives have the same type, that type
|
|
283
|
+
* - Otherwise, 'any'
|
|
284
|
+
*/
|
|
285
|
+
function transformAlternative(alternatives, env, defining, depth, maxDepth, allowUndefinedVariables) {
|
|
286
|
+
const irAlts = alternatives.map((alt) => transformWithDepth(alt, env, defining, depth, maxDepth, allowUndefinedVariables));
|
|
287
|
+
// Infer result type: use first non-any type, or any if all are any
|
|
288
|
+
let resultType = types_1.Types.any;
|
|
289
|
+
for (const alt of irAlts) {
|
|
290
|
+
const altType = (0, ir_1.inferType)(alt);
|
|
291
|
+
if (altType.kind !== 'any') {
|
|
292
|
+
resultType = altType;
|
|
293
|
+
break;
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
return (0, ir_1.irAlternative)(irAlts, resultType);
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* Map operator symbols to function name prefixes
|
|
300
|
+
*/
|
|
301
|
+
const opNameMap = {
|
|
302
|
+
'+': 'add',
|
|
303
|
+
'-': 'sub',
|
|
304
|
+
'*': 'mul',
|
|
305
|
+
'/': 'div',
|
|
306
|
+
'%': 'mod',
|
|
307
|
+
'^': 'pow',
|
|
308
|
+
'<': 'lt',
|
|
309
|
+
'>': 'gt',
|
|
310
|
+
'<=': 'lte',
|
|
311
|
+
'>=': 'gte',
|
|
312
|
+
'==': 'eq',
|
|
313
|
+
'!=': 'neq',
|
|
314
|
+
'&&': 'and',
|
|
315
|
+
'||': 'or',
|
|
316
|
+
};
|
|
317
|
+
const unaryOpNameMap = {
|
|
318
|
+
'-': 'neg',
|
|
319
|
+
'+': 'pos',
|
|
320
|
+
'!': 'not',
|
|
321
|
+
};
|
|
322
|
+
//# sourceMappingURL=transform.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transform.js","sourceRoot":"","sources":["../../src/transform.ts"],"names":[],"mappings":"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"}
|