septima-lang 0.0.7 → 0.0.8
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 +103 -0
- package/dist/src/ast-node.js +156 -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 +45 -0
- package/dist/src/parser.js +483 -0
- package/dist/src/result.d.ts +24 -0
- package/dist/src/result.js +29 -0
- package/dist/src/runtime.d.ts +28 -0
- package/dist/src/runtime.js +351 -0
- package/dist/src/scanner.d.ts +23 -0
- package/dist/src/scanner.js +88 -0
- package/dist/src/septima.d.ts +32 -0
- package/dist/src/septima.js +91 -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 +6 -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/parser.spec.d.ts +1 -0
- package/dist/tests/parser.spec.js +35 -0
- package/dist/tests/septima-compute-module.spec.d.ts +1 -0
- package/dist/tests/septima-compute-module.spec.js +36 -0
- package/dist/tests/septima.spec.d.ts +1 -0
- package/dist/tests/septima.spec.js +845 -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/package.json +3 -3
- package/src/a.js +66 -0
- package/src/ast-node.ts +269 -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 +554 -0
- package/src/result.ts +45 -0
- package/src/runtime.ts +370 -0
- package/src/scanner.ts +106 -0
- package/src/septima.ts +121 -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 +7 -0
- package/src/value.ts +742 -0
- package/tests/parser.spec.ts +36 -0
- package/tests/septima-compute-module.spec.ts +41 -0
- package/tests/septima.spec.ts +921 -0
- package/tests/value.spec.ts +387 -0
- package/main.js +0 -1
|
@@ -0,0 +1,483 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Parser = void 0;
|
|
4
|
+
const ast_node_1 = require("./ast-node");
|
|
5
|
+
const switch_on_1 = require("./switch-on");
|
|
6
|
+
class Parser {
|
|
7
|
+
constructor(scanner) {
|
|
8
|
+
this.scanner = scanner;
|
|
9
|
+
}
|
|
10
|
+
parse() {
|
|
11
|
+
const ret = this.unit();
|
|
12
|
+
if (!this.scanner.eof()) {
|
|
13
|
+
throw new Error(`Loitering input ${this.scanner.sourceRef}`);
|
|
14
|
+
}
|
|
15
|
+
return ret;
|
|
16
|
+
}
|
|
17
|
+
unit() {
|
|
18
|
+
const imports = this.imports();
|
|
19
|
+
const expression = this.expression('TOP_LEVEL');
|
|
20
|
+
return { tag: 'unit', imports, expression };
|
|
21
|
+
}
|
|
22
|
+
imports() {
|
|
23
|
+
const ret = [];
|
|
24
|
+
while (true) {
|
|
25
|
+
const start = this.scanner.consumeIf('import');
|
|
26
|
+
if (!start) {
|
|
27
|
+
return ret;
|
|
28
|
+
}
|
|
29
|
+
this.scanner.consume('*');
|
|
30
|
+
this.scanner.consume('as');
|
|
31
|
+
const ident = this.identifier();
|
|
32
|
+
this.scanner.consume('from');
|
|
33
|
+
const pathToImportFrom = this.maybePrimitiveLiteral();
|
|
34
|
+
if (pathToImportFrom === undefined) {
|
|
35
|
+
throw new Error(`Expected a literal ${this.scanner.sourceRef}`);
|
|
36
|
+
}
|
|
37
|
+
const notString = () => {
|
|
38
|
+
throw new Error(`Expected a string literal ${this.scanner.sourceCode.sourceRef((0, ast_node_1.span)(pathToImportFrom))}`);
|
|
39
|
+
};
|
|
40
|
+
(0, switch_on_1.switchOn)(pathToImportFrom.type, {
|
|
41
|
+
bool: notString,
|
|
42
|
+
num: notString,
|
|
43
|
+
str: () => { },
|
|
44
|
+
sink: notString,
|
|
45
|
+
'sink!': notString,
|
|
46
|
+
'sink!!': notString,
|
|
47
|
+
});
|
|
48
|
+
ret.push({ start, ident, pathToImportFrom: pathToImportFrom.t });
|
|
49
|
+
this.scanner.consumeIf(';');
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
definitions(kind) {
|
|
53
|
+
const ret = [];
|
|
54
|
+
while (true) {
|
|
55
|
+
if (kind === 'NESTED') {
|
|
56
|
+
if (this.scanner.headMatches('export ')) {
|
|
57
|
+
throw new Error(`non-top-level definition cannot be export ${this.scanner.sourceRef}`);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
let start = this.scanner.consumeIf('let ');
|
|
61
|
+
if (!start && kind === 'TOP_LEVEL') {
|
|
62
|
+
start = this.scanner.consumeIf('export let ');
|
|
63
|
+
}
|
|
64
|
+
if (!start) {
|
|
65
|
+
return ret;
|
|
66
|
+
}
|
|
67
|
+
const ident = this.identifier();
|
|
68
|
+
this.scanner.consume('=');
|
|
69
|
+
const value = this.lambda();
|
|
70
|
+
ret.push({ start, ident, value });
|
|
71
|
+
this.scanner.consumeIf(';');
|
|
72
|
+
if (!this.scanner.headMatches('let ')) {
|
|
73
|
+
return ret;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
expression(kind = 'NESTED') {
|
|
78
|
+
const definitions = this.definitions(kind);
|
|
79
|
+
if (kind === 'TOP_LEVEL' && this.scanner.eof()) {
|
|
80
|
+
return { tag: 'topLevelExpression', definitions };
|
|
81
|
+
}
|
|
82
|
+
this.scanner.consumeIf('return');
|
|
83
|
+
const computation = this.lambda();
|
|
84
|
+
if (definitions.length === 0) {
|
|
85
|
+
return computation;
|
|
86
|
+
}
|
|
87
|
+
return { tag: 'topLevelExpression', definitions, computation };
|
|
88
|
+
}
|
|
89
|
+
lambda() {
|
|
90
|
+
const start = this.scanner.consumeIf('fun');
|
|
91
|
+
if (!start) {
|
|
92
|
+
return this.arrowFunction();
|
|
93
|
+
}
|
|
94
|
+
this.scanner.consume('(');
|
|
95
|
+
const args = [];
|
|
96
|
+
if (this.scanner.consumeIf(')')) {
|
|
97
|
+
// no formal args
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
while (true) {
|
|
101
|
+
const arg = this.identifier();
|
|
102
|
+
args.push(arg);
|
|
103
|
+
if (this.scanner.consumeIf(')')) {
|
|
104
|
+
break;
|
|
105
|
+
}
|
|
106
|
+
this.scanner.consume(',');
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
const body = this.expression();
|
|
110
|
+
return { tag: 'lambda', start, formalArgs: args, body };
|
|
111
|
+
}
|
|
112
|
+
arrowFunction() {
|
|
113
|
+
if (this.scanner.headMatches('(', ')', '=>')) {
|
|
114
|
+
const start = this.scanner.consume('(');
|
|
115
|
+
this.scanner.consume(')');
|
|
116
|
+
this.scanner.consume('=>');
|
|
117
|
+
const body = this.lambdaBody();
|
|
118
|
+
return { tag: 'lambda', start, formalArgs: [], body };
|
|
119
|
+
}
|
|
120
|
+
if (this.scanner.headMatches(IDENT_PATTERN, '=>')) {
|
|
121
|
+
const ident = this.identifier();
|
|
122
|
+
this.scanner.consume('=>');
|
|
123
|
+
const body = this.lambdaBody();
|
|
124
|
+
return { tag: 'lambda', start: ident.t, formalArgs: [ident], body };
|
|
125
|
+
}
|
|
126
|
+
if (this.scanner.headMatches('(', IDENT_PATTERN, ')', '=>')) {
|
|
127
|
+
const start = this.scanner.consume('(');
|
|
128
|
+
const ident = this.identifier();
|
|
129
|
+
this.scanner.consume(')');
|
|
130
|
+
this.scanner.consume('=>');
|
|
131
|
+
const body = this.lambdaBody();
|
|
132
|
+
return { tag: 'lambda', start, formalArgs: [ident], body };
|
|
133
|
+
}
|
|
134
|
+
if (this.scanner.headMatches('(', IDENT_PATTERN, ',')) {
|
|
135
|
+
const start = this.scanner.consume('(');
|
|
136
|
+
const formalArgs = [];
|
|
137
|
+
while (true) {
|
|
138
|
+
const ident = this.identifier();
|
|
139
|
+
formalArgs.push(ident);
|
|
140
|
+
if (this.scanner.consumeIf(')')) {
|
|
141
|
+
break;
|
|
142
|
+
}
|
|
143
|
+
this.scanner.consume(',');
|
|
144
|
+
}
|
|
145
|
+
this.scanner.consume('=>');
|
|
146
|
+
const body = this.lambdaBody();
|
|
147
|
+
return { tag: 'lambda', start, formalArgs, body };
|
|
148
|
+
}
|
|
149
|
+
return this.ifExpression();
|
|
150
|
+
}
|
|
151
|
+
lambdaBody() {
|
|
152
|
+
if (this.scanner.consumeIf('{')) {
|
|
153
|
+
const ret = this.expression();
|
|
154
|
+
this.scanner.consume('}');
|
|
155
|
+
return ret;
|
|
156
|
+
}
|
|
157
|
+
return this.expression();
|
|
158
|
+
}
|
|
159
|
+
ifExpression() {
|
|
160
|
+
if (!this.scanner.consumeIf('if')) {
|
|
161
|
+
return this.ternary();
|
|
162
|
+
}
|
|
163
|
+
this.scanner.consume('(');
|
|
164
|
+
const condition = this.expression();
|
|
165
|
+
this.scanner.consume(')');
|
|
166
|
+
const positive = this.expression();
|
|
167
|
+
this.scanner.consume('else');
|
|
168
|
+
const negative = this.expression();
|
|
169
|
+
return { tag: 'if', condition, positive, negative };
|
|
170
|
+
}
|
|
171
|
+
ternary() {
|
|
172
|
+
const condition = this.unsink();
|
|
173
|
+
if (!this.scanner.consumeIf('? ')) {
|
|
174
|
+
return condition;
|
|
175
|
+
}
|
|
176
|
+
const positive = this.expression();
|
|
177
|
+
this.scanner.consume(':');
|
|
178
|
+
const negative = this.expression();
|
|
179
|
+
return { tag: 'ternary', condition, positive, negative };
|
|
180
|
+
}
|
|
181
|
+
unsink() {
|
|
182
|
+
const lhs = this.or();
|
|
183
|
+
if (this.scanner.consumeIf('??')) {
|
|
184
|
+
return { tag: 'binaryOperator', operator: '??', lhs, rhs: this.unsink() };
|
|
185
|
+
}
|
|
186
|
+
return lhs;
|
|
187
|
+
}
|
|
188
|
+
or() {
|
|
189
|
+
const lhs = this.and();
|
|
190
|
+
if (this.scanner.consumeIf('||')) {
|
|
191
|
+
return { tag: 'binaryOperator', operator: '||', lhs, rhs: this.or() };
|
|
192
|
+
}
|
|
193
|
+
return lhs;
|
|
194
|
+
}
|
|
195
|
+
and() {
|
|
196
|
+
const lhs = this.equality();
|
|
197
|
+
if (this.scanner.consumeIf('&&')) {
|
|
198
|
+
return { tag: 'binaryOperator', operator: '&&', lhs, rhs: this.and() };
|
|
199
|
+
}
|
|
200
|
+
return lhs;
|
|
201
|
+
}
|
|
202
|
+
equality() {
|
|
203
|
+
const lhs = this.comparison();
|
|
204
|
+
if (this.scanner.consumeIf('==')) {
|
|
205
|
+
return { tag: 'binaryOperator', operator: '==', lhs, rhs: this.equality() };
|
|
206
|
+
}
|
|
207
|
+
if (this.scanner.consumeIf('!=')) {
|
|
208
|
+
return { tag: 'binaryOperator', operator: '!=', lhs, rhs: this.equality() };
|
|
209
|
+
}
|
|
210
|
+
return lhs;
|
|
211
|
+
}
|
|
212
|
+
comparison() {
|
|
213
|
+
const lhs = this.addition();
|
|
214
|
+
if (this.scanner.consumeIf('>=')) {
|
|
215
|
+
return { tag: 'binaryOperator', operator: '>=', lhs, rhs: this.comparison() };
|
|
216
|
+
}
|
|
217
|
+
if (this.scanner.consumeIf('<=')) {
|
|
218
|
+
return { tag: 'binaryOperator', operator: '<=', lhs, rhs: this.comparison() };
|
|
219
|
+
}
|
|
220
|
+
if (this.scanner.consumeIf('>')) {
|
|
221
|
+
return { tag: 'binaryOperator', operator: '>', lhs, rhs: this.comparison() };
|
|
222
|
+
}
|
|
223
|
+
if (this.scanner.consumeIf('<')) {
|
|
224
|
+
return { tag: 'binaryOperator', operator: '<', lhs, rhs: this.comparison() };
|
|
225
|
+
}
|
|
226
|
+
return lhs;
|
|
227
|
+
}
|
|
228
|
+
addition() {
|
|
229
|
+
const lhs = this.multiplication();
|
|
230
|
+
if (this.scanner.consumeIf('+')) {
|
|
231
|
+
return { tag: 'binaryOperator', operator: '+', lhs, rhs: this.addition() };
|
|
232
|
+
}
|
|
233
|
+
if (this.scanner.consumeIf('-')) {
|
|
234
|
+
return { tag: 'binaryOperator', operator: '-', lhs, rhs: this.addition() };
|
|
235
|
+
}
|
|
236
|
+
return lhs;
|
|
237
|
+
}
|
|
238
|
+
multiplication() {
|
|
239
|
+
const lhs = this.power();
|
|
240
|
+
if (this.scanner.consumeIf('*')) {
|
|
241
|
+
return { tag: 'binaryOperator', operator: '*', lhs, rhs: this.multiplication() };
|
|
242
|
+
}
|
|
243
|
+
if (this.scanner.consumeIf('/')) {
|
|
244
|
+
return { tag: 'binaryOperator', operator: '/', lhs, rhs: this.multiplication() };
|
|
245
|
+
}
|
|
246
|
+
if (this.scanner.consumeIf('%')) {
|
|
247
|
+
return { tag: 'binaryOperator', operator: '%', lhs, rhs: this.multiplication() };
|
|
248
|
+
}
|
|
249
|
+
return lhs;
|
|
250
|
+
}
|
|
251
|
+
power() {
|
|
252
|
+
const lhs = this.unary();
|
|
253
|
+
if (this.scanner.consumeIf('**')) {
|
|
254
|
+
return { tag: 'binaryOperator', operator: '**', lhs, rhs: this.power() };
|
|
255
|
+
}
|
|
256
|
+
return lhs;
|
|
257
|
+
}
|
|
258
|
+
unary() {
|
|
259
|
+
let operatorToken = this.scanner.consumeIf('!');
|
|
260
|
+
if (operatorToken) {
|
|
261
|
+
return { tag: 'unaryOperator', operand: this.unary(), operator: '!', operatorToken };
|
|
262
|
+
}
|
|
263
|
+
operatorToken = this.scanner.consumeIf('+');
|
|
264
|
+
if (operatorToken) {
|
|
265
|
+
return { tag: 'unaryOperator', operand: this.unary(), operator: '+', operatorToken };
|
|
266
|
+
}
|
|
267
|
+
operatorToken = this.scanner.consumeIf('-');
|
|
268
|
+
if (operatorToken) {
|
|
269
|
+
return { tag: 'unaryOperator', operand: this.unary(), operator: '-', operatorToken };
|
|
270
|
+
}
|
|
271
|
+
return this.call();
|
|
272
|
+
}
|
|
273
|
+
call() {
|
|
274
|
+
const callee = this.memberAccess();
|
|
275
|
+
if (!this.scanner.consumeIf('(')) {
|
|
276
|
+
return callee;
|
|
277
|
+
}
|
|
278
|
+
const { actualArgs, end } = this.actualArgList();
|
|
279
|
+
return { tag: 'functionCall', actualArgs, callee, end };
|
|
280
|
+
}
|
|
281
|
+
actualArgList() {
|
|
282
|
+
const actualArgs = [];
|
|
283
|
+
const endEmpty = this.scanner.consumeIf(')');
|
|
284
|
+
if (endEmpty) {
|
|
285
|
+
// no actual args
|
|
286
|
+
return { actualArgs, end: endEmpty };
|
|
287
|
+
}
|
|
288
|
+
while (true) {
|
|
289
|
+
const arg = this.expression();
|
|
290
|
+
actualArgs.push(arg);
|
|
291
|
+
let end = this.scanner.consumeIf(')');
|
|
292
|
+
if (end) {
|
|
293
|
+
return { actualArgs, end };
|
|
294
|
+
}
|
|
295
|
+
this.scanner.consume(',');
|
|
296
|
+
end = this.scanner.consumeIf(')');
|
|
297
|
+
if (end) {
|
|
298
|
+
return { actualArgs, end };
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
memberAccess() {
|
|
303
|
+
let ret = this.parenthesized();
|
|
304
|
+
while (true) {
|
|
305
|
+
if (this.scanner.consumeIf('.')) {
|
|
306
|
+
ret = { tag: 'dot', receiver: ret, ident: this.identifier() };
|
|
307
|
+
continue;
|
|
308
|
+
}
|
|
309
|
+
if (this.scanner.consumeIf('[')) {
|
|
310
|
+
ret = { tag: 'indexAccess', receiver: ret, index: this.expression() };
|
|
311
|
+
this.scanner.consume(']');
|
|
312
|
+
continue;
|
|
313
|
+
}
|
|
314
|
+
if (this.scanner.consumeIf('(')) {
|
|
315
|
+
const { actualArgs, end } = this.actualArgList();
|
|
316
|
+
ret = { tag: 'functionCall', actualArgs, callee: ret, end };
|
|
317
|
+
continue;
|
|
318
|
+
}
|
|
319
|
+
return ret;
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
parenthesized() {
|
|
323
|
+
if (this.scanner.consumeIf('(')) {
|
|
324
|
+
const ret = this.expression();
|
|
325
|
+
this.scanner.consume(')');
|
|
326
|
+
return ret;
|
|
327
|
+
}
|
|
328
|
+
return this.literalOrIdent();
|
|
329
|
+
}
|
|
330
|
+
literalOrIdent() {
|
|
331
|
+
const ret = this.maybeLiteral() ?? this.maybeIdentifier();
|
|
332
|
+
if (!ret) {
|
|
333
|
+
throw new Error(`Unparsable input ${this.scanner.sourceRef}`);
|
|
334
|
+
}
|
|
335
|
+
return ret;
|
|
336
|
+
}
|
|
337
|
+
maybeLiteral() {
|
|
338
|
+
return this.maybePrimitiveLiteral() ?? this.maybeCompositeLiteral();
|
|
339
|
+
}
|
|
340
|
+
maybePrimitiveLiteral() {
|
|
341
|
+
let t = this.scanner.consumeIf('sink!!') || this.scanner.consumeIf('undefined!!');
|
|
342
|
+
if (t) {
|
|
343
|
+
return { tag: 'literal', type: 'sink!!', t };
|
|
344
|
+
}
|
|
345
|
+
t = this.scanner.consumeIf('sink!') || this.scanner.consumeIf('undefined!');
|
|
346
|
+
if (t) {
|
|
347
|
+
return { tag: 'literal', type: 'sink!', t };
|
|
348
|
+
}
|
|
349
|
+
t = this.scanner.consumeIf('sink') || this.scanner.consumeIf('undefined');
|
|
350
|
+
if (t) {
|
|
351
|
+
return { tag: 'literal', type: 'sink', t };
|
|
352
|
+
}
|
|
353
|
+
t = this.scanner.consumeIf('true');
|
|
354
|
+
if (t) {
|
|
355
|
+
return { tag: 'literal', type: 'bool', t };
|
|
356
|
+
}
|
|
357
|
+
t = this.scanner.consumeIf('false');
|
|
358
|
+
if (t) {
|
|
359
|
+
return { tag: 'literal', type: 'bool', t };
|
|
360
|
+
}
|
|
361
|
+
t = this.scanner.consumeIf(/([0-9]*[.])?[0-9]+/);
|
|
362
|
+
if (t) {
|
|
363
|
+
return { tag: 'literal', type: 'num', t };
|
|
364
|
+
}
|
|
365
|
+
// double-quotes-enclosd string
|
|
366
|
+
if (this.scanner.consumeIf(`"`, false)) {
|
|
367
|
+
t = this.scanner.consume(/[^"]*/);
|
|
368
|
+
this.scanner.consume(`"`);
|
|
369
|
+
return { tag: 'literal', type: 'str', t };
|
|
370
|
+
}
|
|
371
|
+
// single-quotes-enclosd string
|
|
372
|
+
if (this.scanner.consumeIf(`'`, false)) {
|
|
373
|
+
t = this.scanner.consume(/[^']*/);
|
|
374
|
+
this.scanner.consume(`'`);
|
|
375
|
+
return { tag: 'literal', type: 'str', t };
|
|
376
|
+
}
|
|
377
|
+
return undefined;
|
|
378
|
+
}
|
|
379
|
+
maybeCompositeLiteral() {
|
|
380
|
+
let t = this.scanner.consumeIf('[');
|
|
381
|
+
if (t) {
|
|
382
|
+
return this.arrayBody(t);
|
|
383
|
+
}
|
|
384
|
+
t = this.scanner.consumeIf('{');
|
|
385
|
+
if (t) {
|
|
386
|
+
return this.objectBody(t);
|
|
387
|
+
}
|
|
388
|
+
return undefined;
|
|
389
|
+
}
|
|
390
|
+
/**
|
|
391
|
+
* This method assumes that the caller consumed the opening '[' token. It consumes the array's elements
|
|
392
|
+
* (comma-separated list of expressions) as well as the closing ']' token.
|
|
393
|
+
*/
|
|
394
|
+
arrayBody(start) {
|
|
395
|
+
const t = this.scanner.consumeIf(']');
|
|
396
|
+
if (t) {
|
|
397
|
+
// an empty array literal
|
|
398
|
+
return { tag: 'arrayLiteral', start, parts: [], end: t };
|
|
399
|
+
}
|
|
400
|
+
const parts = [];
|
|
401
|
+
while (true) {
|
|
402
|
+
if (this.scanner.consumeIf(',')) {
|
|
403
|
+
const end = this.scanner.consumeIf(']');
|
|
404
|
+
if (end) {
|
|
405
|
+
return { tag: 'arrayLiteral', start, parts, end };
|
|
406
|
+
}
|
|
407
|
+
continue;
|
|
408
|
+
}
|
|
409
|
+
if (this.scanner.consumeIf('...')) {
|
|
410
|
+
parts.push({ tag: 'spread', v: this.expression() });
|
|
411
|
+
}
|
|
412
|
+
else {
|
|
413
|
+
const exp = this.expression();
|
|
414
|
+
parts.push({ tag: 'element', v: exp });
|
|
415
|
+
}
|
|
416
|
+
let end = this.scanner.consumeIf(']');
|
|
417
|
+
if (end) {
|
|
418
|
+
return { tag: 'arrayLiteral', start, parts, end };
|
|
419
|
+
}
|
|
420
|
+
this.scanner.consume(',');
|
|
421
|
+
end = this.scanner.consumeIf(']');
|
|
422
|
+
if (end) {
|
|
423
|
+
return { tag: 'arrayLiteral', start, parts, end };
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
/**
|
|
428
|
+
* This method assumes that the caller consumed the opening '{' token. It consumes the object's attributes
|
|
429
|
+
* (comma-separated list of key:value parirs) as well as the closing '}' token.
|
|
430
|
+
*/
|
|
431
|
+
objectBody(start) {
|
|
432
|
+
const t = this.scanner.consumeIf('}');
|
|
433
|
+
if (t) {
|
|
434
|
+
// an empty array literal
|
|
435
|
+
return { tag: 'objectLiteral', start, parts: [], end: t };
|
|
436
|
+
}
|
|
437
|
+
const parts = [];
|
|
438
|
+
while (true) {
|
|
439
|
+
if (this.scanner.consumeIf('...')) {
|
|
440
|
+
parts.push({ tag: 'spread', o: this.expression() });
|
|
441
|
+
}
|
|
442
|
+
else if (this.scanner.consumeIf('[')) {
|
|
443
|
+
const k = this.expression();
|
|
444
|
+
this.scanner.consume(']');
|
|
445
|
+
this.scanner.consume(':');
|
|
446
|
+
const v = this.expression();
|
|
447
|
+
parts.push({ tag: 'computedName', k, v });
|
|
448
|
+
}
|
|
449
|
+
else {
|
|
450
|
+
const k = this.identifier();
|
|
451
|
+
this.scanner.consume(':');
|
|
452
|
+
const v = this.expression();
|
|
453
|
+
parts.push({ tag: 'hardName', k, v });
|
|
454
|
+
}
|
|
455
|
+
let end = this.scanner.consumeIf('}');
|
|
456
|
+
if (end) {
|
|
457
|
+
return { tag: 'objectLiteral', start, parts, end };
|
|
458
|
+
}
|
|
459
|
+
this.scanner.consume(',');
|
|
460
|
+
end = this.scanner.consumeIf('}');
|
|
461
|
+
if (end) {
|
|
462
|
+
return { tag: 'objectLiteral', start, parts, end };
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
identifier() {
|
|
467
|
+
const ret = this.maybeIdentifier();
|
|
468
|
+
if (!ret) {
|
|
469
|
+
throw new Error(`Expected an identifier ${this.scanner.sourceRef}`);
|
|
470
|
+
}
|
|
471
|
+
return ret;
|
|
472
|
+
}
|
|
473
|
+
maybeIdentifier() {
|
|
474
|
+
const t = this.scanner.consumeIf(IDENT_PATTERN);
|
|
475
|
+
if (t) {
|
|
476
|
+
return { tag: 'ident', t };
|
|
477
|
+
}
|
|
478
|
+
return undefined;
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
exports.Parser = Parser;
|
|
482
|
+
const IDENT_PATTERN = /[a-zA-Z][0-9A-Za-z_]*/;
|
|
483
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BhcnNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx5Q0FBa0g7QUFFbEgsMkNBQXNDO0FBRXRDLE1BQWEsTUFBTTtJQUNqQixZQUE2QixPQUFnQjtRQUFoQixZQUFPLEdBQVAsT0FBTyxDQUFTO0lBQUcsQ0FBQztJQUVqRCxLQUFLO1FBQ0gsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFBO1FBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ3ZCLE1BQU0sSUFBSSxLQUFLLENBQUMsbUJBQW1CLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQTtTQUM3RDtRQUNELE9BQU8sR0FBRyxDQUFBO0lBQ1osQ0FBQztJQUVELElBQUk7UUFDRixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUE7UUFDOUIsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQTtRQUMvQyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLENBQUE7SUFDN0MsQ0FBQztJQUVELE9BQU87UUFDTCxNQUFNLEdBQUcsR0FBYSxFQUFFLENBQUE7UUFDeEIsT0FBTyxJQUFJLEVBQUU7WUFDWCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQTtZQUM5QyxJQUFJLENBQUMsS0FBSyxFQUFFO2dCQUNWLE9BQU8sR0FBRyxDQUFBO2FBQ1g7WUFFRCxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUN6QixJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQTtZQUMxQixNQUFNLEtBQUssR0FB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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,28 @@
|
|
|
1
|
+
import { AstNode, Unit } from './ast-node';
|
|
2
|
+
import { Value } from './value';
|
|
3
|
+
export declare type Verbosity = 'quiet' | 'trace';
|
|
4
|
+
export declare class Runtime {
|
|
5
|
+
private readonly root;
|
|
6
|
+
private readonly verbosity;
|
|
7
|
+
private readonly preimports;
|
|
8
|
+
private readonly getAstOf;
|
|
9
|
+
private readonly args;
|
|
10
|
+
private stack;
|
|
11
|
+
constructor(root: AstNode, verbosity: Verbosity, preimports: Record<string, Value>, getAstOf: (fileName: string) => Unit, args: Record<string, unknown>);
|
|
12
|
+
private buildInitialSymbolTable;
|
|
13
|
+
compute(): {
|
|
14
|
+
value: Value;
|
|
15
|
+
expressionTrace?: undefined;
|
|
16
|
+
errorMessage?: undefined;
|
|
17
|
+
stack?: undefined;
|
|
18
|
+
} | {
|
|
19
|
+
expressionTrace: AstNode[];
|
|
20
|
+
errorMessage: unknown;
|
|
21
|
+
stack: string[] | undefined;
|
|
22
|
+
value?: undefined;
|
|
23
|
+
};
|
|
24
|
+
private evalNode;
|
|
25
|
+
private importDefinitions;
|
|
26
|
+
private evalNodeImpl;
|
|
27
|
+
call(callee: Value, argValues: Value[]): Value;
|
|
28
|
+
}
|