azkal-lang 0.1.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.
@@ -0,0 +1,619 @@
1
+ import { RuntimeError } from "./errors.js";
2
+ import { Environment, } from "./environment.js";
3
+ import { createGlobals } from "./stdlib.js";
4
+ class ReturnSignal {
5
+ value;
6
+ constructor(value) {
7
+ this.value = value;
8
+ }
9
+ }
10
+ class BreakSignal {
11
+ }
12
+ class ContinueSignal {
13
+ }
14
+ export class Interpreter {
15
+ globals;
16
+ output = []; // captured output for testing/playground
17
+ constructor(captureOutput = false) {
18
+ this.globals = createGlobals(captureOutput ? this.output : null);
19
+ }
20
+ run(program) {
21
+ let result = null;
22
+ for (const node of program.body) {
23
+ result = this.exec(node, this.globals);
24
+ }
25
+ return result;
26
+ }
27
+ exec(node, env) {
28
+ switch (node.kind) {
29
+ case "Program":
30
+ return this.execProgram(node, env);
31
+ case "NumberLiteral":
32
+ return node.value;
33
+ case "StringLiteral":
34
+ return node.value;
35
+ case "TemplateLiteral":
36
+ return this.execTemplate(node, env);
37
+ case "BooleanLiteral":
38
+ return node.value;
39
+ case "NullLiteral":
40
+ return null;
41
+ case "Identifier":
42
+ return env.get(node.name, node.line);
43
+ case "BinaryExpr":
44
+ return this.execBinary(node, env);
45
+ case "UnaryExpr":
46
+ return this.execUnary(node, env);
47
+ case "LogicalExpr":
48
+ return this.execLogical(node, env);
49
+ case "PipeExpr":
50
+ return this.execPipe(node, env);
51
+ case "AssignExpr":
52
+ return this.execAssign(node, env);
53
+ case "CallExpr":
54
+ return this.execCall(node, env);
55
+ case "IndexExpr":
56
+ return this.execIndex(node, env);
57
+ case "MemberExpr":
58
+ return this.execMember(node, env);
59
+ case "ArrayLiteral":
60
+ return this.execArray(node, env);
61
+ case "ObjectLiteral":
62
+ return this.execObject(node, env);
63
+ case "SpreadExpr":
64
+ return this.exec(node.expr, env);
65
+ case "FnExpr":
66
+ return this.execFnExpr(node, env);
67
+ case "LetDecl":
68
+ return this.execLet(node, env);
69
+ case "FnDecl":
70
+ return this.execFnDecl(node, env);
71
+ case "ReturnStmt":
72
+ throw new ReturnSignal(node.value ? this.exec(node.value, env) : null);
73
+ case "IfStmt":
74
+ return this.execIf(node, env);
75
+ case "WhileStmt":
76
+ return this.execWhile(node, env);
77
+ case "ForInStmt":
78
+ return this.execForIn(node, env);
79
+ case "BlockStmt":
80
+ return this.execBlock(node, env);
81
+ case "ExprStmt":
82
+ return this.exec(node.expr, env);
83
+ case "BreakStmt":
84
+ throw new BreakSignal();
85
+ case "ContinueStmt":
86
+ throw new ContinueSignal();
87
+ default:
88
+ throw new RuntimeError(`Unknown node kind: ${node.kind}`, node.line ?? 0, 0);
89
+ }
90
+ }
91
+ execProgram(node, env) {
92
+ let result = null;
93
+ for (const stmt of node.body) {
94
+ result = this.exec(stmt, env);
95
+ }
96
+ return result;
97
+ }
98
+ execTemplate(node, env) {
99
+ return node.parts.map((p) => {
100
+ const val = this.exec(p, env);
101
+ return this.stringify(val);
102
+ }).join("");
103
+ }
104
+ execBinary(node, env) {
105
+ const left = this.exec(node.left, env);
106
+ const right = this.exec(node.right, env);
107
+ switch (node.op) {
108
+ case "+":
109
+ if (typeof left === "string" || typeof right === "string") {
110
+ return this.stringify(left) + this.stringify(right);
111
+ }
112
+ this.assertNumbers(left, right, node.op, node.line);
113
+ return left + right;
114
+ case "-":
115
+ this.assertNumbers(left, right, node.op, node.line);
116
+ return left - right;
117
+ case "*":
118
+ this.assertNumbers(left, right, node.op, node.line);
119
+ return left * right;
120
+ case "/":
121
+ this.assertNumbers(left, right, node.op, node.line);
122
+ if (right === 0)
123
+ throw new RuntimeError("Division by zero", node.line, 0);
124
+ return left / right;
125
+ case "%":
126
+ this.assertNumbers(left, right, node.op, node.line);
127
+ return left % right;
128
+ case "==":
129
+ return this.isEqual(left, right);
130
+ case "!=":
131
+ return !this.isEqual(left, right);
132
+ case "<":
133
+ this.assertNumbers(left, right, node.op, node.line);
134
+ return left < right;
135
+ case ">":
136
+ this.assertNumbers(left, right, node.op, node.line);
137
+ return left > right;
138
+ case "<=":
139
+ this.assertNumbers(left, right, node.op, node.line);
140
+ return left <= right;
141
+ case ">=":
142
+ this.assertNumbers(left, right, node.op, node.line);
143
+ return left >= right;
144
+ default:
145
+ throw new RuntimeError(`Unknown operator: ${node.op}`, node.line, 0);
146
+ }
147
+ }
148
+ execUnary(node, env) {
149
+ const val = this.exec(node.operand, env);
150
+ switch (node.op) {
151
+ case "-":
152
+ if (typeof val !== "number")
153
+ throw new RuntimeError("Cannot negate non-number", node.line, 0);
154
+ return -val;
155
+ case "!":
156
+ return !this.isTruthy(val);
157
+ default:
158
+ throw new RuntimeError(`Unknown unary operator: ${node.op}`, node.line, 0);
159
+ }
160
+ }
161
+ execLogical(node, env) {
162
+ const left = this.exec(node.left, env);
163
+ if (node.op === "or")
164
+ return this.isTruthy(left) ? left : this.exec(node.right, env);
165
+ if (node.op === "and")
166
+ return !this.isTruthy(left) ? left : this.exec(node.right, env);
167
+ throw new RuntimeError(`Unknown logical operator: ${node.op}`, node.line, 0);
168
+ }
169
+ execPipe(node, env) {
170
+ const left = this.exec(node.left, env);
171
+ const right = this.exec(node.right, env);
172
+ // right must be a callable — call it with left as the argument
173
+ if (right && typeof right === "object" && "type" in right) {
174
+ if (right.type === "native") {
175
+ return right.call([left]);
176
+ }
177
+ if (right.type === "function") {
178
+ const fn = right;
179
+ const fnEnv = new Environment(fn.closure);
180
+ if (fn.params.length > 0)
181
+ fnEnv.define(fn.params[0], left);
182
+ try {
183
+ this.exec(fn.body, fnEnv);
184
+ }
185
+ catch (e) {
186
+ if (e instanceof ReturnSignal)
187
+ return e.value;
188
+ throw e;
189
+ }
190
+ return null;
191
+ }
192
+ }
193
+ throw new RuntimeError("Pipe target must be a function", node.line, 0);
194
+ }
195
+ execAssign(node, env) {
196
+ const value = this.exec(node.value, env);
197
+ if (node.target.kind === "Identifier") {
198
+ env.set(node.target.name, value, node.line);
199
+ }
200
+ else if (node.target.kind === "IndexExpr") {
201
+ const obj = this.exec(node.target.object, env);
202
+ const idx = this.exec(node.target.index, env);
203
+ if (Array.isArray(obj)) {
204
+ if (typeof idx !== "number")
205
+ throw new RuntimeError("Array index must be a number", node.line, 0);
206
+ obj[idx] = value;
207
+ }
208
+ else {
209
+ throw new RuntimeError("Cannot index non-array", node.line, 0);
210
+ }
211
+ }
212
+ else if (node.target.kind === "MemberExpr") {
213
+ const obj = this.exec(node.target.object, env);
214
+ if (this.isAzkalObject(obj)) {
215
+ obj.properties.set(node.target.property, value);
216
+ }
217
+ else {
218
+ throw new RuntimeError("Cannot set property on non-object", node.line, 0);
219
+ }
220
+ }
221
+ else {
222
+ throw new RuntimeError("Invalid assignment target", node.line, 0);
223
+ }
224
+ return value;
225
+ }
226
+ execCall(node, env) {
227
+ const callee = this.exec(node.callee, env);
228
+ const args = node.args.map((a) => this.exec(a, env));
229
+ if (callee && typeof callee === "object" && "type" in callee) {
230
+ if (callee.type === "native") {
231
+ const native = callee;
232
+ if (native.arity !== -1 && args.length !== native.arity) {
233
+ throw new RuntimeError(`'${native.name}' expects ${native.arity} argument(s), got ${args.length}`, node.line, 0);
234
+ }
235
+ return native.call(args);
236
+ }
237
+ if (callee.type === "function") {
238
+ const fn = callee;
239
+ if (args.length !== fn.params.length) {
240
+ throw new RuntimeError(`'${fn.name}' expects ${fn.params.length} argument(s), got ${args.length}`, node.line, 0);
241
+ }
242
+ const fnEnv = new Environment(fn.closure);
243
+ fn.params.forEach((p, i) => fnEnv.define(p, args[i]));
244
+ try {
245
+ this.exec(fn.body, fnEnv);
246
+ }
247
+ catch (e) {
248
+ if (e instanceof ReturnSignal)
249
+ return e.value;
250
+ throw e;
251
+ }
252
+ return null;
253
+ }
254
+ }
255
+ throw new RuntimeError("Cannot call non-function value", node.line, 0);
256
+ }
257
+ execIndex(node, env) {
258
+ const obj = this.exec(node.object, env);
259
+ const idx = this.exec(node.index, env);
260
+ if (Array.isArray(obj)) {
261
+ if (typeof idx !== "number")
262
+ throw new RuntimeError("Array index must be a number", node.line, 0);
263
+ if (idx < 0 || idx >= obj.length)
264
+ return null;
265
+ return obj[idx];
266
+ }
267
+ if (typeof obj === "string") {
268
+ if (typeof idx !== "number")
269
+ throw new RuntimeError("String index must be a number", node.line, 0);
270
+ if (idx < 0 || idx >= obj.length)
271
+ return null;
272
+ return obj[idx];
273
+ }
274
+ // Object bracket access: obj["key"]
275
+ if (this.isAzkalObject(obj)) {
276
+ if (typeof idx !== "string")
277
+ throw new RuntimeError("Object key must be a string", node.line, 0);
278
+ return obj.properties.get(idx) ?? null;
279
+ }
280
+ throw new RuntimeError("Cannot index this value", node.line, 0);
281
+ }
282
+ execMember(node, env) {
283
+ const obj = this.exec(node.object, env);
284
+ // Object property access
285
+ if (this.isAzkalObject(obj)) {
286
+ // Built-in object methods
287
+ if (node.property === "keys") {
288
+ return {
289
+ type: "native", name: "keys", arity: 0,
290
+ call: () => [...obj.properties.keys()],
291
+ };
292
+ }
293
+ if (node.property === "values") {
294
+ return {
295
+ type: "native", name: "values", arity: 0,
296
+ call: () => [...obj.properties.values()],
297
+ };
298
+ }
299
+ if (node.property === "has") {
300
+ return {
301
+ type: "native", name: "has", arity: 1,
302
+ call: (args) => obj.properties.has(args[0]),
303
+ };
304
+ }
305
+ if (node.property === "remove") {
306
+ return {
307
+ type: "native", name: "remove", arity: 1,
308
+ call: (args) => { obj.properties.delete(args[0]); return null; },
309
+ };
310
+ }
311
+ return obj.properties.get(node.property) ?? null;
312
+ }
313
+ // Array methods
314
+ if (Array.isArray(obj)) {
315
+ if (node.property === "length")
316
+ return obj.length;
317
+ if (node.property === "push") {
318
+ return {
319
+ type: "native", name: "push", arity: 1,
320
+ call: (args) => { obj.push(args[0]); return args[0]; },
321
+ };
322
+ }
323
+ if (node.property === "pop") {
324
+ return {
325
+ type: "native", name: "pop", arity: 0,
326
+ call: () => obj.pop() ?? null,
327
+ };
328
+ }
329
+ if (node.property === "map") {
330
+ return {
331
+ type: "native", name: "map", arity: 1,
332
+ call: (args) => {
333
+ const fn = args[0];
334
+ return obj.map((el, i) => this.callValue(fn, [el, i], 0));
335
+ },
336
+ };
337
+ }
338
+ if (node.property === "filter") {
339
+ return {
340
+ type: "native", name: "filter", arity: 1,
341
+ call: (args) => {
342
+ const fn = args[0];
343
+ return obj.filter((el, i) => this.isTruthy(this.callValue(fn, [el, i], 0)));
344
+ },
345
+ };
346
+ }
347
+ if (node.property === "find") {
348
+ return {
349
+ type: "native", name: "find", arity: 1,
350
+ call: (args) => {
351
+ const fn = args[0];
352
+ for (let i = 0; i < obj.length; i++) {
353
+ if (this.isTruthy(this.callValue(fn, [obj[i], i], 0)))
354
+ return obj[i];
355
+ }
356
+ return null;
357
+ },
358
+ };
359
+ }
360
+ if (node.property === "reduce") {
361
+ return {
362
+ type: "native", name: "reduce", arity: 2,
363
+ call: (args) => {
364
+ const fn = args[0];
365
+ let acc = args[1];
366
+ for (const el of obj) {
367
+ acc = this.callValue(fn, [acc, el], 0);
368
+ }
369
+ return acc;
370
+ },
371
+ };
372
+ }
373
+ if (node.property === "includes") {
374
+ return {
375
+ type: "native", name: "includes", arity: 1,
376
+ call: (args) => obj.some((el) => this.isEqual(el, args[0])),
377
+ };
378
+ }
379
+ if (node.property === "sort") {
380
+ return {
381
+ type: "native", name: "sort", arity: 0,
382
+ call: () => [...obj].sort((a, b) => {
383
+ if (typeof a === "number" && typeof b === "number")
384
+ return a - b;
385
+ return String(a).localeCompare(String(b));
386
+ }),
387
+ };
388
+ }
389
+ if (node.property === "reverse") {
390
+ return {
391
+ type: "native", name: "reverse", arity: 0,
392
+ call: () => [...obj].reverse(),
393
+ };
394
+ }
395
+ if (node.property === "flat") {
396
+ return {
397
+ type: "native", name: "flat", arity: 0,
398
+ call: () => obj.flat(),
399
+ };
400
+ }
401
+ }
402
+ // String methods
403
+ if (typeof obj === "string") {
404
+ if (node.property === "length")
405
+ return obj.length;
406
+ if (node.property === "upper") {
407
+ return { type: "native", name: "upper", arity: 0, call: () => obj.toUpperCase() };
408
+ }
409
+ if (node.property === "lower") {
410
+ return { type: "native", name: "lower", arity: 0, call: () => obj.toLowerCase() };
411
+ }
412
+ if (node.property === "trim") {
413
+ return { type: "native", name: "trim", arity: 0, call: () => obj.trim() };
414
+ }
415
+ if (node.property === "split") {
416
+ return { type: "native", name: "split", arity: 1, call: (a) => obj.split(a[0]) };
417
+ }
418
+ if (node.property === "contains") {
419
+ return { type: "native", name: "contains", arity: 1, call: (a) => obj.includes(a[0]) };
420
+ }
421
+ if (node.property === "replace") {
422
+ return { type: "native", name: "replace", arity: 2, call: (a) => obj.replaceAll(a[0], a[1]) };
423
+ }
424
+ if (node.property === "starts_with") {
425
+ return { type: "native", name: "starts_with", arity: 1, call: (a) => obj.startsWith(a[0]) };
426
+ }
427
+ if (node.property === "ends_with") {
428
+ return { type: "native", name: "ends_with", arity: 1, call: (a) => obj.endsWith(a[0]) };
429
+ }
430
+ if (node.property === "chars") {
431
+ return { type: "native", name: "chars", arity: 0, call: () => obj.split("") };
432
+ }
433
+ }
434
+ throw new RuntimeError(`Cannot access property '${node.property}' on this value`, node.line, 0);
435
+ }
436
+ execArray(node, env) {
437
+ const result = [];
438
+ for (const el of node.elements) {
439
+ if (el.kind === "SpreadExpr") {
440
+ const val = this.exec(el.expr, env);
441
+ if (Array.isArray(val)) {
442
+ result.push(...val);
443
+ }
444
+ else {
445
+ throw new RuntimeError("Spread requires an array", el.line, 0);
446
+ }
447
+ }
448
+ else {
449
+ result.push(this.exec(el, env));
450
+ }
451
+ }
452
+ return result;
453
+ }
454
+ execObject(node, env) {
455
+ const properties = new Map();
456
+ for (const prop of node.properties) {
457
+ properties.set(prop.key, this.exec(prop.value, env));
458
+ }
459
+ return { type: "object", properties };
460
+ }
461
+ execFnExpr(node, env) {
462
+ return {
463
+ type: "function",
464
+ name: "<anonymous>",
465
+ params: node.params,
466
+ body: node.body,
467
+ closure: env,
468
+ };
469
+ }
470
+ execLet(node, env) {
471
+ const value = this.exec(node.value, env);
472
+ env.define(node.name, value);
473
+ return value;
474
+ }
475
+ execFnDecl(node, env) {
476
+ const fn = {
477
+ type: "function",
478
+ name: node.name,
479
+ params: node.params,
480
+ body: node.body,
481
+ closure: env,
482
+ };
483
+ env.define(node.name, fn);
484
+ return fn;
485
+ }
486
+ execIf(node, env) {
487
+ if (this.isTruthy(this.exec(node.condition, env))) {
488
+ return this.exec(node.then, env);
489
+ }
490
+ else if (node.otherwise) {
491
+ return this.exec(node.otherwise, env);
492
+ }
493
+ return null;
494
+ }
495
+ execWhile(node, env) {
496
+ while (this.isTruthy(this.exec(node.condition, env))) {
497
+ try {
498
+ this.exec(node.body, env);
499
+ }
500
+ catch (e) {
501
+ if (e instanceof BreakSignal)
502
+ break;
503
+ if (e instanceof ContinueSignal)
504
+ continue;
505
+ throw e;
506
+ }
507
+ }
508
+ return null;
509
+ }
510
+ execForIn(node, env) {
511
+ const iterable = this.exec(node.iterable, env);
512
+ let items;
513
+ if (Array.isArray(iterable)) {
514
+ items = iterable;
515
+ }
516
+ else if (typeof iterable === "string") {
517
+ items = iterable.split("");
518
+ }
519
+ else if (this.isAzkalObject(iterable)) {
520
+ items = [...iterable.properties.keys()];
521
+ }
522
+ else {
523
+ throw new RuntimeError("Can only iterate over arrays, strings, and objects", node.line, 0);
524
+ }
525
+ for (const item of items) {
526
+ const loopEnv = new Environment(env);
527
+ loopEnv.define(node.variable, item);
528
+ try {
529
+ this.exec(node.body, loopEnv);
530
+ }
531
+ catch (e) {
532
+ if (e instanceof BreakSignal)
533
+ break;
534
+ if (e instanceof ContinueSignal)
535
+ continue;
536
+ throw e;
537
+ }
538
+ }
539
+ return null;
540
+ }
541
+ execBlock(node, env) {
542
+ const blockEnv = new Environment(env);
543
+ let result = null;
544
+ for (const stmt of node.body) {
545
+ result = this.exec(stmt, blockEnv);
546
+ }
547
+ return result;
548
+ }
549
+ // --- Utilities ---
550
+ callValue(val, args, line) {
551
+ if (val && typeof val === "object" && "type" in val) {
552
+ if (val.type === "native") {
553
+ return val.call(args);
554
+ }
555
+ if (val.type === "function") {
556
+ const fn = val;
557
+ const fnEnv = new Environment(fn.closure);
558
+ fn.params.forEach((p, i) => fnEnv.define(p, args[i] ?? null));
559
+ try {
560
+ this.exec(fn.body, fnEnv);
561
+ }
562
+ catch (e) {
563
+ if (e instanceof ReturnSignal)
564
+ return e.value;
565
+ throw e;
566
+ }
567
+ return null;
568
+ }
569
+ }
570
+ throw new RuntimeError("Cannot call non-function value", line, 0);
571
+ }
572
+ isAzkalObject(val) {
573
+ return val !== null && typeof val === "object" && !Array.isArray(val) && "type" in val && val.type === "object";
574
+ }
575
+ isEqual(a, b) {
576
+ if (a === null && b === null)
577
+ return true;
578
+ if (a === null || b === null)
579
+ return false;
580
+ return a === b;
581
+ }
582
+ isTruthy(val) {
583
+ if (val === null)
584
+ return false;
585
+ if (typeof val === "boolean")
586
+ return val;
587
+ if (typeof val === "number")
588
+ return val !== 0;
589
+ if (typeof val === "string")
590
+ return val.length > 0;
591
+ if (Array.isArray(val))
592
+ return val.length > 0;
593
+ return true;
594
+ }
595
+ stringify(val) {
596
+ if (val === null)
597
+ return "null";
598
+ if (Array.isArray(val))
599
+ return "[" + val.map((v) => this.stringify(v)).join(", ") + "]";
600
+ if (val !== null && typeof val === "object" && "type" in val) {
601
+ if (val.type === "object") {
602
+ const obj = val;
603
+ const entries = [...obj.properties.entries()].map(([k, v]) => `${k}: ${this.stringify(v)}`);
604
+ return "{ " + entries.join(", ") + " }";
605
+ }
606
+ if (val.type === "function")
607
+ return `<fn ${val.name}>`;
608
+ if (val.type === "native")
609
+ return `<native ${val.name}>`;
610
+ }
611
+ return String(val);
612
+ }
613
+ assertNumbers(left, right, op, line) {
614
+ if (typeof left !== "number" || typeof right !== "number") {
615
+ throw new RuntimeError(`Operator '${op}' requires numbers, got ${typeof left} and ${typeof right}`, line, 0);
616
+ }
617
+ }
618
+ }
619
+ //# sourceMappingURL=interpreter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interpreter.js","sourceRoot":"","sources":["../../src/interpreter.ts"],"names":[],"mappings":"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"}