septima-lang 0.0.1
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/dist/src/ast-node.d.ts +85 -0
- package/dist/src/ast-node.js +114 -0
- package/dist/src/cdl.d.ts +33 -0
- package/dist/src/cdl.js +63 -0
- package/dist/src/extract-message.d.ts +1 -0
- package/dist/src/extract-message.js +10 -0
- package/dist/src/fail-me.d.ts +1 -0
- package/dist/src/fail-me.js +11 -0
- package/dist/src/find-array-method.d.ts +15 -0
- package/dist/src/find-array-method.js +104 -0
- package/dist/src/find-string-method.d.ts +2 -0
- package/dist/src/find-string-method.js +88 -0
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.js +18 -0
- package/dist/src/location.d.ts +11 -0
- package/dist/src/location.js +3 -0
- package/dist/src/parser.d.ts +37 -0
- package/dist/src/parser.js +345 -0
- package/dist/src/result.d.ts +24 -0
- package/dist/src/result.js +29 -0
- package/dist/src/runtime.d.ts +25 -0
- package/dist/src/runtime.js +287 -0
- package/dist/src/scanner.d.ts +22 -0
- package/dist/src/scanner.js +76 -0
- package/dist/src/should-never-happen.d.ts +1 -0
- package/dist/src/should-never-happen.js +9 -0
- package/dist/src/source-code.d.ts +19 -0
- package/dist/src/source-code.js +90 -0
- package/dist/src/stack.d.ts +11 -0
- package/dist/src/stack.js +19 -0
- package/dist/src/switch-on.d.ts +1 -0
- package/dist/src/switch-on.js +9 -0
- package/dist/src/symbol-table.d.ts +5 -0
- package/dist/src/symbol-table.js +3 -0
- package/dist/src/value.d.ts +128 -0
- package/dist/src/value.js +634 -0
- package/dist/tests/cdl.spec.d.ts +1 -0
- package/dist/tests/cdl.spec.js +692 -0
- package/dist/tests/parser.spec.d.ts +1 -0
- package/dist/tests/parser.spec.js +39 -0
- package/dist/tests/value.spec.d.ts +1 -0
- package/dist/tests/value.spec.js +355 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/jest-output.json +1 -0
- package/package.json +17 -0
- package/src/ast-node.ts +205 -0
- package/src/cdl.ts +78 -0
- package/src/extract-message.ts +5 -0
- package/src/fail-me.ts +7 -0
- package/src/find-array-method.ts +115 -0
- package/src/find-string-method.ts +84 -0
- package/src/index.ts +1 -0
- package/src/location.ts +13 -0
- package/src/parser.ts +399 -0
- package/src/result.ts +45 -0
- package/src/runtime.ts +295 -0
- package/src/scanner.ts +94 -0
- package/src/should-never-happen.ts +4 -0
- package/src/source-code.ts +101 -0
- package/src/stack.ts +18 -0
- package/src/switch-on.ts +4 -0
- package/src/symbol-table.ts +6 -0
- package/src/value.ts +742 -0
- package/tests/cdl.spec.ts +755 -0
- package/tests/parser.spec.ts +14 -0
- package/tests/value.spec.ts +387 -0
- package/tsconfig.json +11 -0
|
@@ -0,0 +1,345 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Parser = void 0;
|
|
4
|
+
class Parser {
|
|
5
|
+
constructor(scanner) {
|
|
6
|
+
this.scanner = scanner;
|
|
7
|
+
}
|
|
8
|
+
parse() {
|
|
9
|
+
const ret = this.expression();
|
|
10
|
+
if (!this.scanner.eof()) {
|
|
11
|
+
throw new Error(`Loitering input ${this.scanner.sourceRef}`);
|
|
12
|
+
}
|
|
13
|
+
return ret;
|
|
14
|
+
}
|
|
15
|
+
definitions() {
|
|
16
|
+
const ret = [];
|
|
17
|
+
while (true) {
|
|
18
|
+
const start = this.scanner.consumeIf('let ');
|
|
19
|
+
if (!start) {
|
|
20
|
+
return ret;
|
|
21
|
+
}
|
|
22
|
+
const ident = this.identifier();
|
|
23
|
+
this.scanner.consume('=');
|
|
24
|
+
const value = this.lambda();
|
|
25
|
+
this.scanner.consume(';');
|
|
26
|
+
ret.push({ start, ident, value });
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
expression() {
|
|
30
|
+
const definitions = this.definitions();
|
|
31
|
+
const computation = this.lambda();
|
|
32
|
+
if (definitions.length === 0) {
|
|
33
|
+
return computation;
|
|
34
|
+
}
|
|
35
|
+
return { tag: 'topLevelExpression', definitions, computation };
|
|
36
|
+
}
|
|
37
|
+
lambda() {
|
|
38
|
+
const start = this.scanner.consumeIf('fun');
|
|
39
|
+
if (!start) {
|
|
40
|
+
return this.ifExpression();
|
|
41
|
+
}
|
|
42
|
+
this.scanner.consume('(');
|
|
43
|
+
const args = [];
|
|
44
|
+
if (this.scanner.consumeIf(')')) {
|
|
45
|
+
// no formal args
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
while (true) {
|
|
49
|
+
const arg = this.identifier();
|
|
50
|
+
args.push(arg);
|
|
51
|
+
if (this.scanner.consumeIf(')')) {
|
|
52
|
+
break;
|
|
53
|
+
}
|
|
54
|
+
this.scanner.consume(',');
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
const body = this.expression();
|
|
58
|
+
return { tag: 'lambda', start, formalArgs: args, body };
|
|
59
|
+
}
|
|
60
|
+
ifExpression() {
|
|
61
|
+
if (!this.scanner.consumeIf('if')) {
|
|
62
|
+
return this.unsink();
|
|
63
|
+
}
|
|
64
|
+
this.scanner.consume('(');
|
|
65
|
+
const condition = this.expression();
|
|
66
|
+
this.scanner.consume(')');
|
|
67
|
+
const positive = this.expression();
|
|
68
|
+
this.scanner.consume('else');
|
|
69
|
+
const negative = this.expression();
|
|
70
|
+
return { tag: 'if', condition, positive, negative };
|
|
71
|
+
}
|
|
72
|
+
unsink() {
|
|
73
|
+
const lhs = this.or();
|
|
74
|
+
if (this.scanner.consumeIf('??')) {
|
|
75
|
+
return { tag: 'binaryOperator', operator: '??', lhs, rhs: this.unsink() };
|
|
76
|
+
}
|
|
77
|
+
return lhs;
|
|
78
|
+
}
|
|
79
|
+
or() {
|
|
80
|
+
const lhs = this.and();
|
|
81
|
+
if (this.scanner.consumeIf('||')) {
|
|
82
|
+
return { tag: 'binaryOperator', operator: '||', lhs, rhs: this.or() };
|
|
83
|
+
}
|
|
84
|
+
return lhs;
|
|
85
|
+
}
|
|
86
|
+
and() {
|
|
87
|
+
const lhs = this.equality();
|
|
88
|
+
if (this.scanner.consumeIf('&&')) {
|
|
89
|
+
return { tag: 'binaryOperator', operator: '&&', lhs, rhs: this.and() };
|
|
90
|
+
}
|
|
91
|
+
return lhs;
|
|
92
|
+
}
|
|
93
|
+
equality() {
|
|
94
|
+
const lhs = this.comparison();
|
|
95
|
+
if (this.scanner.consumeIf('==')) {
|
|
96
|
+
return { tag: 'binaryOperator', operator: '==', lhs, rhs: this.equality() };
|
|
97
|
+
}
|
|
98
|
+
if (this.scanner.consumeIf('!=')) {
|
|
99
|
+
return { tag: 'binaryOperator', operator: '!=', lhs, rhs: this.equality() };
|
|
100
|
+
}
|
|
101
|
+
return lhs;
|
|
102
|
+
}
|
|
103
|
+
comparison() {
|
|
104
|
+
const lhs = this.addition();
|
|
105
|
+
if (this.scanner.consumeIf('>=')) {
|
|
106
|
+
return { tag: 'binaryOperator', operator: '>=', lhs, rhs: this.comparison() };
|
|
107
|
+
}
|
|
108
|
+
if (this.scanner.consumeIf('<=')) {
|
|
109
|
+
return { tag: 'binaryOperator', operator: '<=', lhs, rhs: this.comparison() };
|
|
110
|
+
}
|
|
111
|
+
if (this.scanner.consumeIf('>')) {
|
|
112
|
+
return { tag: 'binaryOperator', operator: '>', lhs, rhs: this.comparison() };
|
|
113
|
+
}
|
|
114
|
+
if (this.scanner.consumeIf('<')) {
|
|
115
|
+
return { tag: 'binaryOperator', operator: '<', lhs, rhs: this.comparison() };
|
|
116
|
+
}
|
|
117
|
+
return lhs;
|
|
118
|
+
}
|
|
119
|
+
addition() {
|
|
120
|
+
const lhs = this.multiplication();
|
|
121
|
+
if (this.scanner.consumeIf('+')) {
|
|
122
|
+
return { tag: 'binaryOperator', operator: '+', lhs, rhs: this.addition() };
|
|
123
|
+
}
|
|
124
|
+
if (this.scanner.consumeIf('-')) {
|
|
125
|
+
return { tag: 'binaryOperator', operator: '-', lhs, rhs: this.addition() };
|
|
126
|
+
}
|
|
127
|
+
return lhs;
|
|
128
|
+
}
|
|
129
|
+
multiplication() {
|
|
130
|
+
const lhs = this.power();
|
|
131
|
+
if (this.scanner.consumeIf('*')) {
|
|
132
|
+
return { tag: 'binaryOperator', operator: '*', lhs, rhs: this.multiplication() };
|
|
133
|
+
}
|
|
134
|
+
if (this.scanner.consumeIf('/')) {
|
|
135
|
+
return { tag: 'binaryOperator', operator: '/', lhs, rhs: this.multiplication() };
|
|
136
|
+
}
|
|
137
|
+
if (this.scanner.consumeIf('%')) {
|
|
138
|
+
return { tag: 'binaryOperator', operator: '%', lhs, rhs: this.multiplication() };
|
|
139
|
+
}
|
|
140
|
+
return lhs;
|
|
141
|
+
}
|
|
142
|
+
power() {
|
|
143
|
+
const lhs = this.unary();
|
|
144
|
+
if (this.scanner.consumeIf('**')) {
|
|
145
|
+
return { tag: 'binaryOperator', operator: '**', lhs, rhs: this.power() };
|
|
146
|
+
}
|
|
147
|
+
return lhs;
|
|
148
|
+
}
|
|
149
|
+
unary() {
|
|
150
|
+
let operatorToken = this.scanner.consumeIf('!');
|
|
151
|
+
if (operatorToken) {
|
|
152
|
+
return { tag: 'unaryOperator', operand: this.unary(), operator: '!', operatorToken };
|
|
153
|
+
}
|
|
154
|
+
operatorToken = this.scanner.consumeIf('+');
|
|
155
|
+
if (operatorToken) {
|
|
156
|
+
return { tag: 'unaryOperator', operand: this.unary(), operator: '+', operatorToken };
|
|
157
|
+
}
|
|
158
|
+
operatorToken = this.scanner.consumeIf('-');
|
|
159
|
+
if (operatorToken) {
|
|
160
|
+
return { tag: 'unaryOperator', operand: this.unary(), operator: '-', operatorToken };
|
|
161
|
+
}
|
|
162
|
+
return this.call();
|
|
163
|
+
}
|
|
164
|
+
call() {
|
|
165
|
+
const callee = this.memberAccess();
|
|
166
|
+
if (!this.scanner.consumeIf('(')) {
|
|
167
|
+
return callee;
|
|
168
|
+
}
|
|
169
|
+
const { actualArgs, end } = this.actualArgList();
|
|
170
|
+
return { tag: 'functionCall', actualArgs, callee, end };
|
|
171
|
+
}
|
|
172
|
+
actualArgList() {
|
|
173
|
+
const actualArgs = [];
|
|
174
|
+
const endEmpty = this.scanner.consumeIf(')');
|
|
175
|
+
if (endEmpty) {
|
|
176
|
+
// no actual args
|
|
177
|
+
return { actualArgs, end: endEmpty };
|
|
178
|
+
}
|
|
179
|
+
while (true) {
|
|
180
|
+
const arg = this.expression();
|
|
181
|
+
actualArgs.push(arg);
|
|
182
|
+
const end = this.scanner.consumeIf(')');
|
|
183
|
+
if (end) {
|
|
184
|
+
return { actualArgs, end };
|
|
185
|
+
}
|
|
186
|
+
this.scanner.consume(',');
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
memberAccess() {
|
|
190
|
+
let ret = this.parenthesized();
|
|
191
|
+
while (true) {
|
|
192
|
+
if (this.scanner.consumeIf('.')) {
|
|
193
|
+
ret = { tag: 'dot', receiver: ret, ident: this.identifier() };
|
|
194
|
+
continue;
|
|
195
|
+
}
|
|
196
|
+
if (this.scanner.consumeIf('[')) {
|
|
197
|
+
ret = { tag: 'indexAccess', receiver: ret, index: this.expression() };
|
|
198
|
+
this.scanner.consume(']');
|
|
199
|
+
continue;
|
|
200
|
+
}
|
|
201
|
+
if (this.scanner.consumeIf('(')) {
|
|
202
|
+
const { actualArgs, end } = this.actualArgList();
|
|
203
|
+
ret = { tag: 'functionCall', actualArgs, callee: ret, end };
|
|
204
|
+
continue;
|
|
205
|
+
}
|
|
206
|
+
return ret;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
parenthesized() {
|
|
210
|
+
if (this.scanner.consumeIf('(')) {
|
|
211
|
+
const ret = this.expression();
|
|
212
|
+
this.scanner.consume(')');
|
|
213
|
+
return ret;
|
|
214
|
+
}
|
|
215
|
+
return this.literalOrIdent();
|
|
216
|
+
}
|
|
217
|
+
literalOrIdent() {
|
|
218
|
+
let t = this.scanner.consumeIf('sink!!');
|
|
219
|
+
if (t) {
|
|
220
|
+
return { tag: 'literal', type: 'sink!!', t };
|
|
221
|
+
}
|
|
222
|
+
t = this.scanner.consumeIf('sink!');
|
|
223
|
+
if (t) {
|
|
224
|
+
return { tag: 'literal', type: 'sink!', t };
|
|
225
|
+
}
|
|
226
|
+
t = this.scanner.consumeIf('sink');
|
|
227
|
+
if (t) {
|
|
228
|
+
return { tag: 'literal', type: 'sink', t };
|
|
229
|
+
}
|
|
230
|
+
t = this.scanner.consumeIf('true');
|
|
231
|
+
if (t) {
|
|
232
|
+
return { tag: 'literal', type: 'bool', t };
|
|
233
|
+
}
|
|
234
|
+
t = this.scanner.consumeIf('false');
|
|
235
|
+
if (t) {
|
|
236
|
+
return { tag: 'literal', type: 'bool', t };
|
|
237
|
+
}
|
|
238
|
+
t = this.scanner.consumeIf(/([0-9]*[.])?[0-9]+/);
|
|
239
|
+
if (t) {
|
|
240
|
+
return { tag: 'literal', type: 'num', t };
|
|
241
|
+
}
|
|
242
|
+
// double-quotes-enclosd string
|
|
243
|
+
if (this.scanner.consumeIf(`"`, false)) {
|
|
244
|
+
t = this.scanner.consume(/[^"]*/);
|
|
245
|
+
this.scanner.consume(`"`);
|
|
246
|
+
return { tag: 'literal', type: 'str', t };
|
|
247
|
+
}
|
|
248
|
+
// single-quotes-enclosd string
|
|
249
|
+
if (this.scanner.consumeIf(`'`, false)) {
|
|
250
|
+
t = this.scanner.consume(/[^']*/);
|
|
251
|
+
this.scanner.consume(`'`);
|
|
252
|
+
return { tag: 'literal', type: 'str', t };
|
|
253
|
+
}
|
|
254
|
+
t = this.scanner.consumeIf('[');
|
|
255
|
+
if (t) {
|
|
256
|
+
return this.arrayBody(t);
|
|
257
|
+
}
|
|
258
|
+
t = this.scanner.consumeIf('{');
|
|
259
|
+
if (t) {
|
|
260
|
+
return this.objectBody(t);
|
|
261
|
+
}
|
|
262
|
+
const ident = this.maybeIdentifier();
|
|
263
|
+
if (ident) {
|
|
264
|
+
return ident;
|
|
265
|
+
}
|
|
266
|
+
throw new Error(`Unparsable input ${this.scanner.sourceRef}`);
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* This method assumes that the caller consumed the opening '[' token. It consumes the array's elements
|
|
270
|
+
* (comma-separated list of expressions) as well as the closing ']' token.
|
|
271
|
+
*/
|
|
272
|
+
arrayBody(start) {
|
|
273
|
+
const t = this.scanner.consumeIf(']');
|
|
274
|
+
if (t) {
|
|
275
|
+
// an empty array literal
|
|
276
|
+
return { tag: 'arrayLiteral', start, parts: [], end: t };
|
|
277
|
+
}
|
|
278
|
+
const parts = [];
|
|
279
|
+
while (true) {
|
|
280
|
+
if (this.scanner.consumeIf('...')) {
|
|
281
|
+
parts.push({ tag: 'spread', v: this.expression() });
|
|
282
|
+
}
|
|
283
|
+
else {
|
|
284
|
+
const exp = this.expression();
|
|
285
|
+
parts.push({ tag: 'element', v: exp });
|
|
286
|
+
}
|
|
287
|
+
const end = this.scanner.consumeIf(']');
|
|
288
|
+
if (end) {
|
|
289
|
+
return { tag: 'arrayLiteral', start, parts, end };
|
|
290
|
+
}
|
|
291
|
+
this.scanner.consume(',');
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* This method assumes that the caller consumed the opening '{' token. It consumes the object's attributes
|
|
296
|
+
* (comma-separated list of key:value parirs) as well as the closing '}' token.
|
|
297
|
+
*/
|
|
298
|
+
objectBody(start) {
|
|
299
|
+
const t = this.scanner.consumeIf('}');
|
|
300
|
+
if (t) {
|
|
301
|
+
// an empty array literal
|
|
302
|
+
return { tag: 'objectLiteral', start, parts: [], end: t };
|
|
303
|
+
}
|
|
304
|
+
const parts = [];
|
|
305
|
+
while (true) {
|
|
306
|
+
if (this.scanner.consumeIf('...')) {
|
|
307
|
+
parts.push({ tag: 'spread', o: this.expression() });
|
|
308
|
+
}
|
|
309
|
+
else if (this.scanner.consumeIf('[')) {
|
|
310
|
+
const k = this.expression();
|
|
311
|
+
this.scanner.consume(']');
|
|
312
|
+
this.scanner.consume(':');
|
|
313
|
+
const v = this.expression();
|
|
314
|
+
parts.push({ tag: 'computedName', k, v });
|
|
315
|
+
}
|
|
316
|
+
else {
|
|
317
|
+
const k = this.identifier();
|
|
318
|
+
this.scanner.consume(':');
|
|
319
|
+
const v = this.expression();
|
|
320
|
+
parts.push({ tag: 'hardName', k, v });
|
|
321
|
+
}
|
|
322
|
+
const end = this.scanner.consumeIf('}');
|
|
323
|
+
if (end) {
|
|
324
|
+
return { tag: 'objectLiteral', start, parts, end };
|
|
325
|
+
}
|
|
326
|
+
this.scanner.consume(',');
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
identifier() {
|
|
330
|
+
const ret = this.maybeIdentifier();
|
|
331
|
+
if (!ret) {
|
|
332
|
+
throw new Error(`Expected an identifier ${this.scanner.sourceRef}`);
|
|
333
|
+
}
|
|
334
|
+
return ret;
|
|
335
|
+
}
|
|
336
|
+
maybeIdentifier() {
|
|
337
|
+
const t = this.scanner.consumeIf(/[a-zA-Z][0-9A-Za-z_]*/);
|
|
338
|
+
if (t) {
|
|
339
|
+
return { tag: 'ident', t };
|
|
340
|
+
}
|
|
341
|
+
return undefined;
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
exports.Parser = Parser;
|
|
345
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BhcnNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFHQSxNQUFhLE1BQU07SUFDakIsWUFBNkIsT0FBZ0I7UUFBaEIsWUFBTyxHQUFQLE9BQU8sQ0FBUztJQUFHLENBQUM7SUFFakQsS0FBSztRQUNILE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQTtRQUM3QixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUN2QixNQUFNLElBQUksS0FBSyxDQUFDLG1CQUFtQixJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUE7U0FDN0Q7UUFDRCxPQUFPLEdBQUcsQ0FBQTtJQUNaLENBQUM7SUFFRCxXQUFXO1FBQ1QsTUFBTSxHQUFHLEdBQVUsRUFBRSxDQUFBO1FBQ3JCLE9BQU8sSUFBSSxFQUFFO1lBQ1gsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUE7WUFDNUMsSUFBSSxDQUFDLEtBQUssRUFBRTtnQkFDVixPQUFPLEdBQUcsQ0FBQTthQUNYO1lBQ0QsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFBO1lBQy9CLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBQ3pCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQTtZQUMzQixJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUV6QixHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFBO1NBQ2xDO0lBQ0gsQ0FBQztJQUVELFVBQVU7UUFDUixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFF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
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { Span } from './location';
|
|
2
|
+
import { SourceCode } from './source-code';
|
|
3
|
+
import { Value } from './value';
|
|
4
|
+
export declare type ResultSink = {
|
|
5
|
+
tag: 'sink';
|
|
6
|
+
where: Span | undefined;
|
|
7
|
+
trace: string | undefined;
|
|
8
|
+
symbols: Record<string, unknown> | undefined;
|
|
9
|
+
message: string;
|
|
10
|
+
};
|
|
11
|
+
export declare type Result = {
|
|
12
|
+
tag: 'ok';
|
|
13
|
+
value: unknown;
|
|
14
|
+
} | ResultSink;
|
|
15
|
+
export declare class ResultSinkImpl {
|
|
16
|
+
private readonly sink;
|
|
17
|
+
private readonly sourceCode;
|
|
18
|
+
readonly tag = "sink";
|
|
19
|
+
constructor(sink: Value, sourceCode: SourceCode);
|
|
20
|
+
get where(): Span | undefined;
|
|
21
|
+
get trace(): string | undefined;
|
|
22
|
+
get symbols(): Record<string, unknown> | undefined;
|
|
23
|
+
get message(): string;
|
|
24
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ResultSinkImpl = void 0;
|
|
4
|
+
class ResultSinkImpl {
|
|
5
|
+
constructor(sink, sourceCode) {
|
|
6
|
+
this.sink = sink;
|
|
7
|
+
this.sourceCode = sourceCode;
|
|
8
|
+
this.tag = 'sink';
|
|
9
|
+
}
|
|
10
|
+
get where() {
|
|
11
|
+
return this.sink.span();
|
|
12
|
+
}
|
|
13
|
+
get trace() {
|
|
14
|
+
const trace = this.sink.trace();
|
|
15
|
+
if (trace) {
|
|
16
|
+
return this.sourceCode.formatTrace(trace);
|
|
17
|
+
}
|
|
18
|
+
return undefined;
|
|
19
|
+
}
|
|
20
|
+
get symbols() {
|
|
21
|
+
return this.sink.symbols()?.export();
|
|
22
|
+
}
|
|
23
|
+
get message() {
|
|
24
|
+
const at = this.trace ?? this.sourceCode.sourceRef(this.where);
|
|
25
|
+
return `Evaluated to sink: ${at}`;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
exports.ResultSinkImpl = ResultSinkImpl;
|
|
29
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdWx0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Jlc3VsdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFtQkEsTUFBYSxjQUFjO0lBRXpCLFlBQTZCLElBQVcsRUFBbUIsVUFBc0I7UUFBcEQsU0FBSSxHQUFKLElBQUksQ0FBTztRQUFtQixlQUFVLEdBQVYsVUFBVSxDQUFZO1FBRHhFLFFBQUcsR0FBRyxNQUFNLENBQUE7SUFDK0QsQ0FBQztJQUVyRixJQUFJLEtBQUs7UUFDUCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUE7SUFDekIsQ0FBQztJQUVELElBQUksS0FBSztRQUNQLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUE7UUFDL0IsSUFBSSxLQUFLLEVBQUU7WUFDVCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFBO1NBQzFDO1FBRUQsT0FBTyxTQUFTLENBQUE7SUFDbEIsQ0FBQztJQUVELElBQUksT0FBTztRQUNULE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQTtJQUN0QyxDQUFDO0lBRUQsSUFBSSxPQUFPO1FBQ1QsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDOUQsT0FBTyxzQkFBc0IsRUFBRSxFQUFFLENBQUE7SUFDbkMsQ0FBQztDQUNGO0FBekJELHdDQXlCQyJ9
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { AstNode } from './ast-node';
|
|
2
|
+
import { Parser } from './parser';
|
|
3
|
+
import { Value } from './value';
|
|
4
|
+
export declare type Verbosity = 'quiet' | 'trace';
|
|
5
|
+
export declare class Runtime {
|
|
6
|
+
private readonly root;
|
|
7
|
+
private readonly verbosity;
|
|
8
|
+
private readonly parser;
|
|
9
|
+
private stack;
|
|
10
|
+
constructor(root: AstNode, verbosity: Verbosity, parser: Parser);
|
|
11
|
+
compute(): {
|
|
12
|
+
value: Value;
|
|
13
|
+
expressionTrace?: undefined;
|
|
14
|
+
errorMessage?: undefined;
|
|
15
|
+
stack?: undefined;
|
|
16
|
+
} | {
|
|
17
|
+
expressionTrace: AstNode[];
|
|
18
|
+
errorMessage: unknown;
|
|
19
|
+
stack: string[] | undefined;
|
|
20
|
+
value?: undefined;
|
|
21
|
+
};
|
|
22
|
+
private evalNode;
|
|
23
|
+
private evalNodeImpl;
|
|
24
|
+
call(callee: Value, argValues: Value[]): Value;
|
|
25
|
+
}
|