greybel-interpreter 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.
Files changed (81) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +3 -0
  3. package/dist/context.d.ts +68 -0
  4. package/dist/context.js +399 -0
  5. package/dist/cps.d.ts +15 -0
  6. package/dist/cps.js +438 -0
  7. package/dist/custom-types/boolean.d.ts +10 -0
  8. package/dist/custom-types/boolean.js +41 -0
  9. package/dist/custom-types/list.d.ts +25 -0
  10. package/dist/custom-types/list.js +281 -0
  11. package/dist/custom-types/map.d.ts +28 -0
  12. package/dist/custom-types/map.js +289 -0
  13. package/dist/custom-types/nil.d.ts +8 -0
  14. package/dist/custom-types/nil.js +38 -0
  15. package/dist/custom-types/number.d.ts +10 -0
  16. package/dist/custom-types/number.js +41 -0
  17. package/dist/custom-types/string.d.ts +21 -0
  18. package/dist/custom-types/string.js +132 -0
  19. package/dist/expressions/assign.d.ts +12 -0
  20. package/dist/expressions/assign.js +156 -0
  21. package/dist/expressions/binary-negated-expression.d.ts +18 -0
  22. package/dist/expressions/binary-negated-expression.js +115 -0
  23. package/dist/expressions/call.d.ts +13 -0
  24. package/dist/expressions/call.js +177 -0
  25. package/dist/expressions/list.d.ts +13 -0
  26. package/dist/expressions/list.js +119 -0
  27. package/dist/expressions/logical-and-binary.d.ts +22 -0
  28. package/dist/expressions/logical-and-binary.js +188 -0
  29. package/dist/expressions/map.d.ts +18 -0
  30. package/dist/expressions/map.js +171 -0
  31. package/dist/expressions/path.d.ts +30 -0
  32. package/dist/expressions/path.js +310 -0
  33. package/dist/index.d.ts +35 -0
  34. package/dist/index.js +82 -0
  35. package/dist/interpreter.d.ts +20 -0
  36. package/dist/interpreter.js +55 -0
  37. package/dist/operations/argument.d.ts +8 -0
  38. package/dist/operations/argument.js +129 -0
  39. package/dist/operations/body.d.ts +8 -0
  40. package/dist/operations/body.js +144 -0
  41. package/dist/operations/break.d.ts +7 -0
  42. package/dist/operations/break.js +34 -0
  43. package/dist/operations/continue.d.ts +7 -0
  44. package/dist/operations/continue.js +34 -0
  45. package/dist/operations/debugger.d.ts +7 -0
  46. package/dist/operations/debugger.js +32 -0
  47. package/dist/operations/else-if.d.ts +12 -0
  48. package/dist/operations/else-if.js +31 -0
  49. package/dist/operations/else.d.ts +10 -0
  50. package/dist/operations/else.js +30 -0
  51. package/dist/operations/for.d.ts +16 -0
  52. package/dist/operations/for.js +139 -0
  53. package/dist/operations/function.d.ts +21 -0
  54. package/dist/operations/function.js +125 -0
  55. package/dist/operations/if-statement.d.ts +8 -0
  56. package/dist/operations/if-statement.js +138 -0
  57. package/dist/operations/if.d.ts +12 -0
  58. package/dist/operations/if.js +31 -0
  59. package/dist/operations/new.d.ts +11 -0
  60. package/dist/operations/new.js +96 -0
  61. package/dist/operations/not.d.ts +11 -0
  62. package/dist/operations/not.js +95 -0
  63. package/dist/operations/reference.d.ts +11 -0
  64. package/dist/operations/reference.js +102 -0
  65. package/dist/operations/return.d.ts +11 -0
  66. package/dist/operations/return.js +102 -0
  67. package/dist/operations/top.d.ts +12 -0
  68. package/dist/operations/top.js +84 -0
  69. package/dist/operations/while.d.ts +14 -0
  70. package/dist/operations/while.js +123 -0
  71. package/dist/resource.d.ts +9 -0
  72. package/dist/resource.js +29 -0
  73. package/dist/typer.d.ts +6 -0
  74. package/dist/typer.js +99 -0
  75. package/dist/types/custom-type.d.ts +19 -0
  76. package/dist/types/custom-type.js +58 -0
  77. package/dist/types/expression.d.ts +6 -0
  78. package/dist/types/expression.js +9 -0
  79. package/dist/types/operation.d.ts +9 -0
  80. package/dist/types/operation.js +38 -0
  81. package/package.json +45 -0
@@ -0,0 +1,171 @@
1
+ "use strict";
2
+ var __extends = (this && this.__extends) || (function () {
3
+ var extendStatics = function (d, b) {
4
+ extendStatics = Object.setPrototypeOf ||
5
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
6
+ function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
7
+ return extendStatics(d, b);
8
+ };
9
+ return function (d, b) {
10
+ if (typeof b !== "function" && b !== null)
11
+ throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
12
+ extendStatics(d, b);
13
+ function __() { this.constructor = d; }
14
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
15
+ };
16
+ })();
17
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
18
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
19
+ return new (P || (P = Promise))(function (resolve, reject) {
20
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
21
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
22
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
23
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
24
+ });
25
+ };
26
+ var __generator = (this && this.__generator) || function (thisArg, body) {
27
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
28
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
29
+ function verb(n) { return function (v) { return step([n, v]); }; }
30
+ function step(op) {
31
+ if (f) throw new TypeError("Generator is already executing.");
32
+ while (_) try {
33
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
34
+ if (y = 0, t) op = [op[0] & 2, t.value];
35
+ switch (op[0]) {
36
+ case 0: case 1: t = op; break;
37
+ case 4: _.label++; return { value: op[1], done: false };
38
+ case 5: _.label++; y = op[1]; op = [0]; continue;
39
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
40
+ default:
41
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
42
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
43
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
44
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
45
+ if (t[2]) _.ops.pop();
46
+ _.trys.pop(); continue;
47
+ }
48
+ op = body.call(thisArg, _);
49
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
50
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
51
+ }
52
+ };
53
+ var __values = (this && this.__values) || function(o) {
54
+ var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
55
+ if (m) return m.call(o);
56
+ if (o && typeof o.length === "number") return {
57
+ next: function () {
58
+ if (o && i >= o.length) o = void 0;
59
+ return { value: o && o[i++], done: !o };
60
+ }
61
+ };
62
+ throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
63
+ };
64
+ var __importDefault = (this && this.__importDefault) || function (mod) {
65
+ return (mod && mod.__esModule) ? mod : { "default": mod };
66
+ };
67
+ Object.defineProperty(exports, "__esModule", { value: true });
68
+ exports.ExpressionSegment = exports.ValuesSegment = void 0;
69
+ var expression_1 = require("../types/expression");
70
+ var map_1 = __importDefault(require("../custom-types/map"));
71
+ var typer_1 = require("../typer");
72
+ var ValuesSegment = /** @class */ (function () {
73
+ function ValuesSegment(key, value) {
74
+ var me = this;
75
+ me.key = key;
76
+ me.value = value;
77
+ }
78
+ return ValuesSegment;
79
+ }());
80
+ exports.ValuesSegment = ValuesSegment;
81
+ var ExpressionSegment = /** @class */ (function () {
82
+ function ExpressionSegment(values) {
83
+ this.values = values;
84
+ }
85
+ return ExpressionSegment;
86
+ }());
87
+ exports.ExpressionSegment = ExpressionSegment;
88
+ var MapExpression = /** @class */ (function (_super) {
89
+ __extends(MapExpression, _super);
90
+ function MapExpression(ast, visit) {
91
+ var _this = _super.call(this) || this;
92
+ var me = _this;
93
+ var buildExpression = function (node) {
94
+ return new ExpressionSegment(node.fields.map(function (item) {
95
+ return {
96
+ key: visit(item.key),
97
+ value: visit(item.value)
98
+ };
99
+ }));
100
+ };
101
+ me.ast = ast;
102
+ me.expr = buildExpression(ast);
103
+ return _this;
104
+ }
105
+ MapExpression.prototype.get = function (operationContext, parentExpr) {
106
+ var me = this;
107
+ var evaluate = function (values) {
108
+ return __awaiter(this, void 0, void 0, function () {
109
+ var map, values_1, values_1_1, current, key, value, e_1_1;
110
+ var e_1, _a;
111
+ return __generator(this, function (_b) {
112
+ switch (_b.label) {
113
+ case 0:
114
+ map = new Map();
115
+ _b.label = 1;
116
+ case 1:
117
+ _b.trys.push([1, 9, 10, 11]);
118
+ values_1 = __values(values), values_1_1 = values_1.next();
119
+ _b.label = 2;
120
+ case 2:
121
+ if (!!values_1_1.done) return [3 /*break*/, 8];
122
+ current = values_1_1.value;
123
+ key = void 0;
124
+ value = void 0;
125
+ if ((0, typer_1.isCustomValue)(current.key)) {
126
+ key = current.key.valueOf();
127
+ }
128
+ else {
129
+ operationContext.debugger.raise('Unexpected key', me, current.key);
130
+ }
131
+ if (!(0, typer_1.isCustomValue)(current.value)) return [3 /*break*/, 3];
132
+ value = current.value;
133
+ return [3 /*break*/, 6];
134
+ case 3:
135
+ if (!(current.value instanceof expression_1.Expression)) return [3 /*break*/, 5];
136
+ return [4 /*yield*/, current.value.get(operationContext)];
137
+ case 4:
138
+ value = _b.sent();
139
+ return [3 /*break*/, 6];
140
+ case 5:
141
+ operationContext.debugger.raise('Unexpected value', me, current.value);
142
+ _b.label = 6;
143
+ case 6:
144
+ // @ts-ignore: Key is always a literal
145
+ map.set(key, value);
146
+ _b.label = 7;
147
+ case 7:
148
+ values_1_1 = values_1.next();
149
+ return [3 /*break*/, 2];
150
+ case 8: return [3 /*break*/, 11];
151
+ case 9:
152
+ e_1_1 = _b.sent();
153
+ e_1 = { error: e_1_1 };
154
+ return [3 /*break*/, 11];
155
+ case 10:
156
+ try {
157
+ if (values_1_1 && !values_1_1.done && (_a = values_1.return)) _a.call(values_1);
158
+ }
159
+ finally { if (e_1) throw e_1.error; }
160
+ return [7 /*endfinally*/];
161
+ case 11: return [2 /*return*/, new map_1.default(map)];
162
+ }
163
+ });
164
+ });
165
+ };
166
+ operationContext.debugger.debug('MapExpression', 'get', 'expr', me.expr);
167
+ return evaluate(me.expr.values);
168
+ };
169
+ return MapExpression;
170
+ }(expression_1.Expression));
171
+ exports.default = MapExpression;
@@ -0,0 +1,30 @@
1
+ import { ASTBase } from 'greybel-core';
2
+ import { Expression } from '../types/expression';
3
+ import { OperationContext } from '../context';
4
+ export interface PathEvaluationResult {
5
+ handle: any;
6
+ path: string[];
7
+ }
8
+ export declare class SliceSegment {
9
+ left: any;
10
+ right: any;
11
+ constructor(left: any, right: any);
12
+ }
13
+ export declare class IndexSegment {
14
+ value: any;
15
+ constructor(value: any);
16
+ }
17
+ export declare class PathSegment {
18
+ value: string;
19
+ constructor(value: string);
20
+ }
21
+ export declare class ExpressionSegment {
22
+ value: any[];
23
+ constructor();
24
+ append(val: any): ExpressionSegment;
25
+ }
26
+ export default class PathExpression extends Expression {
27
+ expr: ExpressionSegment;
28
+ constructor(ast: ASTBase, visit: Function);
29
+ get(operationContext: OperationContext, parentExpr: any): Promise<any>;
30
+ }
@@ -0,0 +1,310 @@
1
+ "use strict";
2
+ var __extends = (this && this.__extends) || (function () {
3
+ var extendStatics = function (d, b) {
4
+ extendStatics = Object.setPrototypeOf ||
5
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
6
+ function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
7
+ return extendStatics(d, b);
8
+ };
9
+ return function (d, b) {
10
+ if (typeof b !== "function" && b !== null)
11
+ throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
12
+ extendStatics(d, b);
13
+ function __() { this.constructor = d; }
14
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
15
+ };
16
+ })();
17
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
18
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
19
+ return new (P || (P = Promise))(function (resolve, reject) {
20
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
21
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
22
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
23
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
24
+ });
25
+ };
26
+ var __generator = (this && this.__generator) || function (thisArg, body) {
27
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
28
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
29
+ function verb(n) { return function (v) { return step([n, v]); }; }
30
+ function step(op) {
31
+ if (f) throw new TypeError("Generator is already executing.");
32
+ while (_) try {
33
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
34
+ if (y = 0, t) op = [op[0] & 2, t.value];
35
+ switch (op[0]) {
36
+ case 0: case 1: t = op; break;
37
+ case 4: _.label++; return { value: op[1], done: false };
38
+ case 5: _.label++; y = op[1]; op = [0]; continue;
39
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
40
+ default:
41
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
42
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
43
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
44
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
45
+ if (t[2]) _.ops.pop();
46
+ _.trys.pop(); continue;
47
+ }
48
+ op = body.call(thisArg, _);
49
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
50
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
51
+ }
52
+ };
53
+ Object.defineProperty(exports, "__esModule", { value: true });
54
+ exports.ExpressionSegment = exports.PathSegment = exports.IndexSegment = exports.SliceSegment = void 0;
55
+ var greyscript_core_1 = require("greyscript-core");
56
+ var operation_1 = require("../types/operation");
57
+ var expression_1 = require("../types/expression");
58
+ var typer_1 = require("../typer");
59
+ var SliceSegment = /** @class */ (function () {
60
+ function SliceSegment(left, right) {
61
+ this.left = left;
62
+ this.right = right;
63
+ }
64
+ return SliceSegment;
65
+ }());
66
+ exports.SliceSegment = SliceSegment;
67
+ var IndexSegment = /** @class */ (function () {
68
+ function IndexSegment(value) {
69
+ this.value = value;
70
+ }
71
+ return IndexSegment;
72
+ }());
73
+ exports.IndexSegment = IndexSegment;
74
+ var PathSegment = /** @class */ (function () {
75
+ function PathSegment(value) {
76
+ this.value = value;
77
+ }
78
+ return PathSegment;
79
+ }());
80
+ exports.PathSegment = PathSegment;
81
+ var ExpressionSegment = /** @class */ (function () {
82
+ function ExpressionSegment() {
83
+ this.value = [];
84
+ }
85
+ ExpressionSegment.prototype.append = function (val) {
86
+ var me = this;
87
+ if (val instanceof ExpressionSegment) {
88
+ me.value = me.value.concat(val.value);
89
+ return me;
90
+ }
91
+ me.value = me.value.concat(val);
92
+ return me;
93
+ };
94
+ return ExpressionSegment;
95
+ }());
96
+ exports.ExpressionSegment = ExpressionSegment;
97
+ var PathExpression = /** @class */ (function (_super) {
98
+ __extends(PathExpression, _super);
99
+ function PathExpression(ast, visit) {
100
+ var _this = _super.call(this) || this;
101
+ var me = _this;
102
+ var buildExpression = function (node) {
103
+ var _a;
104
+ var expression = new ExpressionSegment();
105
+ switch (node.type) {
106
+ case greyscript_core_1.ASTType.MemberExpression:
107
+ var memberExpression = node;
108
+ expression.append(buildExpression(memberExpression.base));
109
+ expression.append(buildExpression(memberExpression.identifier));
110
+ break;
111
+ case greyscript_core_1.ASTType.IndexExpression:
112
+ var indexExpression = node;
113
+ expression.append(buildExpression(indexExpression.base));
114
+ if (((_a = indexExpression.index) === null || _a === void 0 ? void 0 : _a.type) === 'SliceExpression') {
115
+ var sliceExpression = indexExpression.index;
116
+ expression.append(new SliceSegment(visit(sliceExpression.left), visit(sliceExpression.right)));
117
+ }
118
+ else {
119
+ expression.append(new IndexSegment(visit(indexExpression.index)));
120
+ }
121
+ break;
122
+ case greyscript_core_1.ASTType.Identifier:
123
+ var identifier = node;
124
+ expression.append(new PathSegment(identifier.name));
125
+ break;
126
+ default:
127
+ expression.append(visit(node));
128
+ }
129
+ return expression;
130
+ };
131
+ me.ast = ast;
132
+ me.expr = buildExpression(ast);
133
+ return _this;
134
+ }
135
+ PathExpression.prototype.get = function (operationContext, parentExpr) {
136
+ return __awaiter(this, void 0, void 0, function () {
137
+ var me, evaluate, resultExpr, context, value_1, value, callable, _a;
138
+ return __generator(this, function (_b) {
139
+ switch (_b.label) {
140
+ case 0:
141
+ me = this;
142
+ evaluate = function (node) {
143
+ return __awaiter(this, void 0, void 0, function () {
144
+ var traverselPath, traversedPath, position, handle, current, functionContext, origin, value, left, right;
145
+ return __generator(this, function (_a) {
146
+ switch (_a.label) {
147
+ case 0:
148
+ traverselPath = [].concat(node.value);
149
+ traversedPath = [];
150
+ position = 0;
151
+ _a.label = 1;
152
+ case 1:
153
+ if (!(current = traverselPath.shift())) return [3 /*break*/, 28];
154
+ if (!(0, typer_1.isCustomValue)(current)) return [3 /*break*/, 2];
155
+ handle = current;
156
+ return [3 /*break*/, 27];
157
+ case 2:
158
+ if (!(current instanceof expression_1.Expression)) return [3 /*break*/, 4];
159
+ return [4 /*yield*/, current.get(operationContext, me.expr)];
160
+ case 3:
161
+ handle = _a.sent();
162
+ return [3 /*break*/, 27];
163
+ case 4:
164
+ if (!(current instanceof operation_1.Operation)) return [3 /*break*/, 6];
165
+ return [4 /*yield*/, current.get(operationContext)];
166
+ case 5:
167
+ handle = _a.sent();
168
+ return [3 /*break*/, 27];
169
+ case 6:
170
+ if (!(current instanceof PathSegment)) return [3 /*break*/, 12];
171
+ if (!(current.value === 'self' && position === 0)) return [3 /*break*/, 7];
172
+ functionContext = operationContext.getMemory('functionContext');
173
+ if (functionContext === null || functionContext === void 0 ? void 0 : functionContext.context) {
174
+ handle = functionContext.context;
175
+ }
176
+ else {
177
+ operationContext.debugger.raise('Unexpected self', me, current);
178
+ }
179
+ return [3 /*break*/, 11];
180
+ case 7:
181
+ traversedPath.push(current.value);
182
+ if (!(traverselPath.length > 0)) return [3 /*break*/, 11];
183
+ return [4 /*yield*/, (handle || operationContext).get(traversedPath)];
184
+ case 8:
185
+ origin = _a.sent();
186
+ if (!(0, typer_1.isCustomValue)(origin)) return [3 /*break*/, 9];
187
+ handle = origin;
188
+ traversedPath = [];
189
+ return [3 /*break*/, 11];
190
+ case 9:
191
+ if (!(origin instanceof Function)) return [3 /*break*/, 11];
192
+ return [4 /*yield*/, origin.call(handle)];
193
+ case 10:
194
+ handle = _a.sent();
195
+ traversedPath = [];
196
+ _a.label = 11;
197
+ case 11: return [3 /*break*/, 27];
198
+ case 12:
199
+ if (!(current instanceof IndexSegment)) return [3 /*break*/, 17];
200
+ current = current.value;
201
+ if (!(0, typer_1.isCustomValue)(current)) return [3 /*break*/, 13];
202
+ traversedPath.push(current.valueOf());
203
+ return [3 /*break*/, 16];
204
+ case 13:
205
+ if (!(current instanceof expression_1.Expression)) return [3 /*break*/, 15];
206
+ return [4 /*yield*/, current.get(operationContext)];
207
+ case 14:
208
+ value = _a.sent();
209
+ traversedPath.push(value);
210
+ return [3 /*break*/, 16];
211
+ case 15:
212
+ operationContext.debugger.raise('Unexpected index', me, current);
213
+ _a.label = 16;
214
+ case 16: return [3 /*break*/, 27];
215
+ case 17:
216
+ if (!(current instanceof SliceSegment)) return [3 /*break*/, 26];
217
+ if (!!handle) return [3 /*break*/, 19];
218
+ return [4 /*yield*/, operationContext.get(traversedPath)];
219
+ case 18:
220
+ handle = _a.sent();
221
+ traversedPath = [];
222
+ _a.label = 19;
223
+ case 19:
224
+ if (!(0, typer_1.isCustomList)(handle) && !(0, typer_1.isCustomString)(handle)) {
225
+ operationContext.debugger.raise('Invalid type for slice', me, handle);
226
+ }
227
+ left = current.left;
228
+ if (!(0, typer_1.isCustomValue)(left)) return [3 /*break*/, 20];
229
+ left = left;
230
+ return [3 /*break*/, 22];
231
+ case 20:
232
+ if (!(left instanceof expression_1.Expression)) return [3 /*break*/, 22];
233
+ return [4 /*yield*/, left.get(operationContext)];
234
+ case 21:
235
+ left = _a.sent();
236
+ _a.label = 22;
237
+ case 22:
238
+ right = current.right;
239
+ if (!(0, typer_1.isCustomValue)(right)) return [3 /*break*/, 23];
240
+ right = right;
241
+ return [3 /*break*/, 25];
242
+ case 23:
243
+ if (!(right instanceof expression_1.Expression)) return [3 /*break*/, 25];
244
+ return [4 /*yield*/, right.get(operationContext)];
245
+ case 24:
246
+ right = _a.sent();
247
+ _a.label = 25;
248
+ case 25:
249
+ handle = handle.slice(left, right);
250
+ return [3 /*break*/, 27];
251
+ case 26:
252
+ operationContext.debugger.raise('Unexpected handle', me, current);
253
+ _a.label = 27;
254
+ case 27:
255
+ position++;
256
+ return [3 /*break*/, 1];
257
+ case 28: return [2 /*return*/, {
258
+ handle: handle,
259
+ path: traversedPath
260
+ }];
261
+ }
262
+ });
263
+ });
264
+ };
265
+ operationContext.debugger.debug('PathExpression', 'get', 'expr', me.expr);
266
+ return [4 /*yield*/, evaluate(me.expr)];
267
+ case 1:
268
+ resultExpr = _b.sent();
269
+ if (!!parentExpr) return [3 /*break*/, 14];
270
+ if (!resultExpr.handle) return [3 /*break*/, 8];
271
+ if (!(resultExpr.path.length === 0)) return [3 /*break*/, 2];
272
+ return [2 /*return*/, resultExpr.handle];
273
+ case 2:
274
+ if (!(0, typer_1.isCustomMap)(resultExpr.handle)) return [3 /*break*/, 7];
275
+ context = resultExpr.handle;
276
+ return [4 /*yield*/, context.get(resultExpr.path)];
277
+ case 3:
278
+ value_1 = _b.sent();
279
+ if (!(value_1 instanceof operation_1.Operation)) return [3 /*break*/, 4];
280
+ return [2 /*return*/, value_1.run(operationContext)];
281
+ case 4:
282
+ if (!(value_1 instanceof Function)) return [3 /*break*/, 6];
283
+ return [4 /*yield*/, value_1.call(context)];
284
+ case 5: return [2 /*return*/, _b.sent()];
285
+ case 6: return [2 /*return*/, value_1];
286
+ case 7: return [2 /*return*/, (0, typer_1.cast)(resultExpr.handle.callMethod(resultExpr.path))];
287
+ case 8: return [4 /*yield*/, operationContext.get(resultExpr.path)];
288
+ case 9:
289
+ value = _b.sent();
290
+ if (!(value instanceof Function)) return [3 /*break*/, 12];
291
+ return [4 /*yield*/, operationContext.getCallable(resultExpr.path)];
292
+ case 10:
293
+ callable = _b.sent();
294
+ _a = typer_1.cast;
295
+ return [4 /*yield*/, callable.origin.call(callable.context)];
296
+ case 11: return [2 /*return*/, _a.apply(void 0, [_b.sent()])];
297
+ case 12:
298
+ if (value instanceof operation_1.Operation) {
299
+ return [2 /*return*/, value.run(operationContext)];
300
+ }
301
+ _b.label = 13;
302
+ case 13: return [2 /*return*/, value];
303
+ case 14: return [2 /*return*/, resultExpr];
304
+ }
305
+ });
306
+ });
307
+ };
308
+ return PathExpression;
309
+ }(expression_1.Expression));
310
+ exports.default = PathExpression;
@@ -0,0 +1,35 @@
1
+ export { default as AssignExpression } from './expressions/assign';
2
+ export { default as CallExpression } from './expressions/call';
3
+ export { default as ListExpression } from './expressions/list';
4
+ export { default as LogicalAndBinaryExpression } from './expressions/logical-and-binary';
5
+ export { default as MapExpression } from './expressions/map';
6
+ export { default as PathExpression } from './expressions/path';
7
+ export { default as BinaryNegatedExpression } from './expressions/binary-negated-expression';
8
+ export { default as ArgumentOperation } from './operations/argument';
9
+ export { default as WhileOperation } from './operations/while';
10
+ export { default as ForOperation } from './operations/for';
11
+ export { default as ReturnOperation } from './operations/return';
12
+ export { default as NewOperation } from './operations/new';
13
+ export { default as NotOperation } from './operations/not';
14
+ export { default as IfStatementOperation } from './operations/if-statement';
15
+ export { default as IfOperation } from './operations/if';
16
+ export { default as ElseIfOperation } from './operations/else-if';
17
+ export { default as ElseOperation } from './operations/else';
18
+ export { default as ContinueOperation } from './operations/continue';
19
+ export { default as BreakOperation } from './operations/break';
20
+ export { default as BodyOperation } from './operations/body';
21
+ export { default as TopOperation } from './operations/top';
22
+ export { default as DebuggerOperation } from './operations/debugger';
23
+ export { default as CustomBoolean } from './custom-types/boolean';
24
+ export { default as CustomNumber } from './custom-types/number';
25
+ export { default as CustomString } from './custom-types/string';
26
+ export { default as CustomNil } from './custom-types/nil';
27
+ export { default as CustomMap } from './custom-types/map';
28
+ export { default as CustomList } from './custom-types/list';
29
+ export * from './resource';
30
+ export * from './context';
31
+ export * from './types/operation';
32
+ export * from './types/expression';
33
+ export * from './types/custom-type';
34
+ export { default as CPS, CPSMap, CPSMapContext, CPSMapType } from './cps';
35
+ export { default as Interpreter, InterpreterOptions } from './interpreter';
package/dist/index.js ADDED
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
10
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
11
+ };
12
+ var __importDefault = (this && this.__importDefault) || function (mod) {
13
+ return (mod && mod.__esModule) ? mod : { "default": mod };
14
+ };
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.Interpreter = exports.CPSMap = exports.CPS = exports.CustomList = exports.CustomMap = exports.CustomNil = exports.CustomString = exports.CustomNumber = exports.CustomBoolean = exports.DebuggerOperation = exports.TopOperation = exports.BodyOperation = exports.BreakOperation = exports.ContinueOperation = exports.ElseOperation = exports.ElseIfOperation = exports.IfOperation = exports.IfStatementOperation = exports.NotOperation = exports.NewOperation = exports.ReturnOperation = exports.ForOperation = exports.WhileOperation = exports.ArgumentOperation = exports.BinaryNegatedExpression = exports.PathExpression = exports.MapExpression = exports.LogicalAndBinaryExpression = exports.ListExpression = exports.CallExpression = exports.AssignExpression = void 0;
17
+ var assign_1 = require("./expressions/assign");
18
+ Object.defineProperty(exports, "AssignExpression", { enumerable: true, get: function () { return __importDefault(assign_1).default; } });
19
+ var call_1 = require("./expressions/call");
20
+ Object.defineProperty(exports, "CallExpression", { enumerable: true, get: function () { return __importDefault(call_1).default; } });
21
+ var list_1 = require("./expressions/list");
22
+ Object.defineProperty(exports, "ListExpression", { enumerable: true, get: function () { return __importDefault(list_1).default; } });
23
+ var logical_and_binary_1 = require("./expressions/logical-and-binary");
24
+ Object.defineProperty(exports, "LogicalAndBinaryExpression", { enumerable: true, get: function () { return __importDefault(logical_and_binary_1).default; } });
25
+ var map_1 = require("./expressions/map");
26
+ Object.defineProperty(exports, "MapExpression", { enumerable: true, get: function () { return __importDefault(map_1).default; } });
27
+ var path_1 = require("./expressions/path");
28
+ Object.defineProperty(exports, "PathExpression", { enumerable: true, get: function () { return __importDefault(path_1).default; } });
29
+ var binary_negated_expression_1 = require("./expressions/binary-negated-expression");
30
+ Object.defineProperty(exports, "BinaryNegatedExpression", { enumerable: true, get: function () { return __importDefault(binary_negated_expression_1).default; } });
31
+ var argument_1 = require("./operations/argument");
32
+ Object.defineProperty(exports, "ArgumentOperation", { enumerable: true, get: function () { return __importDefault(argument_1).default; } });
33
+ var while_1 = require("./operations/while");
34
+ Object.defineProperty(exports, "WhileOperation", { enumerable: true, get: function () { return __importDefault(while_1).default; } });
35
+ var for_1 = require("./operations/for");
36
+ Object.defineProperty(exports, "ForOperation", { enumerable: true, get: function () { return __importDefault(for_1).default; } });
37
+ var return_1 = require("./operations/return");
38
+ Object.defineProperty(exports, "ReturnOperation", { enumerable: true, get: function () { return __importDefault(return_1).default; } });
39
+ var new_1 = require("./operations/new");
40
+ Object.defineProperty(exports, "NewOperation", { enumerable: true, get: function () { return __importDefault(new_1).default; } });
41
+ var not_1 = require("./operations/not");
42
+ Object.defineProperty(exports, "NotOperation", { enumerable: true, get: function () { return __importDefault(not_1).default; } });
43
+ var if_statement_1 = require("./operations/if-statement");
44
+ Object.defineProperty(exports, "IfStatementOperation", { enumerable: true, get: function () { return __importDefault(if_statement_1).default; } });
45
+ var if_1 = require("./operations/if");
46
+ Object.defineProperty(exports, "IfOperation", { enumerable: true, get: function () { return __importDefault(if_1).default; } });
47
+ var else_if_1 = require("./operations/else-if");
48
+ Object.defineProperty(exports, "ElseIfOperation", { enumerable: true, get: function () { return __importDefault(else_if_1).default; } });
49
+ var else_1 = require("./operations/else");
50
+ Object.defineProperty(exports, "ElseOperation", { enumerable: true, get: function () { return __importDefault(else_1).default; } });
51
+ var continue_1 = require("./operations/continue");
52
+ Object.defineProperty(exports, "ContinueOperation", { enumerable: true, get: function () { return __importDefault(continue_1).default; } });
53
+ var break_1 = require("./operations/break");
54
+ Object.defineProperty(exports, "BreakOperation", { enumerable: true, get: function () { return __importDefault(break_1).default; } });
55
+ var body_1 = require("./operations/body");
56
+ Object.defineProperty(exports, "BodyOperation", { enumerable: true, get: function () { return __importDefault(body_1).default; } });
57
+ var top_1 = require("./operations/top");
58
+ Object.defineProperty(exports, "TopOperation", { enumerable: true, get: function () { return __importDefault(top_1).default; } });
59
+ var debugger_1 = require("./operations/debugger");
60
+ Object.defineProperty(exports, "DebuggerOperation", { enumerable: true, get: function () { return __importDefault(debugger_1).default; } });
61
+ var boolean_1 = require("./custom-types/boolean");
62
+ Object.defineProperty(exports, "CustomBoolean", { enumerable: true, get: function () { return __importDefault(boolean_1).default; } });
63
+ var number_1 = require("./custom-types/number");
64
+ Object.defineProperty(exports, "CustomNumber", { enumerable: true, get: function () { return __importDefault(number_1).default; } });
65
+ var string_1 = require("./custom-types/string");
66
+ Object.defineProperty(exports, "CustomString", { enumerable: true, get: function () { return __importDefault(string_1).default; } });
67
+ var nil_1 = require("./custom-types/nil");
68
+ Object.defineProperty(exports, "CustomNil", { enumerable: true, get: function () { return __importDefault(nil_1).default; } });
69
+ var map_2 = require("./custom-types/map");
70
+ Object.defineProperty(exports, "CustomMap", { enumerable: true, get: function () { return __importDefault(map_2).default; } });
71
+ var list_2 = require("./custom-types/list");
72
+ Object.defineProperty(exports, "CustomList", { enumerable: true, get: function () { return __importDefault(list_2).default; } });
73
+ __exportStar(require("./resource"), exports);
74
+ __exportStar(require("./context"), exports);
75
+ __exportStar(require("./types/operation"), exports);
76
+ __exportStar(require("./types/expression"), exports);
77
+ __exportStar(require("./types/custom-type"), exports);
78
+ var cps_1 = require("./cps");
79
+ Object.defineProperty(exports, "CPS", { enumerable: true, get: function () { return __importDefault(cps_1).default; } });
80
+ Object.defineProperty(exports, "CPSMap", { enumerable: true, get: function () { return cps_1.CPSMap; } });
81
+ var interpreter_1 = require("./interpreter");
82
+ Object.defineProperty(exports, "Interpreter", { enumerable: true, get: function () { return __importDefault(interpreter_1).default; } });
@@ -0,0 +1,20 @@
1
+ import { Debugger } from './context';
2
+ import { ResourceHandler } from './resource';
3
+ export interface InterpreterOptions {
4
+ target?: string;
5
+ code?: string;
6
+ api?: Map<string, any>;
7
+ params?: any[];
8
+ resourceHandler?: ResourceHandler;
9
+ debugger?: Debugger;
10
+ }
11
+ export default class Interpreter {
12
+ target: string;
13
+ code: string;
14
+ api: Map<string, any>;
15
+ params: any[];
16
+ resourceHandler: ResourceHandler;
17
+ debugger: Debugger;
18
+ constructor(options: InterpreterOptions);
19
+ digest(): Promise<any>;
20
+ }