pacc 6.7.2 → 6.8.0

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/tokens.mjs +60 -67
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pacc",
3
- "version": "6.7.2",
3
+ "version": "6.8.0",
4
4
  "publishConfig": {
5
5
  "access": "public",
6
6
  "provenance": true
package/src/tokens.mjs CHANGED
@@ -56,6 +56,20 @@ export /** @type {Token} */ const DOUBLE_BAR = createToken("||", 30, "infixr");
56
56
  export /** @type {Token} */ const IDENTIFIER = createToken("IDENTIFIER", 0);
57
57
  export /** @type {Token} */ const EOF = createToken("EOF", -1, "eof");
58
58
 
59
+ const keywords = {
60
+ true: [true],
61
+ false: [false]
62
+ };
63
+
64
+ const esc = {
65
+ b: "\b",
66
+ f: "\f",
67
+ n: "\n",
68
+ r: "\r",
69
+ t: "\t",
70
+ v: "\v"
71
+ };
72
+
59
73
  /**
60
74
  * Split property path into tokens
61
75
  * @generator
@@ -63,18 +77,14 @@ export /** @type {Token} */ const EOF = createToken("EOF", -1, "eof");
63
77
  * @yields {Token}
64
78
  */
65
79
  export function* tokens(string) {
66
- let state, value, hex, divider, quote;
80
+ let state, value, hex, quote;
67
81
 
68
- function maybeKeyword() {
69
- switch (value) {
70
- case "true":
71
- return [true];
72
- case "false":
73
- return [false];
74
- default:
75
- return [IDENTIFIER, value];
76
- }
77
- }
82
+ const keywordOrIdentifier = () => keywords[value] || [IDENTIFIER, value];
83
+ const startString = c => {
84
+ value = "";
85
+ state = "string";
86
+ quote = c;
87
+ };
78
88
 
79
89
  for (const c of string) {
80
90
  switch (state) {
@@ -92,13 +102,6 @@ export function* tokens(string) {
92
102
  state = "string-escaping-hex";
93
103
  hex = "";
94
104
  } else {
95
- const esc = {
96
- b: "\b",
97
- f: "\f",
98
- n: "\n",
99
- r: "\r",
100
- t: "\t"
101
- };
102
105
  value += esc[c] || c;
103
106
  state = "string";
104
107
  }
@@ -109,11 +112,11 @@ export function* tokens(string) {
109
112
  case "\n":
110
113
  case "\r":
111
114
  case "\t":
115
+ case "\v":
112
116
  case " ":
113
117
  switch (state) {
114
118
  case "number":
115
- case "number-fraction":
116
- yield [value];
119
+ yield [parseFloat(value)];
117
120
  state = undefined;
118
121
  case undefined:
119
122
  break;
@@ -121,7 +124,7 @@ export function* tokens(string) {
121
124
  value += c;
122
125
  break;
123
126
  case "identifier":
124
- yield maybeKeyword();
127
+ yield keywordOrIdentifier();
125
128
  value = undefined;
126
129
  state = undefined;
127
130
  break;
@@ -142,12 +145,9 @@ export function* tokens(string) {
142
145
  case "'":
143
146
  switch (state) {
144
147
  case "number":
145
- case "number-fraction":
146
- yield [value];
148
+ yield [parseFloat(value)];
147
149
  case undefined:
148
- value = "";
149
- state = "string";
150
- quote = c;
150
+ startString(c);
151
151
  break;
152
152
  case "string":
153
153
  if (c === quote) {
@@ -158,16 +158,12 @@ export function* tokens(string) {
158
158
  }
159
159
  break;
160
160
  case "identifier":
161
- yield maybeKeyword();
162
- value = "";
163
- state = "string";
164
- quote = c;
161
+ yield keywordOrIdentifier();
162
+ startString(c);
165
163
  break;
166
164
  default:
167
165
  yield lookup[state];
168
- value = "";
169
- state = "string";
170
- quote = c;
166
+ startString(c);
171
167
  }
172
168
  break;
173
169
  case "!":
@@ -177,8 +173,7 @@ export function* tokens(string) {
177
173
  case "|":
178
174
  switch (state) {
179
175
  case "number":
180
- case "number-fraction":
181
- yield [value];
176
+ yield [parseFloat(value)];
182
177
  case undefined:
183
178
  state = c;
184
179
  break;
@@ -197,7 +192,7 @@ export function* tokens(string) {
197
192
  value += c;
198
193
  break;
199
194
  case "identifier":
200
- yield maybeKeyword();
195
+ yield keywordOrIdentifier();
201
196
  state = c;
202
197
  break;
203
198
  default:
@@ -209,33 +204,38 @@ export function* tokens(string) {
209
204
  case "=":
210
205
  switch (state) {
211
206
  case "number":
212
- case "number-fraction":
213
- yield [value];
207
+ yield [parseFloat(value)];
214
208
  case undefined:
215
209
  state = c;
216
210
  break;
217
- case "string":
218
- value += c;
219
- break;
220
211
  case "identifier":
221
- yield maybeKeyword();
212
+ yield keywordOrIdentifier();
222
213
  state = c;
223
214
  break;
215
+ case "string":
216
+ value += c;
217
+ break;
224
218
  default:
225
219
  state += c;
226
220
  }
227
221
  break;
222
+
228
223
  case ".":
229
224
  if (state === "number") {
230
- state = "number-fraction";
231
- divider = 10;
225
+ value += '.';
232
226
  break;
233
227
  }
228
+ else if (state === "-") {
229
+ value = '-.';
230
+ state="number";
231
+ break;
232
+ }
233
+
234
+ case "-":
234
235
  case ":":
235
236
  case ";":
236
237
  case ",":
237
238
  case "+":
238
- case "-":
239
239
  case "*":
240
240
  case "/":
241
241
  case "(":
@@ -246,18 +246,17 @@ export function* tokens(string) {
246
246
  case "}":
247
247
  switch (state) {
248
248
  case "number":
249
- case "number-fraction":
250
- yield [value];
249
+ yield [parseFloat(value)];
251
250
  case undefined:
252
251
  state = c;
253
252
  break;
254
- case "string":
255
- value += c;
256
- break;
257
253
  case "identifier":
258
- yield maybeKeyword();
254
+ yield keywordOrIdentifier();
259
255
  state = c;
260
256
  break;
257
+ case "string":
258
+ value += c;
259
+ break;
261
260
  default:
262
261
  yield lookup[state];
263
262
  state = c;
@@ -277,21 +276,17 @@ export function* tokens(string) {
277
276
  default:
278
277
  yield lookup[state];
279
278
  case undefined:
280
- value = c.charCodeAt(0) - 48;
279
+ value = c;
281
280
  state = "number";
282
281
  break;
282
+ case "-":
283
+ state = "number";
284
+ value = "-" + c;
285
+ break;
283
286
  case ".":
284
- state = "number-fraction";
285
- value = 0;
286
- divider = 10;
287
- case "number-fraction":
288
- value = value + (c.charCodeAt(0) - 48) / divider;
289
- divider *= 10;
290
- break;
287
+ state = "number";
288
+ value = ".";
291
289
  case "number":
292
- // @ts-ignore
293
- value = value * 10 + c.charCodeAt(0) - 48;
294
- break;
295
290
  case "string":
296
291
  case "identifier":
297
292
  value += c;
@@ -302,8 +297,7 @@ export function* tokens(string) {
302
297
  default:
303
298
  switch (state) {
304
299
  case "number":
305
- case "number-fraction":
306
- yield [value];
300
+ yield [parseFloat(value)];
307
301
  case undefined:
308
302
  state = "identifier";
309
303
  value = c;
@@ -325,12 +319,11 @@ export function* tokens(string) {
325
319
  break;
326
320
  case "string":
327
321
  throw new Error("unterminated string", { cause: string });
328
- case "number-fraction":
329
322
  case "number":
330
- yield [value];
323
+ yield [parseFloat(value)];
331
324
  break;
332
325
  case "identifier":
333
- yield maybeKeyword();
326
+ yield keywordOrIdentifier();
334
327
  break;
335
328
  default:
336
329
  yield lookup[state];