@graffiticode/basis 1.5.14 → 1.5.16

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 +53 -24
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@graffiticode/basis",
3
3
  "type": "module",
4
- "version": "1.5.14",
4
+ "version": "1.5.16",
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,29 @@ export class Checker extends Visitor {
97
97
  resume(err, data);
98
98
  });
99
99
  }
100
+ CATCH_ALL(node, options, resume) {
101
+ const err = [];
102
+ const val = node;
103
+ resume(err, val);
104
+ }
105
+ ERROR(node, options, resume) {
106
+ this.visit(node.elts[0], options, (e0, v0) => {
107
+ this.visit(node.elts[1], options, (e1, v1) => {
108
+ this.visit(node.elts[2], options, (e2, v2) => {
109
+ const err = [{
110
+ message: v0,
111
+ from: v1,
112
+ to: v2
113
+ }];
114
+ const val = node;
115
+ resume(err, val);
116
+ });
117
+ });
118
+ });
119
+ }
100
120
  PROG(node, options, resume) {
101
121
  this.visit(node.elts[0], options, (e0, v0) => {
102
- const err = [];
122
+ const err = [].concat(e0);
103
123
  const val = node;
104
124
  resume(err, val);
105
125
  });
@@ -122,13 +142,15 @@ export class Checker extends Visitor {
122
142
  }
123
143
  NUM(node, options, resume) {
124
144
  const err = [];
125
- const val = node;
145
+ const val = +node.elts[0];
126
146
  resume(err, val);
127
147
  }
128
148
  LAMBDA(node, options, resume) {
129
149
  const err = [];
130
150
  const val = node;
131
151
  this.visit(node.elts[0], options, (e0, v0) => {
152
+ const err = [].concat(e0);
153
+ const val = node;
132
154
  resume(err, val);
133
155
  });
134
156
  }
@@ -139,6 +161,8 @@ export class Checker extends Visitor {
139
161
  resume(err, val);
140
162
  } else {
141
163
  this.visit(node.elts[0], options, (e0, v0) => {
164
+ const err = [].concat(e0);
165
+ const val = node;
142
166
  resume(err, val);
143
167
  });
144
168
  }
@@ -150,7 +174,7 @@ export class Checker extends Visitor {
150
174
  }
151
175
  STR(node, options, resume) {
152
176
  const err = [];
153
- const val = node;
177
+ const val = node.elts[0];
154
178
  resume(err, val);
155
179
  }
156
180
  JSON(node, options, resume) {
@@ -163,7 +187,7 @@ export class Checker extends Visitor {
163
187
  }
164
188
  CONCAT(node, options, resume) {
165
189
  this.visit(node.elts[0], options, (e0, v0) => {
166
- const err = [];
190
+ const err = [].concat(e0);
167
191
  const val = node;
168
192
  resume(err, val);
169
193
  });
@@ -517,7 +541,11 @@ export class Transformer extends Visitor {
517
541
  // }
518
542
  return matches;
519
543
  }
520
-
544
+ CATCH_ALL(node, options, resume) {
545
+ const err = [];
546
+ const val = node; // Use the node as the tag value.
547
+ resume(err, val);
548
+ }
521
549
  PROG(node, options, resume) {
522
550
  if (!options) {
523
551
  options = {};
@@ -823,6 +851,10 @@ export class Transformer extends Visitor {
823
851
  this.visit(node.elts[1], options, (e1, v1) => {
824
852
  let err = [];
825
853
  let val = [];
854
+ console.log(
855
+ "MAP()",
856
+ "v1=" + JSON.stringify(v1),
857
+ );
826
858
  v1.forEach(args => {
827
859
  options.args = args;
828
860
  options = JSON.parse(JSON.stringify(options)); // Copy option arg support async.
@@ -896,13 +928,9 @@ export class Transformer extends Visitor {
896
928
  this.visit(node.elts[0], options, (e0, v0) => {
897
929
  const type = typeof v0;
898
930
  const val = `${v0}`;
899
- console.log(
900
- "CASE",
901
- "type=" + type,
902
- "val=" + val,
903
- );
904
931
  const expr = (
905
- val === null && {tag: "NUL", elts: []} ||
932
+ v0 === null && {tag: "NUL", elts: []} ||
933
+ v0.tag !== undefined && v0 || // We've got a tag value.
906
934
  type === "boolean" && {tag: "BOOL", elts: [val]} ||
907
935
  type === "number" && {tag: "NUM", elts: [val]} ||
908
936
  {tag: "STR", elts: [val]}
@@ -1083,10 +1111,8 @@ export class Transformer extends Visitor {
1083
1111
  resume([...err, 'Error in RANGE operation: step cannot be zero'], []);
1084
1112
  return;
1085
1113
  }
1086
-
1087
1114
  const result = [];
1088
1115
  let current = start;
1089
-
1090
1116
  if (step.isPositive()) {
1091
1117
  while (current.lessThan(end)) {
1092
1118
  result.push(current.toNumber());
@@ -1098,7 +1124,6 @@ export class Transformer extends Visitor {
1098
1124
  current = current.plus(step);
1099
1125
  }
1100
1126
  }
1101
-
1102
1127
  resume(err, result);
1103
1128
  } catch (e) {
1104
1129
  resume([...err, `Error in RANGE operation: ${e.message}`], []);
@@ -1141,17 +1166,21 @@ export class Compiler {
1141
1166
  };
1142
1167
  const checker = new this.Checker(code);
1143
1168
  checker.check(options, (err, val) => {
1144
- const transformer = new this.Transformer(code);
1145
- transformer.transform(options, (err, val) => {
1146
- if (err && err.length) {
1147
- resume(err, val);
1148
- } else {
1149
- const renderer = new this.Renderer(val);
1150
- renderer.render(options, (err, val) => {
1169
+ if (err.length > 0) {
1170
+ resume(err);
1171
+ } else {
1172
+ const transformer = new this.Transformer(code);
1173
+ transformer.transform(options, (err, val) => {
1174
+ if (err && err.length) {
1151
1175
  resume(err, val);
1152
- });
1153
- }
1154
- });
1176
+ } else {
1177
+ const renderer = new this.Renderer(val);
1178
+ renderer.render(options, (err, val) => {
1179
+ resume(err, val);
1180
+ });
1181
+ }
1182
+ });
1183
+ }
1155
1184
  });
1156
1185
  } catch (x) {
1157
1186
  console.log("ERROR with code");