zig-pug 0.3.0 → 0.3.2

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 (47) hide show
  1. package/README.md +27 -0
  2. package/binding.gyp +16 -10
  3. package/index.mjs +192 -0
  4. package/package.json +12 -3
  5. package/prebuilts/darwin-arm64/libzig-pug.a +0 -0
  6. package/prebuilts/darwin-x64/libzig-pug.a +0 -0
  7. package/prebuilts/linux-arm64/libzig-pug.a +0 -0
  8. package/prebuilts/linux-x64/libzig-pug.a +0 -0
  9. package/prebuilts/win32-x64/zig-pug.lib +0 -0
  10. package/vendor/mujs/COPYING +0 -16
  11. package/vendor/mujs/README +0 -50
  12. package/vendor/mujs/astnames.h +0 -92
  13. package/vendor/mujs/jsarray.c +0 -832
  14. package/vendor/mujs/jsboolean.c +0 -38
  15. package/vendor/mujs/jsbuiltin.c +0 -249
  16. package/vendor/mujs/jscompile.c +0 -1428
  17. package/vendor/mujs/jsdate.c +0 -861
  18. package/vendor/mujs/jsdtoa.c +0 -749
  19. package/vendor/mujs/jserror.c +0 -139
  20. package/vendor/mujs/jsfunction.c +0 -231
  21. package/vendor/mujs/jsgc.c +0 -284
  22. package/vendor/mujs/jsi.h +0 -870
  23. package/vendor/mujs/jsintern.c +0 -137
  24. package/vendor/mujs/jslex.c +0 -878
  25. package/vendor/mujs/jsmath.c +0 -194
  26. package/vendor/mujs/jsnumber.c +0 -198
  27. package/vendor/mujs/jsobject.c +0 -560
  28. package/vendor/mujs/json.c +0 -422
  29. package/vendor/mujs/jsparse.c +0 -1065
  30. package/vendor/mujs/jsproperty.c +0 -341
  31. package/vendor/mujs/jsregexp.c +0 -232
  32. package/vendor/mujs/jsrepr.c +0 -285
  33. package/vendor/mujs/jsrun.c +0 -2096
  34. package/vendor/mujs/jsstate.c +0 -334
  35. package/vendor/mujs/jsstring.c +0 -852
  36. package/vendor/mujs/jsvalue.c +0 -708
  37. package/vendor/mujs/libmujs.a +0 -0
  38. package/vendor/mujs/main.c +0 -396
  39. package/vendor/mujs/mujs.h +0 -253
  40. package/vendor/mujs/one.c +0 -25
  41. package/vendor/mujs/opnames.h +0 -85
  42. package/vendor/mujs/pp.c +0 -980
  43. package/vendor/mujs/regexp.c +0 -1277
  44. package/vendor/mujs/regexp.h +0 -46
  45. package/vendor/mujs/utf.c +0 -305
  46. package/vendor/mujs/utf.h +0 -52
  47. package/vendor/mujs/utfdata.h +0 -2209
@@ -1,878 +0,0 @@
1
- #include "jsi.h"
2
- #include "utf.h"
3
-
4
- JS_NORETURN static void jsY_error(js_State *J, const char *fmt, ...) JS_PRINTFLIKE(2,3);
5
-
6
- static void jsY_error(js_State *J, const char *fmt, ...)
7
- {
8
- va_list ap;
9
- char buf[512];
10
- char msgbuf[256];
11
-
12
- va_start(ap, fmt);
13
- vsnprintf(msgbuf, 256, fmt, ap);
14
- va_end(ap);
15
-
16
- snprintf(buf, 256, "%s:%d: ", J->filename, J->lexline);
17
- strcat(buf, msgbuf);
18
-
19
- js_newsyntaxerror(J, buf);
20
- js_throw(J);
21
- }
22
-
23
- static const char *tokenstring[] = {
24
- "(end-of-file)",
25
- "'\\x01'", "'\\x02'", "'\\x03'", "'\\x04'", "'\\x05'", "'\\x06'", "'\\x07'",
26
- "'\\x08'", "'\\x09'", "'\\x0A'", "'\\x0B'", "'\\x0C'", "'\\x0D'", "'\\x0E'", "'\\x0F'",
27
- "'\\x10'", "'\\x11'", "'\\x12'", "'\\x13'", "'\\x14'", "'\\x15'", "'\\x16'", "'\\x17'",
28
- "'\\x18'", "'\\x19'", "'\\x1A'", "'\\x1B'", "'\\x1C'", "'\\x1D'", "'\\x1E'", "'\\x1F'",
29
- "' '", "'!'", "'\"'", "'#'", "'$'", "'%'", "'&'", "'\\''",
30
- "'('", "')'", "'*'", "'+'", "','", "'-'", "'.'", "'/'",
31
- "'0'", "'1'", "'2'", "'3'", "'4'", "'5'", "'6'", "'7'",
32
- "'8'", "'9'", "':'", "';'", "'<'", "'='", "'>'", "'?'",
33
- "'@'", "'A'", "'B'", "'C'", "'D'", "'E'", "'F'", "'G'",
34
- "'H'", "'I'", "'J'", "'K'", "'L'", "'M'", "'N'", "'O'",
35
- "'P'", "'Q'", "'R'", "'S'", "'T'", "'U'", "'V'", "'W'",
36
- "'X'", "'Y'", "'Z'", "'['", "'\'", "']'", "'^'", "'_'",
37
- "'`'", "'a'", "'b'", "'c'", "'d'", "'e'", "'f'", "'g'",
38
- "'h'", "'i'", "'j'", "'k'", "'l'", "'m'", "'n'", "'o'",
39
- "'p'", "'q'", "'r'", "'s'", "'t'", "'u'", "'v'", "'w'",
40
- "'x'", "'y'", "'z'", "'{'", "'|'", "'}'", "'~'", "'\\x7F'",
41
-
42
- 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,
43
- 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,
44
- 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,
45
- 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,
46
- 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,
47
- 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,
48
- 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,
49
- 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,
50
-
51
- "(identifier)", "(number)", "(string)", "(regexp)",
52
-
53
- "'<='", "'>='", "'=='", "'!='", "'==='", "'!=='",
54
- "'<<'", "'>>'", "'>>>'", "'&&'", "'||'",
55
- "'+='", "'-='", "'*='", "'/='", "'%='",
56
- "'<<='", "'>>='", "'>>>='", "'&='", "'|='", "'^='",
57
- "'++'", "'--'",
58
-
59
- "'break'", "'case'", "'catch'", "'continue'", "'debugger'",
60
- "'default'", "'delete'", "'do'", "'else'", "'false'", "'finally'", "'for'",
61
- "'function'", "'if'", "'in'", "'instanceof'", "'new'", "'null'", "'return'",
62
- "'switch'", "'this'", "'throw'", "'true'", "'try'", "'typeof'", "'var'",
63
- "'void'", "'while'", "'with'",
64
- };
65
-
66
- const char *jsY_tokenstring(int token)
67
- {
68
- if (token >= 0 && token < (int)nelem(tokenstring))
69
- if (tokenstring[token])
70
- return tokenstring[token];
71
- return "<unknown>";
72
- }
73
-
74
- static const char *keywords[] = {
75
- "break", "case", "catch", "continue", "debugger", "default", "delete",
76
- "do", "else", "false", "finally", "for", "function", "if", "in",
77
- "instanceof", "new", "null", "return", "switch", "this", "throw",
78
- "true", "try", "typeof", "var", "void", "while", "with",
79
- };
80
-
81
- int jsY_findword(const char *s, const char **list, int num)
82
- {
83
- int l = 0;
84
- int r = num - 1;
85
- while (l <= r) {
86
- int m = (l + r) >> 1;
87
- int c = strcmp(s, list[m]);
88
- if (c < 0)
89
- r = m - 1;
90
- else if (c > 0)
91
- l = m + 1;
92
- else
93
- return m;
94
- }
95
- return -1;
96
- }
97
-
98
- static int jsY_findkeyword(js_State *J, const char *s)
99
- {
100
- int i = jsY_findword(s, keywords, nelem(keywords));
101
- if (i >= 0) {
102
- J->text = keywords[i];
103
- return TK_BREAK + i; /* first keyword + i */
104
- }
105
- J->text = js_intern(J, s);
106
- return TK_IDENTIFIER;
107
- }
108
-
109
- int jsY_iswhite(int c)
110
- {
111
- return c == 0x9 || c == 0xB || c == 0xC || c == 0x20 || c == 0xA0 || c == 0xFEFF;
112
- }
113
-
114
- int jsY_isnewline(int c)
115
- {
116
- return c == 0xA || c == 0xD || c == 0x2028 || c == 0x2029;
117
- }
118
-
119
- #ifndef isalpha
120
- #define isalpha(c) ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'))
121
- #endif
122
- #ifndef isdigit
123
- #define isdigit(c) (c >= '0' && c <= '9')
124
- #endif
125
- #ifndef ishex
126
- #define ishex(c) ((c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F'))
127
- #endif
128
-
129
- static int jsY_isidentifierstart(int c)
130
- {
131
- return isalpha(c) || c == '$' || c == '_' || isalpharune(c);
132
- }
133
-
134
- static int jsY_isidentifierpart(int c)
135
- {
136
- return isdigit(c) || isalpha(c) || c == '$' || c == '_' || isalpharune(c);
137
- }
138
-
139
- static int jsY_isdec(int c)
140
- {
141
- return isdigit(c);
142
- }
143
-
144
- int jsY_ishex(int c)
145
- {
146
- return isdigit(c) || ishex(c);
147
- }
148
-
149
- int jsY_tohex(int c)
150
- {
151
- if (c >= '0' && c <= '9') return c - '0';
152
- if (c >= 'a' && c <= 'f') return c - 'a' + 0xA;
153
- if (c >= 'A' && c <= 'F') return c - 'A' + 0xA;
154
- return 0;
155
- }
156
-
157
- static void jsY_next(js_State *J)
158
- {
159
- Rune c;
160
- if (*J->source == 0) {
161
- J->lexchar = EOF;
162
- return;
163
- }
164
- J->source += chartorune(&c, J->source);
165
- /* consume CR LF as one unit */
166
- if (c == '\r' && *J->source == '\n')
167
- ++J->source;
168
- if (jsY_isnewline(c)) {
169
- J->line++;
170
- c = '\n';
171
- }
172
- J->lexchar = c;
173
- }
174
-
175
- #define jsY_accept(J, x) (J->lexchar == x ? (jsY_next(J), 1) : 0)
176
-
177
- #define jsY_expect(J, x) if (!jsY_accept(J, x)) jsY_error(J, "expected '%c'", x)
178
-
179
- static void jsY_unescape(js_State *J)
180
- {
181
- if (jsY_accept(J, '\\')) {
182
- if (jsY_accept(J, 'u')) {
183
- int x = 0;
184
- if (!jsY_ishex(J->lexchar)) { goto error; } x |= jsY_tohex(J->lexchar) << 12; jsY_next(J);
185
- if (!jsY_ishex(J->lexchar)) { goto error; } x |= jsY_tohex(J->lexchar) << 8; jsY_next(J);
186
- if (!jsY_ishex(J->lexchar)) { goto error; } x |= jsY_tohex(J->lexchar) << 4; jsY_next(J);
187
- if (!jsY_ishex(J->lexchar)) { goto error; } x |= jsY_tohex(J->lexchar);
188
- J->lexchar = x;
189
- return;
190
- }
191
- error:
192
- jsY_error(J, "unexpected escape sequence");
193
- }
194
- }
195
-
196
- static void textinit(js_State *J)
197
- {
198
- if (!J->lexbuf.text) {
199
- J->lexbuf.cap = 4096;
200
- J->lexbuf.text = js_malloc(J, J->lexbuf.cap);
201
- }
202
- J->lexbuf.len = 0;
203
- }
204
-
205
- static void textpush(js_State *J, Rune c)
206
- {
207
- int n;
208
- if (c == EOF)
209
- n = 1;
210
- else
211
- n = runelen(c);
212
- if (J->lexbuf.len + n > J->lexbuf.cap) {
213
- J->lexbuf.cap = J->lexbuf.cap * 2;
214
- J->lexbuf.text = js_realloc(J, J->lexbuf.text, J->lexbuf.cap);
215
- }
216
- if (c == EOF)
217
- J->lexbuf.text[J->lexbuf.len++] = 0;
218
- else
219
- J->lexbuf.len += runetochar(J->lexbuf.text + J->lexbuf.len, &c);
220
- }
221
-
222
- static char *textend(js_State *J)
223
- {
224
- textpush(J, EOF);
225
- return J->lexbuf.text;
226
- }
227
-
228
- static void lexlinecomment(js_State *J)
229
- {
230
- while (J->lexchar != EOF && J->lexchar != '\n')
231
- jsY_next(J);
232
- }
233
-
234
- static int lexcomment(js_State *J)
235
- {
236
- /* already consumed initial '/' '*' sequence */
237
- while (J->lexchar != EOF) {
238
- if (jsY_accept(J, '*')) {
239
- while (J->lexchar == '*')
240
- jsY_next(J);
241
- if (jsY_accept(J, '/'))
242
- return 0;
243
- }
244
- else
245
- jsY_next(J);
246
- }
247
- return -1;
248
- }
249
-
250
- static double lexhex(js_State *J)
251
- {
252
- double n = 0;
253
- if (!jsY_ishex(J->lexchar))
254
- jsY_error(J, "malformed hexadecimal number");
255
- while (jsY_ishex(J->lexchar)) {
256
- n = n * 16 + jsY_tohex(J->lexchar);
257
- jsY_next(J);
258
- }
259
- return n;
260
- }
261
-
262
- #if 0
263
-
264
- static double lexinteger(js_State *J)
265
- {
266
- double n = 0;
267
- if (!jsY_isdec(J->lexchar))
268
- jsY_error(J, "malformed number");
269
- while (jsY_isdec(J->lexchar)) {
270
- n = n * 10 + (J->lexchar - '0');
271
- jsY_next(J);
272
- }
273
- return n;
274
- }
275
-
276
- static double lexfraction(js_State *J)
277
- {
278
- double n = 0;
279
- double d = 1;
280
- while (jsY_isdec(J->lexchar)) {
281
- n = n * 10 + (J->lexchar - '0');
282
- d = d * 10;
283
- jsY_next(J);
284
- }
285
- return n / d;
286
- }
287
-
288
- static double lexexponent(js_State *J)
289
- {
290
- double sign;
291
- if (jsY_accept(J, 'e') || jsY_accept(J, 'E')) {
292
- if (jsY_accept(J, '-')) sign = -1;
293
- else if (jsY_accept(J, '+')) sign = 1;
294
- else sign = 1;
295
- return sign * lexinteger(J);
296
- }
297
- return 0;
298
- }
299
-
300
- static int lexnumber(js_State *J)
301
- {
302
- double n;
303
- double e;
304
-
305
- if (jsY_accept(J, '0')) {
306
- if (jsY_accept(J, 'x') || jsY_accept(J, 'X')) {
307
- J->number = lexhex(J);
308
- return TK_NUMBER;
309
- }
310
- if (jsY_isdec(J->lexchar))
311
- jsY_error(J, "number with leading zero");
312
- n = 0;
313
- if (jsY_accept(J, '.'))
314
- n += lexfraction(J);
315
- } else if (jsY_accept(J, '.')) {
316
- if (!jsY_isdec(J->lexchar))
317
- return '.';
318
- n = lexfraction(J);
319
- } else {
320
- n = lexinteger(J);
321
- if (jsY_accept(J, '.'))
322
- n += lexfraction(J);
323
- }
324
-
325
- e = lexexponent(J);
326
- if (e < 0)
327
- n /= pow(10, -e);
328
- else if (e > 0)
329
- n *= pow(10, e);
330
-
331
- if (jsY_isidentifierstart(J->lexchar))
332
- jsY_error(J, "number with letter suffix");
333
-
334
- J->number = n;
335
- return TK_NUMBER;
336
- }
337
-
338
- #else
339
-
340
- static int lexnumber(js_State *J)
341
- {
342
- const char *s = J->source - 1;
343
-
344
- if (jsY_accept(J, '0')) {
345
- if (jsY_accept(J, 'x') || jsY_accept(J, 'X')) {
346
- J->number = lexhex(J);
347
- return TK_NUMBER;
348
- }
349
- if (jsY_isdec(J->lexchar))
350
- jsY_error(J, "number with leading zero");
351
- if (jsY_accept(J, '.')) {
352
- while (jsY_isdec(J->lexchar))
353
- jsY_next(J);
354
- }
355
- } else if (jsY_accept(J, '.')) {
356
- if (!jsY_isdec(J->lexchar))
357
- return '.';
358
- while (jsY_isdec(J->lexchar))
359
- jsY_next(J);
360
- } else {
361
- while (jsY_isdec(J->lexchar))
362
- jsY_next(J);
363
- if (jsY_accept(J, '.')) {
364
- while (jsY_isdec(J->lexchar))
365
- jsY_next(J);
366
- }
367
- }
368
-
369
- if (jsY_accept(J, 'e') || jsY_accept(J, 'E')) {
370
- if (J->lexchar == '-' || J->lexchar == '+')
371
- jsY_next(J);
372
- if (jsY_isdec(J->lexchar))
373
- while (jsY_isdec(J->lexchar))
374
- jsY_next(J);
375
- else
376
- jsY_error(J, "missing exponent");
377
- }
378
-
379
- if (jsY_isidentifierstart(J->lexchar))
380
- jsY_error(J, "number with letter suffix");
381
-
382
- J->number = js_strtod(s, NULL);
383
- return TK_NUMBER;
384
- }
385
-
386
- #endif
387
-
388
- static int lexescape(js_State *J)
389
- {
390
- int x = 0;
391
-
392
- /* already consumed '\' */
393
-
394
- if (jsY_accept(J, '\n'))
395
- return 0;
396
-
397
- switch (J->lexchar) {
398
- case EOF: jsY_error(J, "unterminated escape sequence");
399
- case 'u':
400
- jsY_next(J);
401
- if (!jsY_ishex(J->lexchar)) return 1; else { x |= jsY_tohex(J->lexchar) << 12; jsY_next(J); }
402
- if (!jsY_ishex(J->lexchar)) return 1; else { x |= jsY_tohex(J->lexchar) << 8; jsY_next(J); }
403
- if (!jsY_ishex(J->lexchar)) return 1; else { x |= jsY_tohex(J->lexchar) << 4; jsY_next(J); }
404
- if (!jsY_ishex(J->lexchar)) return 1; else { x |= jsY_tohex(J->lexchar); jsY_next(J); }
405
- textpush(J, x);
406
- break;
407
- case 'x':
408
- jsY_next(J);
409
- if (!jsY_ishex(J->lexchar)) return 1; else { x |= jsY_tohex(J->lexchar) << 4; jsY_next(J); }
410
- if (!jsY_ishex(J->lexchar)) return 1; else { x |= jsY_tohex(J->lexchar); jsY_next(J); }
411
- textpush(J, x);
412
- break;
413
- case '0': textpush(J, 0); jsY_next(J); break;
414
- case '\\': textpush(J, '\\'); jsY_next(J); break;
415
- case '\'': textpush(J, '\''); jsY_next(J); break;
416
- case '"': textpush(J, '"'); jsY_next(J); break;
417
- case 'b': textpush(J, '\b'); jsY_next(J); break;
418
- case 'f': textpush(J, '\f'); jsY_next(J); break;
419
- case 'n': textpush(J, '\n'); jsY_next(J); break;
420
- case 'r': textpush(J, '\r'); jsY_next(J); break;
421
- case 't': textpush(J, '\t'); jsY_next(J); break;
422
- case 'v': textpush(J, '\v'); jsY_next(J); break;
423
- default: textpush(J, J->lexchar); jsY_next(J); break;
424
- }
425
- return 0;
426
- }
427
-
428
- static int lexstring(js_State *J)
429
- {
430
- const char *s;
431
-
432
- int q = J->lexchar;
433
- jsY_next(J);
434
-
435
- textinit(J);
436
-
437
- while (J->lexchar != q) {
438
- if (J->lexchar == EOF || J->lexchar == '\n')
439
- jsY_error(J, "string not terminated");
440
- if (jsY_accept(J, '\\')) {
441
- if (lexescape(J))
442
- jsY_error(J, "malformed escape sequence");
443
- } else {
444
- textpush(J, J->lexchar);
445
- jsY_next(J);
446
- }
447
- }
448
- jsY_expect(J, q);
449
-
450
- s = textend(J);
451
-
452
- J->text = js_intern(J, s);
453
- return TK_STRING;
454
- }
455
-
456
- /* the ugliest language wart ever... */
457
- static int isregexpcontext(int last)
458
- {
459
- switch (last) {
460
- case ']':
461
- case ')':
462
- case '}':
463
- case TK_IDENTIFIER:
464
- case TK_NUMBER:
465
- case TK_STRING:
466
- case TK_FALSE:
467
- case TK_NULL:
468
- case TK_THIS:
469
- case TK_TRUE:
470
- return 0;
471
- default:
472
- return 1;
473
- }
474
- }
475
-
476
- static int lexregexp(js_State *J)
477
- {
478
- const char *s;
479
- int g, m, i;
480
- int inclass = 0;
481
-
482
- /* already consumed initial '/' */
483
-
484
- textinit(J);
485
-
486
- /* regexp body */
487
- while (J->lexchar != '/' || inclass) {
488
- if (J->lexchar == EOF || J->lexchar == '\n') {
489
- jsY_error(J, "regular expression not terminated");
490
- } else if (jsY_accept(J, '\\')) {
491
- if (jsY_accept(J, '/')) {
492
- textpush(J, '/');
493
- } else {
494
- textpush(J, '\\');
495
- if (J->lexchar == EOF || J->lexchar == '\n')
496
- jsY_error(J, "regular expression not terminated");
497
- textpush(J, J->lexchar);
498
- jsY_next(J);
499
- }
500
- } else {
501
- if (J->lexchar == '[' && !inclass)
502
- inclass = 1;
503
- if (J->lexchar == ']' && inclass)
504
- inclass = 0;
505
- textpush(J, J->lexchar);
506
- jsY_next(J);
507
- }
508
- }
509
- jsY_expect(J, '/');
510
-
511
- s = textend(J);
512
-
513
- /* regexp flags */
514
- g = i = m = 0;
515
-
516
- while (jsY_isidentifierpart(J->lexchar)) {
517
- if (jsY_accept(J, 'g')) ++g;
518
- else if (jsY_accept(J, 'i')) ++i;
519
- else if (jsY_accept(J, 'm')) ++m;
520
- else jsY_error(J, "illegal flag in regular expression: %c", J->lexchar);
521
- }
522
-
523
- if (g > 1 || i > 1 || m > 1)
524
- jsY_error(J, "duplicated flag in regular expression");
525
-
526
- J->text = js_intern(J, s);
527
- J->number = 0;
528
- if (g) J->number += JS_REGEXP_G;
529
- if (i) J->number += JS_REGEXP_I;
530
- if (m) J->number += JS_REGEXP_M;
531
- return TK_REGEXP;
532
- }
533
-
534
- /* simple "return [no Line Terminator here] ..." contexts */
535
- static int isnlthcontext(int last)
536
- {
537
- switch (last) {
538
- case TK_BREAK:
539
- case TK_CONTINUE:
540
- case TK_RETURN:
541
- case TK_THROW:
542
- return 1;
543
- default:
544
- return 0;
545
- }
546
- }
547
-
548
- static int jsY_lexx(js_State *J)
549
- {
550
- J->newline = 0;
551
-
552
- while (1) {
553
- J->lexline = J->line; /* save location of beginning of token */
554
-
555
- while (jsY_iswhite(J->lexchar))
556
- jsY_next(J);
557
-
558
- if (jsY_accept(J, '\n')) {
559
- J->newline = 1;
560
- if (isnlthcontext(J->lasttoken))
561
- return ';';
562
- continue;
563
- }
564
-
565
- if (jsY_accept(J, '/')) {
566
- if (jsY_accept(J, '/')) {
567
- lexlinecomment(J);
568
- continue;
569
- } else if (jsY_accept(J, '*')) {
570
- if (lexcomment(J))
571
- jsY_error(J, "multi-line comment not terminated");
572
- continue;
573
- } else if (isregexpcontext(J->lasttoken)) {
574
- return lexregexp(J);
575
- } else if (jsY_accept(J, '=')) {
576
- return TK_DIV_ASS;
577
- } else {
578
- return '/';
579
- }
580
- }
581
-
582
- if (J->lexchar >= '0' && J->lexchar <= '9') {
583
- return lexnumber(J);
584
- }
585
-
586
- switch (J->lexchar) {
587
- case '(': jsY_next(J); return '(';
588
- case ')': jsY_next(J); return ')';
589
- case ',': jsY_next(J); return ',';
590
- case ':': jsY_next(J); return ':';
591
- case ';': jsY_next(J); return ';';
592
- case '?': jsY_next(J); return '?';
593
- case '[': jsY_next(J); return '[';
594
- case ']': jsY_next(J); return ']';
595
- case '{': jsY_next(J); return '{';
596
- case '}': jsY_next(J); return '}';
597
- case '~': jsY_next(J); return '~';
598
-
599
- case '\'':
600
- case '"':
601
- return lexstring(J);
602
-
603
- case '.':
604
- return lexnumber(J);
605
-
606
- case '<':
607
- jsY_next(J);
608
- if (jsY_accept(J, '<')) {
609
- if (jsY_accept(J, '='))
610
- return TK_SHL_ASS;
611
- return TK_SHL;
612
- }
613
- if (jsY_accept(J, '='))
614
- return TK_LE;
615
- return '<';
616
-
617
- case '>':
618
- jsY_next(J);
619
- if (jsY_accept(J, '>')) {
620
- if (jsY_accept(J, '>')) {
621
- if (jsY_accept(J, '='))
622
- return TK_USHR_ASS;
623
- return TK_USHR;
624
- }
625
- if (jsY_accept(J, '='))
626
- return TK_SHR_ASS;
627
- return TK_SHR;
628
- }
629
- if (jsY_accept(J, '='))
630
- return TK_GE;
631
- return '>';
632
-
633
- case '=':
634
- jsY_next(J);
635
- if (jsY_accept(J, '=')) {
636
- if (jsY_accept(J, '='))
637
- return TK_STRICTEQ;
638
- return TK_EQ;
639
- }
640
- return '=';
641
-
642
- case '!':
643
- jsY_next(J);
644
- if (jsY_accept(J, '=')) {
645
- if (jsY_accept(J, '='))
646
- return TK_STRICTNE;
647
- return TK_NE;
648
- }
649
- return '!';
650
-
651
- case '+':
652
- jsY_next(J);
653
- if (jsY_accept(J, '+'))
654
- return TK_INC;
655
- if (jsY_accept(J, '='))
656
- return TK_ADD_ASS;
657
- return '+';
658
-
659
- case '-':
660
- jsY_next(J);
661
- if (jsY_accept(J, '-'))
662
- return TK_DEC;
663
- if (jsY_accept(J, '='))
664
- return TK_SUB_ASS;
665
- return '-';
666
-
667
- case '*':
668
- jsY_next(J);
669
- if (jsY_accept(J, '='))
670
- return TK_MUL_ASS;
671
- return '*';
672
-
673
- case '%':
674
- jsY_next(J);
675
- if (jsY_accept(J, '='))
676
- return TK_MOD_ASS;
677
- return '%';
678
-
679
- case '&':
680
- jsY_next(J);
681
- if (jsY_accept(J, '&'))
682
- return TK_AND;
683
- if (jsY_accept(J, '='))
684
- return TK_AND_ASS;
685
- return '&';
686
-
687
- case '|':
688
- jsY_next(J);
689
- if (jsY_accept(J, '|'))
690
- return TK_OR;
691
- if (jsY_accept(J, '='))
692
- return TK_OR_ASS;
693
- return '|';
694
-
695
- case '^':
696
- jsY_next(J);
697
- if (jsY_accept(J, '='))
698
- return TK_XOR_ASS;
699
- return '^';
700
-
701
- case EOF:
702
- return 0; /* EOF */
703
- }
704
-
705
- /* Handle \uXXXX escapes in identifiers */
706
- jsY_unescape(J);
707
- if (jsY_isidentifierstart(J->lexchar)) {
708
- textinit(J);
709
- textpush(J, J->lexchar);
710
-
711
- jsY_next(J);
712
- jsY_unescape(J);
713
- while (jsY_isidentifierpart(J->lexchar)) {
714
- textpush(J, J->lexchar);
715
- jsY_next(J);
716
- jsY_unescape(J);
717
- }
718
-
719
- textend(J);
720
-
721
- return jsY_findkeyword(J, J->lexbuf.text);
722
- }
723
-
724
- if (J->lexchar >= 0x20 && J->lexchar <= 0x7E)
725
- jsY_error(J, "unexpected character: '%c'", J->lexchar);
726
- jsY_error(J, "unexpected character: \\u%04X", J->lexchar);
727
- }
728
- }
729
-
730
- void jsY_initlex(js_State *J, const char *filename, const char *source)
731
- {
732
- J->filename = filename;
733
- J->source = source;
734
- J->line = 1;
735
- J->lasttoken = 0;
736
- jsY_next(J); /* load first lookahead character */
737
- }
738
-
739
- int jsY_lex(js_State *J)
740
- {
741
- return J->lasttoken = jsY_lexx(J);
742
- }
743
-
744
- static int lexjsonnumber(js_State *J)
745
- {
746
- const char *s = J->source - 1;
747
-
748
- if (J->lexchar == '-')
749
- jsY_next(J);
750
-
751
- if (J->lexchar == '0')
752
- jsY_next(J);
753
- else if (J->lexchar >= '1' && J->lexchar <= '9')
754
- while (isdigit(J->lexchar))
755
- jsY_next(J);
756
- else
757
- jsY_error(J, "unexpected non-digit");
758
-
759
- if (jsY_accept(J, '.')) {
760
- if (isdigit(J->lexchar))
761
- while (isdigit(J->lexchar))
762
- jsY_next(J);
763
- else
764
- jsY_error(J, "missing digits after decimal point");
765
- }
766
-
767
- if (jsY_accept(J, 'e') || jsY_accept(J, 'E')) {
768
- if (J->lexchar == '-' || J->lexchar == '+')
769
- jsY_next(J);
770
- if (isdigit(J->lexchar))
771
- while (isdigit(J->lexchar))
772
- jsY_next(J);
773
- else
774
- jsY_error(J, "missing digits after exponent indicator");
775
- }
776
-
777
- J->number = js_strtod(s, NULL);
778
- return TK_NUMBER;
779
- }
780
-
781
- static int lexjsonescape(js_State *J)
782
- {
783
- int x = 0;
784
-
785
- /* already consumed '\' */
786
-
787
- switch (J->lexchar) {
788
- default: jsY_error(J, "invalid escape sequence");
789
- case 'u':
790
- jsY_next(J);
791
- if (!jsY_ishex(J->lexchar)) return 1; else { x |= jsY_tohex(J->lexchar) << 12; jsY_next(J); }
792
- if (!jsY_ishex(J->lexchar)) return 1; else { x |= jsY_tohex(J->lexchar) << 8; jsY_next(J); }
793
- if (!jsY_ishex(J->lexchar)) return 1; else { x |= jsY_tohex(J->lexchar) << 4; jsY_next(J); }
794
- if (!jsY_ishex(J->lexchar)) return 1; else { x |= jsY_tohex(J->lexchar); jsY_next(J); }
795
- textpush(J, x);
796
- break;
797
- case '"': textpush(J, '"'); jsY_next(J); break;
798
- case '\\': textpush(J, '\\'); jsY_next(J); break;
799
- case '/': textpush(J, '/'); jsY_next(J); break;
800
- case 'b': textpush(J, '\b'); jsY_next(J); break;
801
- case 'f': textpush(J, '\f'); jsY_next(J); break;
802
- case 'n': textpush(J, '\n'); jsY_next(J); break;
803
- case 'r': textpush(J, '\r'); jsY_next(J); break;
804
- case 't': textpush(J, '\t'); jsY_next(J); break;
805
- }
806
- return 0;
807
- }
808
-
809
- static int lexjsonstring(js_State *J)
810
- {
811
- const char *s;
812
-
813
- textinit(J);
814
-
815
- while (J->lexchar != '"') {
816
- if (J->lexchar == EOF)
817
- jsY_error(J, "unterminated string");
818
- else if (J->lexchar < 32)
819
- jsY_error(J, "invalid control character in string");
820
- else if (jsY_accept(J, '\\'))
821
- lexjsonescape(J);
822
- else {
823
- textpush(J, J->lexchar);
824
- jsY_next(J);
825
- }
826
- }
827
- jsY_expect(J, '"');
828
-
829
- s = textend(J);
830
-
831
- J->text = js_intern(J, s);
832
- return TK_STRING;
833
- }
834
-
835
- int jsY_lexjson(js_State *J)
836
- {
837
- while (1) {
838
- J->lexline = J->line; /* save location of beginning of token */
839
-
840
- while (jsY_iswhite(J->lexchar) || J->lexchar == '\n')
841
- jsY_next(J);
842
-
843
- if ((J->lexchar >= '0' && J->lexchar <= '9') || J->lexchar == '-')
844
- return lexjsonnumber(J);
845
-
846
- switch (J->lexchar) {
847
- case ',': jsY_next(J); return ',';
848
- case ':': jsY_next(J); return ':';
849
- case '[': jsY_next(J); return '[';
850
- case ']': jsY_next(J); return ']';
851
- case '{': jsY_next(J); return '{';
852
- case '}': jsY_next(J); return '}';
853
-
854
- case '"':
855
- jsY_next(J);
856
- return lexjsonstring(J);
857
-
858
- case 'f':
859
- jsY_next(J); jsY_expect(J, 'a'); jsY_expect(J, 'l'); jsY_expect(J, 's'); jsY_expect(J, 'e');
860
- return TK_FALSE;
861
-
862
- case 'n':
863
- jsY_next(J); jsY_expect(J, 'u'); jsY_expect(J, 'l'); jsY_expect(J, 'l');
864
- return TK_NULL;
865
-
866
- case 't':
867
- jsY_next(J); jsY_expect(J, 'r'); jsY_expect(J, 'u'); jsY_expect(J, 'e');
868
- return TK_TRUE;
869
-
870
- case EOF:
871
- return 0; /* EOF */
872
- }
873
-
874
- if (J->lexchar >= 0x20 && J->lexchar <= 0x7E)
875
- jsY_error(J, "unexpected character: '%c'", J->lexchar);
876
- jsY_error(J, "unexpected character: \\u%04X", J->lexchar);
877
- }
878
- }