@graffiticode/basis 1.5.13 → 1.5.15
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/package.json +1 -1
- package/src/compiler.js +142 -24
package/package.json
CHANGED
package/src/compiler.js
CHANGED
|
@@ -97,9 +97,24 @@ export class Checker extends Visitor {
|
|
|
97
97
|
resume(err, data);
|
|
98
98
|
});
|
|
99
99
|
}
|
|
100
|
+
ERROR(node, options, resume) {
|
|
101
|
+
this.visit(node.elts[0], options, (e0, v0) => {
|
|
102
|
+
this.visit(node.elts[1], options, (e1, v1) => {
|
|
103
|
+
this.visit(node.elts[2], options, (e2, v2) => {
|
|
104
|
+
const err = [{
|
|
105
|
+
message: v0,
|
|
106
|
+
from: v1,
|
|
107
|
+
to: v2
|
|
108
|
+
}];
|
|
109
|
+
const val = node;
|
|
110
|
+
resume(err, val);
|
|
111
|
+
});
|
|
112
|
+
});
|
|
113
|
+
});
|
|
114
|
+
}
|
|
100
115
|
PROG(node, options, resume) {
|
|
101
116
|
this.visit(node.elts[0], options, (e0, v0) => {
|
|
102
|
-
const err = [];
|
|
117
|
+
const err = [].concat(e0);
|
|
103
118
|
const val = node;
|
|
104
119
|
resume(err, val);
|
|
105
120
|
});
|
|
@@ -122,13 +137,15 @@ export class Checker extends Visitor {
|
|
|
122
137
|
}
|
|
123
138
|
NUM(node, options, resume) {
|
|
124
139
|
const err = [];
|
|
125
|
-
const val = node;
|
|
140
|
+
const val = +node.elts[0];
|
|
126
141
|
resume(err, val);
|
|
127
142
|
}
|
|
128
143
|
LAMBDA(node, options, resume) {
|
|
129
144
|
const err = [];
|
|
130
145
|
const val = node;
|
|
131
146
|
this.visit(node.elts[0], options, (e0, v0) => {
|
|
147
|
+
const err = [].concat(e0);
|
|
148
|
+
const val = node;
|
|
132
149
|
resume(err, val);
|
|
133
150
|
});
|
|
134
151
|
}
|
|
@@ -139,6 +156,8 @@ export class Checker extends Visitor {
|
|
|
139
156
|
resume(err, val);
|
|
140
157
|
} else {
|
|
141
158
|
this.visit(node.elts[0], options, (e0, v0) => {
|
|
159
|
+
const err = [].concat(e0);
|
|
160
|
+
const val = node;
|
|
142
161
|
resume(err, val);
|
|
143
162
|
});
|
|
144
163
|
}
|
|
@@ -150,7 +169,7 @@ export class Checker extends Visitor {
|
|
|
150
169
|
}
|
|
151
170
|
STR(node, options, resume) {
|
|
152
171
|
const err = [];
|
|
153
|
-
const val = node;
|
|
172
|
+
const val = node.elts[0];
|
|
154
173
|
resume(err, val);
|
|
155
174
|
}
|
|
156
175
|
JSON(node, options, resume) {
|
|
@@ -163,7 +182,7 @@ export class Checker extends Visitor {
|
|
|
163
182
|
}
|
|
164
183
|
CONCAT(node, options, resume) {
|
|
165
184
|
this.visit(node.elts[0], options, (e0, v0) => {
|
|
166
|
-
const err = [];
|
|
185
|
+
const err = [].concat(e0);
|
|
167
186
|
const val = node;
|
|
168
187
|
resume(err, val);
|
|
169
188
|
});
|
|
@@ -186,6 +205,15 @@ export class Checker extends Visitor {
|
|
|
186
205
|
});
|
|
187
206
|
});
|
|
188
207
|
}
|
|
208
|
+
GET(node, options, resume) {
|
|
209
|
+
this.visit(node.elts[0], options, (err1, val1) => {
|
|
210
|
+
this.visit(node.elts[1], options, (err2, val2) => {
|
|
211
|
+
const err = [].concat(err1).concat(err2);
|
|
212
|
+
const val = node;
|
|
213
|
+
resume(err, val);
|
|
214
|
+
});
|
|
215
|
+
});
|
|
216
|
+
}
|
|
189
217
|
LT(node, options, resume) {
|
|
190
218
|
this.visit(node.elts[0], options, (err1, val1) => {
|
|
191
219
|
this.visit(node.elts[1], options, (err2, val2) => {
|
|
@@ -309,6 +337,42 @@ export class Checker extends Visitor {
|
|
|
309
337
|
const val = node;
|
|
310
338
|
resume(err, val);
|
|
311
339
|
}
|
|
340
|
+
GT(node, options, resume) {
|
|
341
|
+
this.visit(node.elts[0], options, (err1, val1) => {
|
|
342
|
+
this.visit(node.elts[1], options, (err2, val2) => {
|
|
343
|
+
const err = [].concat(err1).concat(err2);
|
|
344
|
+
const val = node;
|
|
345
|
+
resume(err, val);
|
|
346
|
+
});
|
|
347
|
+
});
|
|
348
|
+
}
|
|
349
|
+
GE(node, options, resume) {
|
|
350
|
+
this.visit(node.elts[0], options, (err1, val1) => {
|
|
351
|
+
this.visit(node.elts[1], options, (err2, val2) => {
|
|
352
|
+
const err = [].concat(err1).concat(err2);
|
|
353
|
+
const val = node;
|
|
354
|
+
resume(err, val);
|
|
355
|
+
});
|
|
356
|
+
});
|
|
357
|
+
}
|
|
358
|
+
LE(node, options, resume) {
|
|
359
|
+
this.visit(node.elts[0], options, (err1, val1) => {
|
|
360
|
+
this.visit(node.elts[1], options, (err2, val2) => {
|
|
361
|
+
const err = [].concat(err1).concat(err2);
|
|
362
|
+
const val = node;
|
|
363
|
+
resume(err, val);
|
|
364
|
+
});
|
|
365
|
+
});
|
|
366
|
+
}
|
|
367
|
+
NE(node, options, resume) {
|
|
368
|
+
this.visit(node.elts[0], options, (err1, val1) => {
|
|
369
|
+
this.visit(node.elts[1], options, (err2, val2) => {
|
|
370
|
+
const err = [].concat(err1).concat(err2);
|
|
371
|
+
const val = node;
|
|
372
|
+
resume(err, val);
|
|
373
|
+
});
|
|
374
|
+
});
|
|
375
|
+
}
|
|
312
376
|
RANGE(node, options, resume) {
|
|
313
377
|
this.visit(node.elts[0], options, (err1, val1) => {
|
|
314
378
|
this.visit(node.elts[1], options, (err2, val2) => {
|
|
@@ -849,13 +913,14 @@ export class Transformer extends Visitor {
|
|
|
849
913
|
// FIXME this isn't ASYNC compatible
|
|
850
914
|
options.SYNC = true;
|
|
851
915
|
this.visit(node.elts[0], options, (e0, v0) => {
|
|
852
|
-
const
|
|
916
|
+
const type = typeof v0;
|
|
917
|
+
const val = `${v0}`;
|
|
853
918
|
const expr = (
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
tag:
|
|
858
|
-
|
|
919
|
+
val === null && {tag: "NUL", elts: []} ||
|
|
920
|
+
type === "boolean" && {tag: "BOOL", elts: [val]} ||
|
|
921
|
+
type === "number" && {tag: "NUM", elts: [val]} ||
|
|
922
|
+
{tag: "STR", elts: [val]}
|
|
923
|
+
);
|
|
859
924
|
let foundMatch = false;
|
|
860
925
|
const patterns = [];
|
|
861
926
|
for (var i = 1; i < node.elts.length; i++) {
|
|
@@ -910,7 +975,7 @@ export class Transformer extends Visitor {
|
|
|
910
975
|
this.visit(node.elts[0], options, (e0, v0) => {
|
|
911
976
|
this.visit(node.elts[1], options, (e1, v1) => {
|
|
912
977
|
const err = [...e0, ...e1];
|
|
913
|
-
assert(typeof v0 === "object", "Type Error: expected v0 to be an object.");
|
|
978
|
+
assert(typeof v0 === "object", "Type Error: expected v0 to be an object. Got " + JSON.stringify(v0));
|
|
914
979
|
assert(typeof v1 === "string", "Type Error: expected v1 to be a string.");
|
|
915
980
|
const val = v0[v1];
|
|
916
981
|
resume(err, val);
|
|
@@ -966,6 +1031,58 @@ export class Transformer extends Visitor {
|
|
|
966
1031
|
});
|
|
967
1032
|
});
|
|
968
1033
|
}
|
|
1034
|
+
GT(node, options, resume) {
|
|
1035
|
+
this.visit(node.elts[0], options, (e0, v0) => {
|
|
1036
|
+
this.visit(node.elts[1], options, (e1, v1) => {
|
|
1037
|
+
const err = [].concat(e0).concat(e1);
|
|
1038
|
+
try {
|
|
1039
|
+
const val = new Decimal(v0).greaterThan(new Decimal(v1));
|
|
1040
|
+
resume(err, val);
|
|
1041
|
+
} catch (e) {
|
|
1042
|
+
resume([...err, `Error in GT operation: ${e.message}`], false);
|
|
1043
|
+
}
|
|
1044
|
+
});
|
|
1045
|
+
});
|
|
1046
|
+
}
|
|
1047
|
+
GE(node, options, resume) {
|
|
1048
|
+
this.visit(node.elts[0], options, (e0, v0) => {
|
|
1049
|
+
this.visit(node.elts[1], options, (e1, v1) => {
|
|
1050
|
+
const err = [].concat(e0).concat(e1);
|
|
1051
|
+
try {
|
|
1052
|
+
const val = new Decimal(v0).greaterThanOrEqualTo(new Decimal(v1));
|
|
1053
|
+
resume(err, val);
|
|
1054
|
+
} catch (e) {
|
|
1055
|
+
resume([...err, `Error in GE operation: ${e.message}`], false);
|
|
1056
|
+
}
|
|
1057
|
+
});
|
|
1058
|
+
});
|
|
1059
|
+
}
|
|
1060
|
+
LE(node, options, resume) {
|
|
1061
|
+
this.visit(node.elts[0], options, (e0, v0) => {
|
|
1062
|
+
this.visit(node.elts[1], options, (e1, v1) => {
|
|
1063
|
+
const err = [].concat(e0).concat(e1);
|
|
1064
|
+
try {
|
|
1065
|
+
const val = new Decimal(v0).lessThanOrEqualTo(new Decimal(v1));
|
|
1066
|
+
resume(err, val);
|
|
1067
|
+
} catch (e) {
|
|
1068
|
+
resume([...err, `Error in LE operation: ${e.message}`], false);
|
|
1069
|
+
}
|
|
1070
|
+
});
|
|
1071
|
+
});
|
|
1072
|
+
}
|
|
1073
|
+
NE(node, options, resume) {
|
|
1074
|
+
this.visit(node.elts[0], options, (e0, v0) => {
|
|
1075
|
+
this.visit(node.elts[1], options, (e1, v1) => {
|
|
1076
|
+
const err = [].concat(e0).concat(e1);
|
|
1077
|
+
try {
|
|
1078
|
+
const val = !new Decimal(v0).equals(new Decimal(v1));
|
|
1079
|
+
resume(err, val);
|
|
1080
|
+
} catch (e) {
|
|
1081
|
+
resume([...err, `Error in NE operation: ${e.message}`], false);
|
|
1082
|
+
}
|
|
1083
|
+
});
|
|
1084
|
+
});
|
|
1085
|
+
}
|
|
969
1086
|
RANGE(node, options, resume) {
|
|
970
1087
|
this.visit(node.elts[0], options, (e0, v0) => {
|
|
971
1088
|
this.visit(node.elts[1], options, (e1, v1) => {
|
|
@@ -980,10 +1097,8 @@ export class Transformer extends Visitor {
|
|
|
980
1097
|
resume([...err, 'Error in RANGE operation: step cannot be zero'], []);
|
|
981
1098
|
return;
|
|
982
1099
|
}
|
|
983
|
-
|
|
984
1100
|
const result = [];
|
|
985
1101
|
let current = start;
|
|
986
|
-
|
|
987
1102
|
if (step.isPositive()) {
|
|
988
1103
|
while (current.lessThan(end)) {
|
|
989
1104
|
result.push(current.toNumber());
|
|
@@ -995,7 +1110,6 @@ export class Transformer extends Visitor {
|
|
|
995
1110
|
current = current.plus(step);
|
|
996
1111
|
}
|
|
997
1112
|
}
|
|
998
|
-
|
|
999
1113
|
resume(err, result);
|
|
1000
1114
|
} catch (e) {
|
|
1001
1115
|
resume([...err, `Error in RANGE operation: ${e.message}`], []);
|
|
@@ -1038,17 +1152,21 @@ export class Compiler {
|
|
|
1038
1152
|
};
|
|
1039
1153
|
const checker = new this.Checker(code);
|
|
1040
1154
|
checker.check(options, (err, val) => {
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
renderer.render(options, (err, val) => {
|
|
1155
|
+
if (err.length > 0) {
|
|
1156
|
+
resume(err);
|
|
1157
|
+
} else {
|
|
1158
|
+
const transformer = new this.Transformer(code);
|
|
1159
|
+
transformer.transform(options, (err, val) => {
|
|
1160
|
+
if (err && err.length) {
|
|
1048
1161
|
resume(err, val);
|
|
1049
|
-
}
|
|
1050
|
-
|
|
1051
|
-
|
|
1162
|
+
} else {
|
|
1163
|
+
const renderer = new this.Renderer(val);
|
|
1164
|
+
renderer.render(options, (err, val) => {
|
|
1165
|
+
resume(err, val);
|
|
1166
|
+
});
|
|
1167
|
+
}
|
|
1168
|
+
});
|
|
1169
|
+
}
|
|
1052
1170
|
});
|
|
1053
1171
|
} catch (x) {
|
|
1054
1172
|
console.log("ERROR with code");
|