pacc 6.7.1 → 6.7.3

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 +46 -44
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pacc",
3
- "version": "6.7.1",
3
+ "version": "6.7.3",
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;
80
+ let state, value, hex, divider, 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
  }
@@ -106,9 +109,10 @@ export function* tokens(string) {
106
109
  }
107
110
 
108
111
  switch (c) {
109
- case '\n':
110
- case '\r':
112
+ case "\n":
113
+ case "\r":
111
114
  case "\t":
115
+ case "\v":
112
116
  case " ":
113
117
  switch (state) {
114
118
  case "number":
@@ -121,7 +125,7 @@ export function* tokens(string) {
121
125
  value += c;
122
126
  break;
123
127
  case "identifier":
124
- yield maybeKeyword();
128
+ yield keywordOrIdentifier();
125
129
  value = undefined;
126
130
  state = undefined;
127
131
  break;
@@ -145,22 +149,23 @@ export function* tokens(string) {
145
149
  case "number-fraction":
146
150
  yield [value];
147
151
  case undefined:
148
- value = "";
149
- state = "string";
152
+ startString(c);
150
153
  break;
151
154
  case "string":
152
- yield [value];
153
- state = undefined;
155
+ if (c === quote) {
156
+ yield [value];
157
+ state = undefined;
158
+ } else {
159
+ value += c;
160
+ }
154
161
  break;
155
162
  case "identifier":
156
- yield maybeKeyword();
157
- value = "";
158
- state = "string";
163
+ yield keywordOrIdentifier();
164
+ startString(c);
159
165
  break;
160
166
  default:
161
167
  yield lookup[state];
162
- value = "";
163
- state = "string";
168
+ startString(c);
164
169
  }
165
170
  break;
166
171
  case "!":
@@ -190,7 +195,7 @@ export function* tokens(string) {
190
195
  value += c;
191
196
  break;
192
197
  case "identifier":
193
- yield maybeKeyword();
198
+ yield keywordOrIdentifier();
194
199
  state = c;
195
200
  break;
196
201
  default:
@@ -207,13 +212,13 @@ export function* tokens(string) {
207
212
  case undefined:
208
213
  state = c;
209
214
  break;
210
- case "string":
211
- value += c;
212
- break;
213
215
  case "identifier":
214
- yield maybeKeyword();
216
+ yield keywordOrIdentifier();
215
217
  state = c;
216
218
  break;
219
+ case "string":
220
+ value += c;
221
+ break;
217
222
  default:
218
223
  state += c;
219
224
  }
@@ -244,13 +249,13 @@ export function* tokens(string) {
244
249
  case undefined:
245
250
  state = c;
246
251
  break;
247
- case "string":
248
- value += c;
249
- break;
250
252
  case "identifier":
251
- yield maybeKeyword();
253
+ yield keywordOrIdentifier();
252
254
  state = c;
253
255
  break;
256
+ case "string":
257
+ value += c;
258
+ break;
254
259
  default:
255
260
  yield lookup[state];
256
261
  state = c;
@@ -317,16 +322,13 @@ export function* tokens(string) {
317
322
  case undefined:
318
323
  break;
319
324
  case "string":
320
- const error = new Error("unterminated string");
321
- // @ts-ignore
322
- error.expression = string;
323
- throw error;
325
+ throw new Error("unterminated string", { cause: string });
324
326
  case "number-fraction":
325
327
  case "number":
326
328
  yield [value];
327
329
  break;
328
330
  case "identifier":
329
- yield maybeKeyword();
331
+ yield keywordOrIdentifier();
330
332
  break;
331
333
  default:
332
334
  yield lookup[state];