@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.
Files changed (2) hide show
  1. package/package.json +1 -1
  2. package/src/compiler.js +142 -24
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@graffiticode/basis",
3
3
  "type": "module",
4
- "version": "1.5.13",
4
+ "version": "1.5.15",
5
5
  "description": "The basis library for creating Graffiticode languages",
6
6
  "main": "index.js",
7
7
  "scripts": {
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 e0Node = this.node(node.elts[0]);
916
+ const type = typeof v0;
917
+ const val = `${v0}`;
853
918
  const expr = (
854
- e0Node.tag === 'BOOL' ||
855
- e0Node.tag === 'NUM'
856
- ) && e0Node || {
857
- tag: 'STR', elts: [`${v0}`]
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
- const transformer = new this.Transformer(code);
1042
- transformer.transform(options, (err, val) => {
1043
- if (err && err.length) {
1044
- resume(err, val);
1045
- } else {
1046
- const renderer = new this.Renderer(val);
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");