@agoric/xsnap 0.14.3-dev-b047af2.0 → 0.14.3-dev-3eb4230.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 (126) hide show
  1. package/api.js +1 -1
  2. package/package.json +16 -23
  3. package/src/build.js +4 -61
  4. package/moddable/modules/data/base64/base64.js +0 -28
  5. package/moddable/modules/data/base64/manifest.json +0 -11
  6. package/moddable/modules/data/base64/modBase64.c +0 -188
  7. package/moddable/modules/data/binaryMessage/BinaryMessage.js +0 -106
  8. package/moddable/modules/data/crc/crc.c +0 -205
  9. package/moddable/modules/data/crc/crc.js +0 -36
  10. package/moddable/modules/data/crc/manifest.json +0 -8
  11. package/moddable/modules/data/hex/hex.js +0 -28
  12. package/moddable/modules/data/hex/manifest.json +0 -11
  13. package/moddable/modules/data/hex/modHex.c +0 -139
  14. package/moddable/modules/data/logical/logical.js +0 -32
  15. package/moddable/modules/data/logical/modLogical.c +0 -98
  16. package/moddable/modules/data/qrcode/manifest.json +0 -9
  17. package/moddable/modules/data/qrcode/qrcode.c +0 -93
  18. package/moddable/modules/data/qrcode/qrcode.js +0 -23
  19. package/moddable/modules/data/qrcode/qrcodegen.c +0 -1025
  20. package/moddable/modules/data/qrcode/qrcodegen.h +0 -267
  21. package/moddable/modules/data/text/decoder/manifest.json +0 -8
  22. package/moddable/modules/data/text/decoder/textdecoder.c +0 -480
  23. package/moddable/modules/data/text/decoder/textdecoder.js +0 -27
  24. package/moddable/modules/data/text/encoder/manifest.json +0 -8
  25. package/moddable/modules/data/text/encoder/textencoder.c +0 -232
  26. package/moddable/modules/data/text/encoder/textencoder.js +0 -24
  27. package/moddable/modules/data/tinyint/tinyint.c +0 -150
  28. package/moddable/modules/data/tinyint/tinyint.js +0 -53
  29. package/moddable/modules/data/url/manifest.json +0 -17
  30. package/moddable/modules/data/url/url.c +0 -1959
  31. package/moddable/modules/data/url/url.js +0 -210
  32. package/moddable/modules/data/wavreader/manifest.json +0 -8
  33. package/moddable/modules/data/wavreader/wavreader.js +0 -128
  34. package/moddable/modules/data/zlib/deflate.c +0 -161
  35. package/moddable/modules/data/zlib/deflate.js +0 -63
  36. package/moddable/modules/data/zlib/inflate.c +0 -145
  37. package/moddable/modules/data/zlib/inflate.js +0 -66
  38. package/moddable/modules/data/zlib/manifest_deflate.json +0 -9
  39. package/moddable/modules/data/zlib/manifest_inflate.json +0 -9
  40. package/moddable/modules/data/zlib/miniz.c +0 -4924
  41. package/moddable/xs/includes/xs.d.ts +0 -73
  42. package/moddable/xs/includes/xs.h +0 -1533
  43. package/moddable/xs/includes/xsmc.h +0 -206
  44. package/moddable/xs/makefiles/lin/makefile +0 -33
  45. package/moddable/xs/makefiles/lin/xsc.mk +0 -118
  46. package/moddable/xs/makefiles/lin/xsid.mk +0 -90
  47. package/moddable/xs/makefiles/lin/xsl.mk +0 -168
  48. package/moddable/xs/makefiles/lin/xst.mk +0 -201
  49. package/moddable/xs/makefiles/mac/makefile +0 -33
  50. package/moddable/xs/makefiles/mac/xsc.mk +0 -130
  51. package/moddable/xs/makefiles/mac/xsid.mk +0 -102
  52. package/moddable/xs/makefiles/mac/xsl.mk +0 -177
  53. package/moddable/xs/makefiles/mac/xst.mk +0 -203
  54. package/moddable/xs/makefiles/mac/xst_no_asan.txt +0 -52
  55. package/moddable/xs/makefiles/win/build.bat +0 -26
  56. package/moddable/xs/makefiles/win/xsc.mak +0 -142
  57. package/moddable/xs/makefiles/win/xsid.mak +0 -113
  58. package/moddable/xs/makefiles/win/xsl.mak +0 -186
  59. package/moddable/xs/makefiles/win/xst.mak +0 -195
  60. package/moddable/xs/platforms/lin_xs.h +0 -99
  61. package/moddable/xs/platforms/mac_xs.h +0 -97
  62. package/moddable/xs/platforms/wasm_xs.h +0 -79
  63. package/moddable/xs/platforms/win_xs.h +0 -104
  64. package/moddable/xs/platforms/xsHost.h +0 -63
  65. package/moddable/xs/platforms/xsPlatform.h +0 -618
  66. package/moddable/xs/sources/xsAPI.c +0 -2555
  67. package/moddable/xs/sources/xsAll.c +0 -294
  68. package/moddable/xs/sources/xsAll.h +0 -2741
  69. package/moddable/xs/sources/xsArguments.c +0 -222
  70. package/moddable/xs/sources/xsArray.c +0 -2657
  71. package/moddable/xs/sources/xsAtomics.c +0 -844
  72. package/moddable/xs/sources/xsBigInt.c +0 -1859
  73. package/moddable/xs/sources/xsBoolean.c +0 -109
  74. package/moddable/xs/sources/xsCode.c +0 -4493
  75. package/moddable/xs/sources/xsCommon.c +0 -1710
  76. package/moddable/xs/sources/xsCommon.h +0 -1142
  77. package/moddable/xs/sources/xsDataView.c +0 -2890
  78. package/moddable/xs/sources/xsDate.c +0 -1541
  79. package/moddable/xs/sources/xsDebug.c +0 -2710
  80. package/moddable/xs/sources/xsDefaults.c +0 -134
  81. package/moddable/xs/sources/xsError.c +0 -353
  82. package/moddable/xs/sources/xsFunction.c +0 -776
  83. package/moddable/xs/sources/xsGenerator.c +0 -865
  84. package/moddable/xs/sources/xsGlobal.c +0 -839
  85. package/moddable/xs/sources/xsJSON.c +0 -1091
  86. package/moddable/xs/sources/xsLexical.c +0 -1969
  87. package/moddable/xs/sources/xsLockdown.c +0 -933
  88. package/moddable/xs/sources/xsMapSet.c +0 -1649
  89. package/moddable/xs/sources/xsMarshall.c +0 -1020
  90. package/moddable/xs/sources/xsMath.c +0 -624
  91. package/moddable/xs/sources/xsMemory.c +0 -1941
  92. package/moddable/xs/sources/xsModule.c +0 -3101
  93. package/moddable/xs/sources/xsNumber.c +0 -560
  94. package/moddable/xs/sources/xsObject.c +0 -1102
  95. package/moddable/xs/sources/xsPlatforms.c +0 -480
  96. package/moddable/xs/sources/xsProfile.c +0 -577
  97. package/moddable/xs/sources/xsPromise.c +0 -1199
  98. package/moddable/xs/sources/xsProperty.c +0 -636
  99. package/moddable/xs/sources/xsProxy.c +0 -1014
  100. package/moddable/xs/sources/xsRegExp.c +0 -1168
  101. package/moddable/xs/sources/xsRun.c +0 -4889
  102. package/moddable/xs/sources/xsScope.c +0 -1293
  103. package/moddable/xs/sources/xsScript.c +0 -288
  104. package/moddable/xs/sources/xsScript.h +0 -1186
  105. package/moddable/xs/sources/xsSnapshot.c +0 -2161
  106. package/moddable/xs/sources/xsSnapshot.h +0 -51
  107. package/moddable/xs/sources/xsSourceMap.c +0 -218
  108. package/moddable/xs/sources/xsString.c +0 -3332
  109. package/moddable/xs/sources/xsSymbol.c +0 -503
  110. package/moddable/xs/sources/xsSyntaxical.c +0 -4193
  111. package/moddable/xs/sources/xsTree.c +0 -1893
  112. package/moddable/xs/sources/xsType.c +0 -1488
  113. package/moddable/xs/sources/xsdtoa.c +0 -6672
  114. package/moddable/xs/sources/xsmc.c +0 -340
  115. package/moddable/xs/sources/xsre.c +0 -7578
  116. package/xsnap-native/xsnap/makefiles/lin/makefile +0 -10
  117. package/xsnap-native/xsnap/makefiles/lin/xsnap-worker.mk +0 -153
  118. package/xsnap-native/xsnap/makefiles/lin/xsnap.mk +0 -144
  119. package/xsnap-native/xsnap/makefiles/mac/makefile +0 -10
  120. package/xsnap-native/xsnap/makefiles/mac/xsnap-worker.mk +0 -162
  121. package/xsnap-native/xsnap/makefiles/mac/xsnap.mk +0 -153
  122. package/xsnap-native/xsnap/sources/xsnap-worker.c +0 -996
  123. package/xsnap-native/xsnap/sources/xsnap.c +0 -716
  124. package/xsnap-native/xsnap/sources/xsnap.h +0 -142
  125. package/xsnap-native/xsnap/sources/xsnapPlatform.c +0 -1496
  126. package/xsnap-native/xsnap/sources/xsnapPlatform.h +0 -105
@@ -1,4193 +0,0 @@
1
- /*
2
- * Copyright (c) 2016-2017 Moddable Tech, Inc.
3
- *
4
- * This file is part of the Moddable SDK Runtime.
5
- *
6
- * The Moddable SDK Runtime is free software: you can redistribute it and/or modify
7
- * it under the terms of the GNU Lesser General Public License as published by
8
- * the Free Software Foundation, either version 3 of the License, or
9
- * (at your option) any later version.
10
- *
11
- * The Moddable SDK Runtime is distributed in the hope that it will be useful,
12
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
- * GNU Lesser General Public License for more details.
15
- *
16
- * You should have received a copy of the GNU Lesser General Public License
17
- * along with the Moddable SDK Runtime. If not, see <http://www.gnu.org/licenses/>.
18
- *
19
- * This file incorporates work covered by the following copyright and
20
- * permission notice:
21
- *
22
- * Copyright (C) 2010-2016 Marvell International Ltd.
23
- * Copyright (C) 2002-2010 Kinoma, Inc.
24
- *
25
- * Licensed under the Apache License, Version 2.0 (the "License");
26
- * you may not use this file except in compliance with the License.
27
- * You may obtain a copy of the License at
28
- *
29
- * http://www.apache.org/licenses/LICENSE-2.0
30
- *
31
- * Unless required by applicable law or agreed to in writing, software
32
- * distributed under the License is distributed on an "AS IS" BASIS,
33
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
34
- * See the License for the specific language governing permissions and
35
- * limitations under the License.
36
- */
37
-
38
- #include "xsScript.h"
39
-
40
- static txBoolean fxIsKeyword(txParser* parser, txSymbol* keyword);
41
- static txBoolean fxIsToken(txParser* parser, txToken theToken);
42
- static void fxMatchToken(txParser* parser, txToken theToken);
43
- static txNode* fxPopNode(txParser* parser);
44
- static void fxPushNode(txParser* parser, txNode* node);
45
- static void fxPushBigIntNode(txParser* parser, txBigInt* value, txInteger line);
46
- static void fxPushIndexNode(txParser* parser, txIndex value, txInteger line);
47
- static void fxPushIntegerNode(txParser* parser, txInteger value, txInteger line);
48
- static void fxPushNodeStruct(txParser* parser, txInteger count, txToken token, txInteger line);
49
- static void fxPushNodeList(txParser* parser, txInteger count);
50
- static void fxPushNULL(txParser* parser);
51
- static void fxPushNumberNode(txParser* parser, txNumber value, txInteger line);
52
- static void fxPushRawNode(txParser* parser, txInteger length, txString value, txInteger line);
53
- static void fxPushStringNode(txParser* parser, txInteger length, txString value, txInteger line);
54
- static void fxPushSymbol(txParser* parser, txSymbol* symbol);
55
- static void fxSwapNodes(txParser* parser);
56
-
57
- static void fxExport(txParser* parser);
58
- static void fxExportBinding(txParser* parser, txNode* node);
59
- static void fxImport(txParser* parser);
60
- static void fxSpecifiers(txParser* parser);
61
-
62
- static void fxBody(txParser* parser);
63
- static void fxStatements(txParser* parser);
64
- static void fxBlock(txParser* parser);
65
- static void fxStatement(txParser* parser, txBoolean blockIt);
66
- static void fxSemicolon(txParser* parser);
67
- static void fxBreakStatement(txParser* parser);
68
- static void fxContinueStatement(txParser* parser);
69
- static void fxDebuggerStatement(txParser* parser);
70
- static void fxDoStatement(txParser* parser);
71
- static void fxForStatement(txParser* parser);
72
- static void fxIfStatement(txParser* parser);
73
- static void fxReturnStatement(txParser* parser);
74
- static void fxSwitchStatement(txParser* parser);
75
- static void fxThrowStatement(txParser* parser);
76
- static void fxTryStatement(txParser* parser);
77
- static void fxVariableStatement(txParser* parser, txToken theToken);
78
- static void fxWhileStatement(txParser* parser);
79
- static void fxWithStatement(txParser* parser);
80
-
81
- static void fxCommaExpression(txParser* parser);
82
- static void fxAssignmentExpression(txParser* parser);
83
- static void fxConditionalExpression(txParser* parser);
84
- static void fxOrExpression(txParser* parser);
85
- static void fxAndExpression(txParser* parser);
86
- static void fxCoalesceExpression(txParser* parser);
87
- static void fxBitOrExpression(txParser* parser);
88
- static void fxBitXorExpression(txParser* parser);
89
- static void fxBitAndExpression(txParser* parser);
90
- static void fxEqualExpression(txParser* parser);
91
- static void fxRelationalExpression(txParser* parser);
92
- static void fxShiftExpression(txParser* parser);
93
- static void fxAdditiveExpression(txParser* parser);
94
- static void fxMultiplicativeExpression(txParser* parser);
95
- static void fxExponentiationExpression(txParser* parser);
96
- static void fxUnaryExpression(txParser* parser);
97
- static void fxPrefixExpression(txParser* parser);
98
- static void fxPostfixExpression(txParser* parser);
99
- static void fxCallExpression(txParser* parser);
100
-
101
- static void fxLiteralExpression(txParser* parser, txUnsigned flag);
102
- static void fxArrayExpression(txParser* parser);
103
- static void fxArrowExpression(txParser* parser, txUnsigned flag);
104
- static void fxClassExpression(txParser* parser, txInteger theLine, txSymbol** theSymbol);
105
- static void fxFunctionExpression(txParser* parser, txInteger theLine, txSymbol** theSymbol, txUnsigned flag);
106
- static void fxGeneratorExpression(txParser* parser, txInteger theLine, txSymbol** theSymbol, txUnsigned flag);
107
- static void fxGroupExpression(txParser* parser, txUnsigned flag);
108
- static void fxObjectExpression(txParser* parser);
109
- static void fxNewExpression(txParser* parser);
110
- static void fxTemplateExpression(txParser* parser);
111
- static void fxYieldExpression(txParser* parser);
112
-
113
- static void fxParameters(txParser* parser);
114
- static void fxPropertyName(txParser* parser, txSymbol** theSymbol, txToken* theToken0, txToken* theToken1, txToken* theToken2, txUnsigned* flag);
115
-
116
- static void fxBinding(txParser* parser, txToken theToken, txFlag initializeIt);
117
- static txNode* fxBindingFromExpression(txParser* parser, txNode* theNode, txToken theToken);
118
- static void fxArrayBinding(txParser* parser, txToken theToken);
119
- static txNode* fxArrayBindingFromExpression(txParser* parser, txNode* theNode, txToken theToken);
120
- static txUnsigned fxObjectBinding(txParser* parser, txToken theToken);
121
- static txNode* fxObjectBindingFromExpression(txParser* parser, txNode* theNode, txToken theToken);
122
- static void fxParametersBinding(txParser* parser);
123
- static txNode* fxParametersBindingFromExpressions(txParser* parser, txNode* theNode);
124
- static void fxRestBinding(txParser* parser, txToken theToken, txUnsigned flag);
125
- static txNode* fxRestBindingFromExpression(txParser* parser, txNode* theNode, txToken theToken, txUnsigned flag);
126
-
127
- static void fxCheckArrowFunction(txParser* parser, txInteger count);
128
- static txBoolean fxCheckReference(txParser* parser, txToken theToken);
129
- static void fxCheckStrictBinding(txParser* parser, txNode* node);
130
- static void fxCheckStrictFunction(txParser* parser, txFunctionNode* function);
131
- static void fxCheckStrictSymbol(txParser* parser, txSymbol* symbol);
132
- static void fxCheckUniqueProperty(txParser* parser, txNode* base, txNode* current);
133
- static void fxCheckUniquePropertyAux(txParser* parser, txNode* baseNode, txNode* currentNode);
134
-
135
- static void fxJSONObject(txParser* parser);
136
- static void fxJSONArray(txParser* parser);
137
-
138
- static void fxJSXAttributeName(txParser* parser);
139
- static void fxJSXAttributeValue(txParser* parser);
140
- static void fxJSXElement(txParser* parser);
141
- static void fxJSXElementName(txParser* parser);
142
- static txBoolean fxJSXMatch(txParser* parser, txNode* opening, txNode* closing);
143
- static txSymbol* fxJSXNamespace(txParser* parser, txSymbol* namespace, txSymbol* name);
144
-
145
- #define XS_TOKEN_BEGIN_STATEMENT 1
146
- #define XS_TOKEN_BEGIN_EXPRESSION 2
147
- #define XS_TOKEN_ASSIGN_EXPRESSION 4
148
- #define XS_TOKEN_EQUAL_EXPRESSION 8
149
- #define XS_TOKEN_RELATIONAL_EXPRESSION 16
150
- #define XS_TOKEN_SHIFT_EXPRESSION 32
151
- #define XS_TOKEN_ADDITIVE_EXPRESSION 64
152
- #define XS_TOKEN_MULTIPLICATIVE_EXPRESSION 128
153
- #define XS_TOKEN_EXPONENTIATION_EXPRESSION 256
154
- #define XS_TOKEN_PREFIX_EXPRESSION 512
155
- #define XS_TOKEN_POSTFIX_EXPRESSION 1024
156
- #define XS_TOKEN_END_STATEMENT 2048
157
- #define XS_TOKEN_REFERENCE_EXPRESSION 4096
158
- #define XS_TOKEN_BEGIN_BINDING 16384
159
- #define XS_TOKEN_IDENTIFIER_NAME 32768
160
- #define XS_TOKEN_UNARY_EXPRESSION 65536
161
- #define XS_TOKEN_CALL_EXPRESSION 131072
162
-
163
- static txTokenFlag gxTokenFlags[XS_TOKEN_COUNT] = {
164
- /* XS_NO_TOKEN */ 0,
165
- /* XS_TOKEN_ACCESS */ 0,
166
- /* XS_TOKEN_ADD */ XS_TOKEN_BEGIN_STATEMENT | XS_TOKEN_BEGIN_EXPRESSION | XS_TOKEN_ADDITIVE_EXPRESSION | XS_TOKEN_UNARY_EXPRESSION,
167
- /* XS_TOKEN_ADD_ASSIGN */ XS_TOKEN_ASSIGN_EXPRESSION,
168
- /* XS_TOKEN_AND */ 0,
169
- /* XS_TOKEN_AND_ASSIGN */ XS_TOKEN_ASSIGN_EXPRESSION,
170
- /* XS_TOKEN_ARG */ 0,
171
- /* XS_TOKEN_ARGUMENTS */ 0,
172
- /* XS_TOKEN_ARGUMENTS_SLOPPY */ 0,
173
- /* XS_TOKEN_ARGUMENTS_STRICT */ 0,
174
- /* XS_TOKEN_ARRAY */ 0,
175
- /* XS_TOKEN_ARRAY_BINDING */ 0,
176
- /* XS_TOKEN_ARROW */ 0,
177
- /* XS_TOKEN_ASSIGN */ XS_TOKEN_ASSIGN_EXPRESSION,
178
- /* XS_TOKEN_AWAIT */ XS_TOKEN_BEGIN_STATEMENT | XS_TOKEN_BEGIN_EXPRESSION | XS_TOKEN_UNARY_EXPRESSION | XS_TOKEN_IDENTIFIER_NAME,
179
- /* XS_TOKEN_BIGINT */ XS_TOKEN_BEGIN_STATEMENT | XS_TOKEN_BEGIN_EXPRESSION,
180
- /* XS_TOKEN_BINDING */ 0,
181
- /* XS_TOKEN_BIT_AND */ 0,
182
- /* XS_TOKEN_BIT_AND_ASSIGN */ XS_TOKEN_ASSIGN_EXPRESSION,
183
- /* XS_TOKEN_BIT_NOT */ XS_TOKEN_BEGIN_STATEMENT | XS_TOKEN_BEGIN_EXPRESSION | XS_TOKEN_UNARY_EXPRESSION,
184
- /* XS_TOKEN_BIT_OR */ 0,
185
- /* XS_TOKEN_BIT_OR_ASSIGN */ XS_TOKEN_ASSIGN_EXPRESSION,
186
- /* XS_TOKEN_BIT_XOR */ 0,
187
- /* XS_TOKEN_BIT_XOR_ASSIGN */ XS_TOKEN_ASSIGN_EXPRESSION,
188
- /* XS_TOKEN_BLOCK */ 0,
189
- /* XS_TOKEN_BODY */ 0,
190
- /* XS_TOKEN_BREAK */ XS_TOKEN_BEGIN_STATEMENT | XS_TOKEN_IDENTIFIER_NAME,
191
- /* XS_TOKEN_CALL */ 0,
192
- /* XS_TOKEN_CASE */ XS_TOKEN_IDENTIFIER_NAME,
193
- /* XS_TOKEN_CATCH */ XS_TOKEN_IDENTIFIER_NAME,
194
- /* XS_TOKEN_CHAIN */ XS_TOKEN_CALL_EXPRESSION,
195
- /* XS_TOKEN_CLASS */ XS_TOKEN_BEGIN_STATEMENT | XS_TOKEN_BEGIN_EXPRESSION | XS_TOKEN_IDENTIFIER_NAME,
196
- /* XS_TOKEN_COALESCE */ 0,
197
- /* XS_TOKEN_COALESCE_ASSIGN */ XS_TOKEN_ASSIGN_EXPRESSION,
198
- /* XS_TOKEN_COLON */ 0,
199
- /* XS_TOKEN_COMMA */ XS_TOKEN_END_STATEMENT,
200
- /* XS_TOKEN_CONST */ XS_TOKEN_BEGIN_STATEMENT | XS_TOKEN_IDENTIFIER_NAME,
201
- /* XS_TOKEN_CONTINUE */ XS_TOKEN_BEGIN_STATEMENT | XS_TOKEN_IDENTIFIER_NAME,
202
- /* XS_TOKEN_CURRENT */ 0,
203
- /* XS_TOKEN_DEBUGGER */ XS_TOKEN_BEGIN_STATEMENT | XS_TOKEN_IDENTIFIER_NAME,
204
- /* XS_TOKEN_DECREMENT */ XS_TOKEN_BEGIN_STATEMENT | XS_TOKEN_BEGIN_EXPRESSION | XS_TOKEN_PREFIX_EXPRESSION | XS_TOKEN_POSTFIX_EXPRESSION,
205
- /* XS_TOKEN_DEFAULT */ XS_TOKEN_IDENTIFIER_NAME,
206
- /* XS_TOKEN_DEFINE */ 0,
207
- /* XS_TOKEN_DELEGATE */ 0,
208
- /* XS_TOKEN_DELETE */ XS_TOKEN_BEGIN_STATEMENT | XS_TOKEN_BEGIN_EXPRESSION | XS_TOKEN_UNARY_EXPRESSION | XS_TOKEN_IDENTIFIER_NAME,
209
- /* XS_TOKEN_DIVIDE */ XS_TOKEN_BEGIN_EXPRESSION | XS_TOKEN_MULTIPLICATIVE_EXPRESSION,
210
- /* XS_TOKEN_DIVIDE_ASSIGN */ XS_TOKEN_BEGIN_EXPRESSION | XS_TOKEN_ASSIGN_EXPRESSION,
211
- /* XS_TOKEN_DO */ XS_TOKEN_BEGIN_STATEMENT | XS_TOKEN_IDENTIFIER_NAME,
212
- /* XS_TOKEN_DOT */ XS_TOKEN_CALL_EXPRESSION,
213
- /* XS_TOKEN_ELISION */ 0,
214
- /* XS_TOKEN_ELSE */ XS_TOKEN_IDENTIFIER_NAME,
215
- /* XS_TOKEN_ENUM */ XS_TOKEN_IDENTIFIER_NAME,
216
- /* XS_TOKEN_EOF */ XS_TOKEN_END_STATEMENT,
217
- /* XS_TOKEN_EQUAL */ XS_TOKEN_EQUAL_EXPRESSION,
218
- /* XS_TOKEN_EVAL */ 0,
219
- /* XS_TOKEN_EXPONENTIATION */ XS_TOKEN_EXPONENTIATION_EXPRESSION,
220
- /* XS_TOKEN_EXPONENTIATION_ASSIGN */ XS_TOKEN_ASSIGN_EXPRESSION,
221
- /* XS_TOKEN_EXPORT */ XS_TOKEN_IDENTIFIER_NAME,
222
- /* XS_TOKEN_EXPRESSIONS */ 0,
223
- /* XS_TOKEN_EXTENDS */ XS_TOKEN_IDENTIFIER_NAME,
224
- /* XS_TOKEN_FALSE */ XS_TOKEN_BEGIN_STATEMENT | XS_TOKEN_BEGIN_EXPRESSION | XS_TOKEN_IDENTIFIER_NAME,
225
- /* XS_TOKEN_FIELD */ 0,
226
- /* XS_TOKEN_FINALLY */ XS_TOKEN_IDENTIFIER_NAME | XS_TOKEN_IDENTIFIER_NAME,
227
- /* XS_TOKEN_FOR */ XS_TOKEN_BEGIN_STATEMENT | XS_TOKEN_IDENTIFIER_NAME,
228
- /* XS_TOKEN_FOR_AWAIT_OF */ 0,
229
- /* XS_TOKEN_FOR_IN */ 0,
230
- /* XS_TOKEN_FOR_OF */ 0,
231
- /* XS_TOKEN_FUNCTION */ XS_TOKEN_BEGIN_STATEMENT | XS_TOKEN_BEGIN_EXPRESSION | XS_TOKEN_IDENTIFIER_NAME,
232
- /* XS_TOKEN_GENERATOR */ 0,
233
- /* XS_TOKEN_GETTER */ 0,
234
- /* XS_TOKEN_HOST */ XS_TOKEN_BEGIN_EXPRESSION,
235
- /* XS_TOKEN_IDENTIFIER */ XS_TOKEN_BEGIN_STATEMENT | XS_TOKEN_BEGIN_EXPRESSION | XS_TOKEN_BEGIN_BINDING | XS_TOKEN_IDENTIFIER_NAME,
236
- /* XS_TOKEN_IF */ XS_TOKEN_BEGIN_STATEMENT | XS_TOKEN_IDENTIFIER_NAME,
237
- /* XS_TOKEN_IMPLEMENTS */ XS_TOKEN_IDENTIFIER_NAME,
238
- /* XS_TOKEN_IMPORT */ XS_TOKEN_BEGIN_EXPRESSION | XS_TOKEN_IDENTIFIER_NAME,
239
- /* XS_TOKEN_IMPORT_CALL */ 0,
240
- /* XS_TOKEN_IMPORT_META */ 0,
241
- /* XS_TOKEN_IN */ XS_TOKEN_RELATIONAL_EXPRESSION | XS_TOKEN_IDENTIFIER_NAME,
242
- /* XS_TOKEN_INCLUDE */ 0,
243
- /* XS_TOKEN_INCREMENT */ XS_TOKEN_BEGIN_STATEMENT | XS_TOKEN_BEGIN_EXPRESSION | XS_TOKEN_PREFIX_EXPRESSION | XS_TOKEN_POSTFIX_EXPRESSION,
244
- /* XS_TOKEN_INSTANCEOF */ XS_TOKEN_RELATIONAL_EXPRESSION | XS_TOKEN_IDENTIFIER_NAME,
245
- /* XS_TOKEN_INTEGER */ XS_TOKEN_BEGIN_STATEMENT | XS_TOKEN_BEGIN_EXPRESSION,
246
- /* XS_TOKEN_INTERFACE */ XS_TOKEN_IDENTIFIER_NAME,
247
- /* XS_TOKEN_ITEMS */ 0,
248
- /* XS_TOKEN_LABEL */ 0,
249
- /* XS_TOKEN_LEFT_BRACE */ XS_TOKEN_BEGIN_STATEMENT | XS_TOKEN_BEGIN_EXPRESSION | XS_TOKEN_BEGIN_BINDING,
250
- /* XS_TOKEN_LEFT_BRACKET */ XS_TOKEN_BEGIN_STATEMENT | XS_TOKEN_BEGIN_EXPRESSION | XS_TOKEN_BEGIN_BINDING | XS_TOKEN_CALL_EXPRESSION,
251
- /* XS_TOKEN_LEFT_PARENTHESIS */ XS_TOKEN_BEGIN_STATEMENT | XS_TOKEN_BEGIN_EXPRESSION | XS_TOKEN_CALL_EXPRESSION,
252
- /* XS_TOKEN_LEFT_SHIFT */ XS_TOKEN_SHIFT_EXPRESSION,
253
- /* XS_TOKEN_LEFT_SHIFT_ASSIGN */ XS_TOKEN_ASSIGN_EXPRESSION,
254
- /* XS_TOKEN_LESS */ XS_TOKEN_BEGIN_EXPRESSION | XS_TOKEN_RELATIONAL_EXPRESSION,
255
- /* XS_TOKEN_LESS_EQUAL */ XS_TOKEN_RELATIONAL_EXPRESSION,
256
- /* XS_TOKEN_LET */ XS_TOKEN_BEGIN_STATEMENT | XS_TOKEN_IDENTIFIER_NAME,
257
- /* XS_TOKEN_MEMBER */ 0,
258
- /* XS_TOKEN_MEMBER_AT */ 0,
259
- /* XS_TOKEN_MINUS */ 0,
260
- /* XS_TOKEN_MODULE */ 0,
261
- /* XS_TOKEN_MODULO */ XS_TOKEN_MULTIPLICATIVE_EXPRESSION,
262
- /* XS_TOKEN_MODULO_ASSIGN */ XS_TOKEN_ASSIGN_EXPRESSION,
263
- /* XS_TOKEN_MORE */ XS_TOKEN_RELATIONAL_EXPRESSION,
264
- /* XS_TOKEN_MORE_EQUAL */ XS_TOKEN_RELATIONAL_EXPRESSION,
265
- /* XS_TOKEN_MULTIPLY */ XS_TOKEN_MULTIPLICATIVE_EXPRESSION,
266
- /* XS_TOKEN_MULTIPLY_ASSIGN */ XS_TOKEN_ASSIGN_EXPRESSION,
267
- /* XS_TOKEN_NEW */ XS_TOKEN_BEGIN_STATEMENT | XS_TOKEN_BEGIN_EXPRESSION | XS_TOKEN_IDENTIFIER_NAME,
268
- /* XS_TOKEN_NOT */ XS_TOKEN_BEGIN_STATEMENT | XS_TOKEN_BEGIN_EXPRESSION | XS_TOKEN_UNARY_EXPRESSION,
269
- /* XS_TOKEN_NOT_EQUAL */ XS_TOKEN_EQUAL_EXPRESSION,
270
- /* XS_TOKEN_NULL */ XS_TOKEN_BEGIN_STATEMENT | XS_TOKEN_BEGIN_EXPRESSION | XS_TOKEN_IDENTIFIER_NAME,
271
- /* XS_TOKEN_NUMBER */ XS_TOKEN_BEGIN_STATEMENT | XS_TOKEN_BEGIN_EXPRESSION,
272
- /* XS_TOKEN_OBJECT */ 0,
273
- /* XS_TOKEN_OBJECT_BINDING */ 0,
274
- /* XS_TOKEN_OPTION */ 0,
275
- /* XS_TOKEN_OR */ 0,
276
- /* XS_TOKEN_OR_ASSIGN */ XS_TOKEN_ASSIGN_EXPRESSION,
277
- /* XS_TOKEN_PACKAGE */ XS_TOKEN_IDENTIFIER_NAME,
278
- /* XS_TOKEN_PARAMS */ 0,
279
- /* XS_TOKEN_PARAMS_BINDING */ 0,
280
- /* XS_TOKEN_PLUS */ 0,
281
- /* XS_TOKEN_PRIVATE */ XS_TOKEN_IDENTIFIER_NAME,
282
- /* XS_TOKEN_PRIVATE_IDENTIFIER */ XS_TOKEN_BEGIN_EXPRESSION,
283
- /* XS_TOKEN_PRIVATE_MEMBER */ 0,
284
- /* XS_TOKEN_PRIVATE_PROPERTY */ 0,
285
- /* XS_TOKEN_PROGRAM */ 0,
286
- /* XS_TOKEN_PROPERTY */ 0,
287
- /* XS_TOKEN_PROPERTY_AT */ 0,
288
- /* XS_TOKEN_PROPERTY_BINDING */ 0,
289
- /* XS_TOKEN_PROPERTY_BINDING_AT */ 0,
290
- /* XS_TOKEN_PROTECTED */ XS_TOKEN_IDENTIFIER_NAME,
291
- /* XS_TOKEN_PUBLIC */ XS_TOKEN_IDENTIFIER_NAME,
292
- /* XS_TOKEN_QUESTION_MARK */ 0,
293
- /* XS_TOKEN_REGEXP */ XS_TOKEN_BEGIN_STATEMENT | XS_TOKEN_BEGIN_EXPRESSION,
294
- /* XS_TOKEN_REST_BINDING */ 0,
295
- /* XS_TOKEN_RETURN */ XS_TOKEN_BEGIN_STATEMENT | XS_TOKEN_IDENTIFIER_NAME,
296
- /* XS_TOKEN_RIGHT_BRACE */ XS_TOKEN_END_STATEMENT,
297
- /* XS_TOKEN_RIGHT_BRACKET */ 0,
298
- /* XS_TOKEN_RIGHT_PARENTHESIS */ 0,
299
- /* XS_TOKEN_SEMICOLON */ XS_TOKEN_BEGIN_STATEMENT | XS_TOKEN_END_STATEMENT,
300
- /* XS_TOKEN_SETTER */ 0,
301
- /* XS_TOKEN_SHORT */ 0,
302
- /* XS_TOKEN_SIGNED_RIGHT_SHIFT */ XS_TOKEN_SHIFT_EXPRESSION,
303
- /* XS_TOKEN_SIGNED_RIGHT_SHIFT_ASSIGN */ XS_TOKEN_ASSIGN_EXPRESSION,
304
- /* XS_TOKEN_SKIP_BINDING */ 0,
305
- /* XS_TOKEN_SPECIFIER */ 0,
306
- /* XS_TOKEN_SPREAD */ XS_TOKEN_BEGIN_BINDING,
307
- /* XS_TOKEN_STATEMENT */ 0,
308
- /* XS_TOKEN_STATEMENTS */ 0,
309
- /* XS_TOKEN_STATIC */ XS_TOKEN_IDENTIFIER_NAME,
310
- /* XS_TOKEN_STRICT_EQUAL */ XS_TOKEN_EQUAL_EXPRESSION,
311
- /* XS_TOKEN_STRICT_NOT_EQUAL */ XS_TOKEN_EQUAL_EXPRESSION,
312
- /* XS_TOKEN_STRING */ XS_TOKEN_BEGIN_STATEMENT | XS_TOKEN_BEGIN_EXPRESSION,
313
- /* XS_TOKEN_SUBTRACT */ XS_TOKEN_BEGIN_STATEMENT | XS_TOKEN_BEGIN_EXPRESSION | XS_TOKEN_ADDITIVE_EXPRESSION | XS_TOKEN_UNARY_EXPRESSION,
314
- /* XS_TOKEN_SUBTRACT_ASSIGN */ XS_TOKEN_ASSIGN_EXPRESSION,
315
- /* XS_TOKEN_SUPER */ XS_TOKEN_BEGIN_STATEMENT | XS_TOKEN_BEGIN_EXPRESSION | XS_TOKEN_IDENTIFIER_NAME,
316
- /* XS_TOKEN_SWITCH */ XS_TOKEN_BEGIN_STATEMENT | XS_TOKEN_IDENTIFIER_NAME,
317
- /* XS_TOKEN_TARGET */ 0,
318
- /* XS_TOKEN_TEMPLATE */ XS_TOKEN_BEGIN_STATEMENT | XS_TOKEN_BEGIN_EXPRESSION | XS_TOKEN_CALL_EXPRESSION,
319
- /* XS_TOKEN_TEMPLATE_HEAD */ XS_TOKEN_BEGIN_STATEMENT | XS_TOKEN_BEGIN_EXPRESSION | XS_TOKEN_CALL_EXPRESSION,
320
- /* XS_TOKEN_TEMPLATE_MIDDLE */ 0,
321
- /* XS_TOKEN_TEMPLATE_TAIL */ 0,
322
- /* XS_TOKEN_THIS */ XS_TOKEN_BEGIN_STATEMENT | XS_TOKEN_BEGIN_EXPRESSION | XS_TOKEN_IDENTIFIER_NAME,
323
- /* XS_TOKEN_THROW */ XS_TOKEN_BEGIN_STATEMENT | XS_TOKEN_IDENTIFIER_NAME,
324
- /* XS_TOKEN_TRUE */ XS_TOKEN_BEGIN_STATEMENT | XS_TOKEN_BEGIN_EXPRESSION | XS_TOKEN_IDENTIFIER_NAME,
325
- /* XS_TOKEN_TRY */ XS_TOKEN_BEGIN_STATEMENT | XS_TOKEN_IDENTIFIER_NAME,
326
- /* XS_TOKEN_TYPEOF */ XS_TOKEN_BEGIN_STATEMENT | XS_TOKEN_BEGIN_EXPRESSION | XS_TOKEN_UNARY_EXPRESSION | XS_TOKEN_IDENTIFIER_NAME,
327
- /* XS_TOKEN_UNDEFINED */ 0,
328
- /* XS_TOKEN_UNSIGNED_RIGHT_SHIFT */ XS_TOKEN_SHIFT_EXPRESSION,
329
- /* XS_TOKEN_UNSIGNED_RIGHT_SHIFT_ASSIGN */ XS_TOKEN_ASSIGN_EXPRESSION,
330
- /* XS_TOKEN_VAR */ XS_TOKEN_BEGIN_STATEMENT | XS_TOKEN_IDENTIFIER_NAME,
331
- /* XS_TOKEN_VOID */ XS_TOKEN_BEGIN_STATEMENT | XS_TOKEN_BEGIN_EXPRESSION | XS_TOKEN_UNARY_EXPRESSION | XS_TOKEN_IDENTIFIER_NAME,
332
- /* XS_TOKEN_WHILE */ XS_TOKEN_BEGIN_STATEMENT | XS_TOKEN_IDENTIFIER_NAME,
333
- /* XS_TOKEN_WITH */ XS_TOKEN_BEGIN_STATEMENT | XS_TOKEN_IDENTIFIER_NAME,
334
- /* XS_TOKEN_YIELD */ XS_TOKEN_BEGIN_STATEMENT | XS_TOKEN_BEGIN_EXPRESSION | XS_TOKEN_IDENTIFIER_NAME
335
- };
336
-
337
- static txString const gxTokenNames[XS_TOKEN_COUNT] ICACHE_FLASH_ATTR = {
338
- /* XS_NO_TOKEN */ "",
339
- /* XS_TOKEN_ACCESS */ "access",
340
- /* XS_TOKEN_ADD */ "+",
341
- /* XS_TOKEN_ADD_ASSIGN */ "+=",
342
- /* XS_TOKEN_AND */ "&&",
343
- /* XS_TOKEN_AND_ASSIGN */ "&&=",
344
- /* XS_TOKEN_ARG */ "arg",
345
- /* XS_TOKEN_ARGUMENTS */ "arguments",
346
- /* XS_TOKEN_ARGUMENTS_SLOPPY */ "arguments_sloppy",
347
- /* XS_TOKEN_ARGUMENTS_STRICT */ "arguments_strict",
348
- /* XS_TOKEN_ARRAY */ "array",
349
- /* XS_TOKEN_ARRAY_BINDING */ "array_binding",
350
- /* XS_TOKEN_ARROW */ "=>",
351
- /* XS_TOKEN_ASSIGN */ "=",
352
- /* XS_TOKEN_AWAIT */ "await",
353
- /* XS_TOKEN_BIGINT */ "bigint",
354
- /* XS_TOKEN_BINDING */ "binding",
355
- /* XS_TOKEN_BIT_AND */ "&",
356
- /* XS_TOKEN_BIT_AND_ASSIGN */ "&=",
357
- /* XS_TOKEN_BIT_NOT */ "~",
358
- /* XS_TOKEN_BIT_OR */ "|",
359
- /* XS_TOKEN_BIT_OR_ASSIGN */ "|=",
360
- /* XS_TOKEN_BIT_XOR */ "^",
361
- /* XS_TOKEN_BIT_XOR_ASSIGN */ "^=",
362
- /* XS_TOKEN_BLOCK */ "block",
363
- /* XS_TOKEN_BODY */ "body",
364
- /* XS_TOKEN_BREAK */ "break",
365
- /* XS_TOKEN_CALL */ "call",
366
- /* XS_TOKEN_CASE */ "case",
367
- /* XS_TOKEN_CATCH */ "catch",
368
- /* XS_TOKEN_CHAIN */ "?.",
369
- /* XS_TOKEN_CLASS */ "class",
370
- /* XS_TOKEN_COALESCE */ "??",
371
- /* XS_TOKEN_COALESCE_ASSIGN */ "\?\?=",
372
- /* XS_TOKEN_COLON */ ":",
373
- /* XS_TOKEN_COMMA */ ",",
374
- /* XS_TOKEN_CONST */ "const",
375
- /* XS_TOKEN_CONTINUE */ "continue",
376
- /* XS_TOKEN_CURRENT */ "current",
377
- /* XS_TOKEN_DEBUGGER */ "debugger",
378
- /* XS_TOKEN_DECREMENT */ "--",
379
- /* XS_TOKEN_DEFAULT */ "default",
380
- /* XS_TOKEN_DEFINE */ "define",
381
- /* XS_TOKEN_DELEGATE */ "delegate",
382
- /* XS_TOKEN_DELETE */ "delete",
383
- /* XS_TOKEN_DIVIDE */ "/",
384
- /* XS_TOKEN_DIVIDE_ASSIGN */ "/=",
385
- /* XS_TOKEN_DO */ "do",
386
- /* XS_TOKEN_DOT */ ".",
387
- /* XS_TOKEN_ELISION */ "elision",
388
- /* XS_TOKEN_ELSE */ "else",
389
- /* XS_TOKEN_ENUM */ "enum",
390
- /* XS_TOKEN_EOF */ "",
391
- /* XS_TOKEN_EQUAL */ "==",
392
- /* XS_TOKEN_EVAL */ "eval",
393
- /* XS_TOKEN_EXPONENTIATION */ "**",
394
- /* XS_TOKEN_EXPONENTIATION_ASSIGN */ "**=",
395
- /* XS_TOKEN_EXPORT */ "export",
396
- /* XS_TOKEN_EXPRESSIONS */ "expressions",
397
- /* XS_TOKEN_EXTENDS */ "extends",
398
- /* XS_TOKEN_FALSE */ "false",
399
- /* XS_TOKEN_FIELD */ "field",
400
- /* XS_TOKEN_FINALLY */ "finally",
401
- /* XS_TOKEN_FOR */ "for",
402
- /* XS_TOKEN_FOR_AWAIT_OF */ "for_await_of",
403
- /* XS_TOKEN_FOR_IN */ "for_in",
404
- /* XS_TOKEN_FOR_OF */ "for_of",
405
- /* XS_TOKEN_FUNCTION */ "function",
406
- /* XS_TOKEN_GENERATOR */ "generator",
407
- /* XS_TOKEN_GETTER */ "getter",
408
- /* XS_TOKEN_HOST */ "host",
409
- /* XS_TOKEN_IDENTIFIER */ "identifier",
410
- /* XS_TOKEN_IF */ "if",
411
- /* XS_TOKEN_IMPLEMENTS */ "implements",
412
- /* XS_TOKEN_IMPORT */ "import",
413
- /* XS_TOKEN_IMPORT_CALL */ "import",
414
- /* XS_TOKEN_IMPORT_META */ "import.meta",
415
- /* XS_TOKEN_IN */ "in",
416
- /* XS_TOKEN_INCLUDE */ "include",
417
- /* XS_TOKEN_INCREMENT */ "++",
418
- /* XS_TOKEN_INSTANCEOF */ "instanceof",
419
- /* XS_TOKEN_INTEGER */ "integer",
420
- /* XS_TOKEN_INTERFACE */ "interface",
421
- /* XS_TOKEN_ITEMS */ "items",
422
- /* XS_TOKEN_LABEL */ "label",
423
- /* XS_TOKEN_LEFT_BRACE */ "{",
424
- /* XS_TOKEN_LEFT_BRACKET */ "[",
425
- /* XS_TOKEN_LEFT_PARENTHESIS */ "(",
426
- /* XS_TOKEN_LEFT_SHIFT */ "<<",
427
- /* XS_TOKEN_LEFT_SHIFT_ASSIGN */ "<<=",
428
- /* XS_TOKEN_LESS */ "<",
429
- /* XS_TOKEN_LESS_EQUAL */ "<=",
430
- /* XS_TOKEN_LET */ "let",
431
- /* XS_TOKEN_MEMBER */ "member",
432
- /* XS_TOKEN_MEMBER_AT */ "member_at",
433
- /* XS_TOKEN_MINUS */ "minus",
434
- /* XS_TOKEN_MODULE */ "module",
435
- /* XS_TOKEN_MODULO */ "%",
436
- /* XS_TOKEN_MODULO_ASSIGN */ "%=",
437
- /* XS_TOKEN_MORE */ ">",
438
- /* XS_TOKEN_MORE_EQUAL */ ">=",
439
- /* XS_TOKEN_MULTIPLY */ "*",
440
- /* XS_TOKEN_MULTIPLY_ASSIGN */ "*=",
441
- /* XS_TOKEN_NEW */ "new",
442
- /* XS_TOKEN_NOT */ "!",
443
- /* XS_TOKEN_NOT_EQUAL */ "!=",
444
- /* XS_TOKEN_NULL */ "null",
445
- /* XS_TOKEN_NUMBER */ "number",
446
- /* XS_TOKEN_OBJECT */ "object",
447
- /* XS_TOKEN_OBJECT_BINDING */ "object_binding",
448
- /* XS_TOKEN_OPTION */ "?.",
449
- /* XS_TOKEN_OR */ "||",
450
- /* XS_TOKEN_OR_ASSIGN */ "||=",
451
- /* XS_TOKEN_PACKAGE */ "package",
452
- /* XS_TOKEN_PARAMS */ "params",
453
- /* XS_TOKEN_PARAMS_BINDING */ "params_binding",
454
- /* XS_TOKEN_PLUS */ "plus",
455
- /* XS_TOKEN_PRIVATE */ "private",
456
- /* XS_TOKEN_PRIVATE_IDENTIFIER */ "private_identifier",
457
- /* XS_TOKEN_PRIVATE_MEMBER */ "private_member",
458
- /* XS_TOKEN_PRIVATE_PROPERTY */ "private_property",
459
- /* XS_TOKEN_PROGRAM */ "program",
460
- /* XS_TOKEN_PROPERTY */ "property",
461
- /* XS_TOKEN_PROPERTY_AT */ "property_at",
462
- /* XS_TOKEN_PROPERTY_BINDING */ "property_binding",
463
- /* XS_TOKEN_PROPERTY_BINDING_AT */ "property_binding_at",
464
- /* XS_TOKEN_PROTECTED */ "protected",
465
- /* XS_TOKEN_PUBLIC */ "public",
466
- /* XS_TOKEN_QUESTION_MARK */ "?",
467
- /* XS_TOKEN_REGEXP */ "regexp",
468
- /* XS_TOKEN_REST_BINDING */ "rest_binding",
469
- /* XS_TOKEN_RETURN */ "return",
470
- /* XS_TOKEN_RIGHT_BRACE */ "}",
471
- /* XS_TOKEN_RIGHT_BRACKET */ "]",
472
- /* XS_TOKEN_RIGHT_PARENTHESIS */ ")",
473
- /* XS_TOKEN_SEMICOLON */ ";",
474
- /* XS_TOKEN_SETTER */ "setter",
475
- /* XS_TOKEN_SHORT */ "short",
476
- /* XS_TOKEN_SIGNED_RIGHT_SHIFT */ ">>",
477
- /* XS_TOKEN_SIGNED_RIGHT_SHIFT_ASSIGN */ ">>=",
478
- /* XS_TOKEN_SKIP_BINDING */ "skip_binding",
479
- /* XS_TOKEN_SPECIFIER */ "specifier",
480
- /* XS_TOKEN_SPREAD */ "...",
481
- /* XS_TOKEN_STATEMENT */ "statement",
482
- /* XS_TOKEN_STATEMENTS */ "statements",
483
- /* XS_TOKEN_STATIC */ "static",
484
- /* XS_TOKEN_STRICT_EQUAL */ "===",
485
- /* XS_TOKEN_STRICT_NOT_EQUAL */ "!==",
486
- /* XS_TOKEN_STRING */ "string",
487
- /* XS_TOKEN_SUBTRACT */ "-",
488
- /* XS_TOKEN_SUBTRACT_ASSIGN */ "-=",
489
- /* XS_TOKEN_SUPER */ "super",
490
- /* XS_TOKEN_SWITCH */ "switch",
491
- /* XS_TOKEN_TARGET */ "target",
492
- /* XS_TOKEN_TEMPLATE */ "template",
493
- /* XS_TOKEN_TEMPLATE_HEAD */ "template_head",
494
- /* XS_TOKEN_TEMPLATE_MIDDLE */ "template_middle",
495
- /* XS_TOKEN_TEMPLATE_TAIL */ "template_tail",
496
- /* XS_TOKEN_THIS */ "this",
497
- /* XS_TOKEN_THROW */ "throw",
498
- /* XS_TOKEN_TRUE */ "true",
499
- /* XS_TOKEN_TRY */ "try",
500
- /* XS_TOKEN_TYPEOF */ "typeof",
501
- /* XS_TOKEN_UNDEFINED */ "undefined",
502
- /* XS_TOKEN_UNSIGNED_RIGHT_SHIFT */ ">>>",
503
- /* XS_TOKEN_UNSIGNED_RIGHT_SHIFT_ASSIGN */ ">>>=",
504
- /* XS_TOKEN_VAR */ "var",
505
- /* XS_TOKEN_VOID */ "void",
506
- /* XS_TOKEN_WHILE */ "while",
507
- /* XS_TOKEN_WITH */ "with",
508
- /* XS_TOKEN_YIELD */ "yield",
509
- };
510
-
511
- txBoolean fxIsKeyword(txParser* parser, txSymbol* keyword)
512
- {
513
- txBoolean result = ((parser->token == XS_TOKEN_IDENTIFIER) && (parser->symbol == keyword)) ? 1 : 0;
514
- if (result) {
515
- if (parser->escaped)
516
- fxReportParserError(parser, parser->line, "escaped keyword");
517
- }
518
- return result;
519
- }
520
-
521
- txBoolean fxIsToken(txParser* parser, txToken theToken)
522
- {
523
- txBoolean result = (parser->token == theToken) ? 1 : 0;
524
- if (result) {
525
- if (parser->escaped)
526
- fxReportParserError(parser, parser->line, "escaped keyword");
527
- }
528
- return result;
529
- }
530
-
531
- void fxMatchToken(txParser* parser, txToken theToken)
532
- {
533
- if (parser->token == theToken) {
534
- if (parser->escaped)
535
- fxReportParserError(parser, parser->line, "escaped keyword");
536
- fxGetNextToken(parser);
537
- }
538
- else
539
- fxReportParserError(parser, parser->line, "missing %s", gxTokenNames[theToken]);
540
- }
541
-
542
- txNode* fxPopNode(txParser* parser)
543
- {
544
- txNode* node = parser->root;
545
- parser->root = node->next;
546
- node->next = NULL;
547
- parser->nodeCount--;
548
- return node;
549
- }
550
-
551
- void fxPushNode(txParser* parser, txNode* node)
552
- {
553
- node->next = parser->root;
554
- parser->root = (txNode*)node;
555
- parser->nodeCount++;
556
- }
557
-
558
- void fxPushBigIntNode(txParser* parser, txBigInt* value, txInteger line)
559
- {
560
- txBigIntNode* node = fxNewParserChunk(parser, sizeof(txBigIntNode));
561
- node->description = &gxTokenDescriptions[XS_TOKEN_BIGINT];
562
- node->path = parser->path;
563
- node->line = line;
564
- node->flags = 0;
565
- node->value = *value;
566
- fxPushNode(parser, (txNode*)node);
567
- }
568
-
569
- void fxPushIndexNode(txParser* parser, txIndex value, txInteger line)
570
- {
571
- if (((txInteger)value) >= 0)
572
- fxPushIntegerNode(parser, (txInteger)value, line);
573
- else
574
- fxPushNumberNode(parser, value, line);
575
- }
576
-
577
- void fxPushIntegerNode(txParser* parser, txInteger value, txInteger line)
578
- {
579
- txIntegerNode* node = fxNewParserChunk(parser, sizeof(txIntegerNode));
580
- node->description = &gxTokenDescriptions[XS_TOKEN_INTEGER];
581
- node->path = parser->path;
582
- node->line = line;
583
- node->flags = 0;
584
- node->value = value;
585
- fxPushNode(parser, (txNode*)node);
586
- }
587
-
588
- void fxPushNodeStruct(txParser* parser, txInteger count, txToken token, txInteger line)
589
- {
590
- const txNodeDescription* description = &gxTokenDescriptions[token];
591
- txNode* node;
592
- if ((count > parser->nodeCount) || ((sizeof(txNode) + (count * sizeof(txNode*))) > (size_t)(description->size))) {
593
- fxReportParserError(parser, parser->line, "invalid %s", gxTokenNames[token]);
594
- }
595
- node = fxNewParserChunkClear(parser, description->size);
596
- node->description = description;
597
- node->flags |= parser->flags & (mxStrictFlag | mxGeneratorFlag | mxAsyncFlag);
598
- node->path = parser->path;
599
- node->line = line;
600
- parser->nodeCount -= count;
601
- if (count) {
602
- txNode** dst = (txNode**)&node[1];
603
- txNode* src = parser->root;
604
- while (count) {
605
- txNode* next = src->next;
606
- src->next = NULL;
607
- count--;
608
- if (src->description)
609
- dst[count] = src;
610
- else if (src->path)
611
- dst[count] = (txNode*)(src->path);
612
- src = next;
613
- }
614
- parser->root = src;
615
- }
616
- fxPushNode(parser, node);
617
- }
618
-
619
- void fxPushNodeList(txParser* parser, txInteger count)
620
- {
621
- txNodeList* list = fxNewParserChunk(parser, sizeof(txNodeList));
622
- txNode* previous = NULL;
623
- txNode* current = parser->root;
624
- txNode* next;
625
- parser->nodeCount -= count;
626
- list->length = count;
627
- while (count) {
628
- next = current->next;
629
- current->next = previous;
630
- previous = current;
631
- current = next;
632
- count--;
633
- }
634
- parser->root = current;
635
- list->description = &gxTokenDescriptions[XS_NO_TOKEN];
636
- list->first = previous;
637
- fxPushNode(parser, (txNode*)list);
638
- }
639
-
640
- void fxPushNULL(txParser* parser)
641
- {
642
- txNodeLink* node = fxNewParserChunkClear(parser, sizeof(txNodeLink));
643
- fxPushNode(parser, (txNode*)node);
644
- }
645
-
646
- void fxPushNumberNode(txParser* parser, txNumber value, txInteger line)
647
- {
648
- txNumberNode* node = fxNewParserChunk(parser, sizeof(txNumberNode));
649
- node->description = &gxTokenDescriptions[XS_TOKEN_NUMBER];
650
- node->path = parser->path;
651
- node->line = line;
652
- node->flags = 0;
653
- node->value = value;
654
- fxPushNode(parser, (txNode*)node);
655
- }
656
-
657
- void fxPushRawNode(txParser* parser, txInteger length, txString value, txInteger line)
658
- {
659
- txStringNode* node = fxNewParserChunk(parser, sizeof(txStringNode));
660
- node->description = &gxTokenDescriptions[XS_TOKEN_STRING];
661
- node->path = parser->path;
662
- node->line = line;
663
- node->flags = 0;
664
- node->length = length;
665
- node->value = value;
666
- fxPushNode(parser, (txNode*)node);
667
- }
668
-
669
- void fxPushStringNode(txParser* parser, txInteger length, txString value, txInteger line)
670
- {
671
- txStringNode* node = fxNewParserChunk(parser, sizeof(txStringNode));
672
- node->description = &gxTokenDescriptions[XS_TOKEN_STRING];
673
- node->path = parser->path;
674
- node->line = line;
675
- node->flags = parser->escaped;
676
- node->length = length;
677
- node->value = value;
678
- fxPushNode(parser, (txNode*)node);
679
- }
680
-
681
- void fxPushSymbol(txParser* parser, txSymbol* symbol)
682
- {
683
- txNodeLink* node = fxNewParserChunkClear(parser, sizeof(txNodeLink));
684
- node->symbol = symbol;
685
- fxPushNode(parser, (txNode*)node);
686
- }
687
-
688
- void fxSwapNodes(txParser* parser)
689
- {
690
- txNode* previous = parser->root;
691
- txNode* current = previous->next;
692
- previous->next = current->next;
693
- current->next = previous;
694
- parser->root = current;
695
- }
696
-
697
- void fxModule(txParser* parser)
698
- {
699
- txInteger aCount = parser->nodeCount;
700
- txInteger aLine = parser->line;
701
- while ((parser->token != XS_TOKEN_EOF)) {
702
- if (parser->token == XS_TOKEN_EXPORT)
703
- fxExport(parser);
704
- else if (parser->token == XS_TOKEN_IMPORT) {
705
- fxGetNextToken2(parser);
706
- if ((parser->token2 == XS_TOKEN_DOT) || (parser->token2 == XS_TOKEN_LEFT_PARENTHESIS))
707
- fxStatement(parser, 1);
708
- else
709
- fxImport(parser);
710
- }
711
- else if (parser->token == XS_TOKEN_RETURN) {
712
- fxReportParserError(parser, parser->line, "invalid return");
713
- fxGetNextToken(parser);
714
- }
715
- else if (parser->token == XS_TOKEN_YIELD) {
716
- fxReportParserError(parser, parser->line, "invalid yield");
717
- fxGetNextToken(parser);
718
- }
719
- else {
720
- fxStatement(parser, 1);
721
- }
722
- }
723
- aCount = parser->nodeCount - aCount;
724
- if (aCount > 1) {
725
- fxPushNodeList(parser, aCount);
726
- fxPushNodeStruct(parser, 1, XS_TOKEN_STATEMENTS, aLine);
727
- }
728
- else if (aCount == 0) {
729
- fxPushNodeStruct(parser, 0, XS_TOKEN_UNDEFINED, aLine);
730
- fxPushNodeStruct(parser, 1, XS_TOKEN_STATEMENT, aLine);
731
- }
732
- fxPushNodeStruct(parser, 1, XS_TOKEN_MODULE, aLine);
733
- parser->root->flags = parser->flags & (mxStrictFlag | mxAwaitingFlag);
734
- }
735
-
736
- void fxExport(txParser* parser)
737
- {
738
- txSymbol* symbol = C_NULL;
739
- txInteger count;
740
- txInteger line = parser->line;
741
- txUnsigned flag = 0;
742
- txToken aToken;
743
- fxMatchToken(parser, XS_TOKEN_EXPORT);
744
- switch (parser->token) {
745
- case XS_TOKEN_MULTIPLY:
746
- fxPushNULL(parser);
747
- fxGetNextToken(parser);
748
- if (fxIsKeyword(parser, parser->asSymbol)) {
749
- fxGetNextToken(parser);
750
- if (gxTokenFlags[parser->token] & XS_TOKEN_IDENTIFIER_NAME) {
751
- fxPushSymbol(parser, parser->symbol);
752
- fxGetNextToken(parser);
753
- }
754
- else {
755
- fxPushNULL(parser);
756
- fxReportParserError(parser, parser->line, "missing identifier");
757
- }
758
- }
759
- else {
760
- fxPushNULL(parser);
761
- }
762
- if (fxIsKeyword(parser, parser->fromSymbol)) {
763
- fxGetNextToken(parser);
764
- if (parser->token == XS_TOKEN_STRING) {
765
- fxPushNodeStruct(parser, 2, XS_TOKEN_SPECIFIER, line);
766
- fxPushNodeList(parser, 1);
767
- fxPushStringNode(parser, parser->stringLength, parser->string, line);
768
- fxPushNodeStruct(parser, 2, XS_TOKEN_EXPORT, line);
769
- fxGetNextToken(parser);
770
- fxSemicolon(parser);
771
- }
772
- else
773
- fxReportParserError(parser, parser->line, "missing module");
774
- }
775
- else
776
- fxReportParserError(parser, parser->line, "missing from");
777
- break;
778
- case XS_TOKEN_DEFAULT:
779
- fxMatchToken(parser, XS_TOKEN_DEFAULT);
780
- if (parser->flags & mxDefaultFlag)
781
- fxReportParserError(parser, parser->line, "invalid default");
782
- parser->flags |= mxDefaultFlag;
783
- if (parser->token == XS_TOKEN_CLASS) {
784
- fxClassExpression(parser, line, &symbol);
785
- if (symbol)
786
- fxPushSymbol(parser, symbol);
787
- else
788
- fxPushSymbol(parser, parser->defaultSymbol);
789
- fxPushNodeStruct(parser, 1, XS_TOKEN_LET, line);
790
- fxSwapNodes(parser);
791
- fxPushNodeStruct(parser, 2, XS_TOKEN_BINDING, line);
792
- }
793
- else if (parser->token == XS_TOKEN_FUNCTION) {
794
- again:
795
- fxMatchToken(parser, XS_TOKEN_FUNCTION);
796
- if (parser->token == XS_TOKEN_MULTIPLY) {
797
- fxGetNextToken(parser);
798
- fxGeneratorExpression(parser, line, &symbol, flag);
799
- }
800
- else
801
- fxFunctionExpression(parser, line, &symbol, flag);
802
- if (symbol) {
803
- txDefineNode* node = fxDefineNodeNew(parser, XS_TOKEN_DEFINE, symbol);
804
- node->initializer = fxPopNode(parser);
805
- fxPushNode(parser, (txNode*)node);
806
- }
807
- else {
808
- txDefineNode* node = fxDefineNodeNew(parser, XS_TOKEN_DEFINE, parser->defaultSymbol);
809
- node->initializer = fxPopNode(parser);
810
- fxPushNode(parser, (txNode*)node);
811
- }
812
- }
813
- else {
814
- if ((parser->token == XS_TOKEN_IDENTIFIER) && (parser->symbol == parser->asyncSymbol) && (!parser->escaped)) {
815
- fxGetNextToken2(parser);
816
- if ((!parser->crlf2) && (parser->token2 == XS_TOKEN_FUNCTION)) {
817
- fxGetNextToken(parser);
818
- flag = mxAsyncFlag;
819
- goto again;
820
- }
821
- }
822
- fxAssignmentExpression(parser);
823
- fxSemicolon(parser);
824
- fxPushSymbol(parser, parser->defaultSymbol);
825
- fxPushNULL(parser);
826
- fxPushNodeStruct(parser, 2, XS_TOKEN_CONST, line);
827
- fxSwapNodes(parser);
828
- fxPushNodeStruct(parser, 2, XS_TOKEN_ASSIGN, line);
829
- fxPushNodeStruct(parser, 1, XS_TOKEN_STATEMENT, line);
830
- }
831
- if (symbol) {
832
- fxPushSymbol(parser, symbol);
833
- fxPushSymbol(parser, parser->defaultSymbol);
834
- }
835
- else {
836
- fxPushSymbol(parser, parser->defaultSymbol);
837
- fxPushNULL(parser);
838
- }
839
- fxPushNodeStruct(parser, 2, XS_TOKEN_SPECIFIER, line);
840
- fxPushNodeList(parser, 1);
841
- fxPushNULL(parser);
842
- fxPushNodeStruct(parser, 2, XS_TOKEN_EXPORT, line);
843
- break;
844
- case XS_TOKEN_CLASS:
845
- fxClassExpression(parser, line, &symbol);
846
- if (symbol) {
847
- fxPushSymbol(parser, symbol);
848
- fxPushNodeStruct(parser, 1, XS_TOKEN_LET, line);
849
- fxSwapNodes(parser);
850
- fxPushNodeStruct(parser, 2, XS_TOKEN_BINDING, line);
851
-
852
- fxPushSymbol(parser, symbol);
853
- fxPushNULL(parser);
854
- fxPushNodeStruct(parser, 2, XS_TOKEN_SPECIFIER, line);
855
- fxPushNodeList(parser, 1);
856
- fxPushNULL(parser);
857
- fxPushNodeStruct(parser, 2, XS_TOKEN_EXPORT, line);
858
- }
859
- else
860
- fxReportParserError(parser, parser->line, "missing identifier");
861
- break;
862
- case XS_TOKEN_FUNCTION:
863
- again2:
864
- fxMatchToken(parser, XS_TOKEN_FUNCTION);
865
- if (parser->token == XS_TOKEN_MULTIPLY) {
866
- fxGetNextToken(parser);
867
- fxGeneratorExpression(parser, line, &symbol, flag);
868
- }
869
- else
870
- fxFunctionExpression(parser, line, &symbol, flag);
871
- if (symbol) {
872
- txDefineNode* node = fxDefineNodeNew(parser, XS_TOKEN_DEFINE, symbol);
873
- node->initializer = fxPopNode(parser);
874
- fxPushNode(parser, (txNode*)node);
875
- fxPushSymbol(parser, symbol);
876
- fxPushNULL(parser);
877
- fxPushNodeStruct(parser, 2, XS_TOKEN_SPECIFIER, line);
878
- fxPushNodeList(parser, 1);
879
- fxPushNULL(parser);
880
- fxPushNodeStruct(parser, 2, XS_TOKEN_EXPORT, line);
881
- }
882
- else
883
- fxReportParserError(parser, parser->line, "missing identifier");
884
- break;
885
- case XS_TOKEN_CONST:
886
- case XS_TOKEN_LET:
887
- case XS_TOKEN_VAR:
888
- aToken = parser->token;
889
- fxVariableStatement(parser, aToken);
890
- count = parser->nodeCount;
891
- fxExportBinding(parser, parser->root);
892
- fxPushNodeList(parser, parser->nodeCount - count);
893
- fxPushNULL(parser);
894
- fxPushNodeStruct(parser, 2, XS_TOKEN_EXPORT, line);
895
- fxSemicolon(parser);
896
- break;
897
- case XS_TOKEN_LEFT_BRACE:
898
- count = parser->nodeCount;
899
- fxSpecifiers(parser);
900
- fxPushNodeList(parser, parser->nodeCount - count);
901
- if (fxIsKeyword(parser, parser->fromSymbol)) {
902
- fxGetNextToken(parser);
903
- if (parser->token == XS_TOKEN_STRING) {
904
- fxPushStringNode(parser, parser->stringLength, parser->string, line);
905
- fxGetNextToken(parser);
906
- }
907
- else {
908
- fxPushNULL(parser);
909
- fxReportParserError(parser, parser->line, "missing module");
910
- }
911
- }
912
- else
913
- fxPushNULL(parser);
914
- fxPushNodeStruct(parser, 2, XS_TOKEN_EXPORT, line);
915
- fxSemicolon(parser);
916
- break;
917
- default:
918
- if ((parser->token == XS_TOKEN_IDENTIFIER) && (parser->symbol == parser->asyncSymbol) && (!parser->escaped)) {
919
- fxGetNextToken2(parser);
920
- if ((!parser->crlf2) && (parser->token2 == XS_TOKEN_FUNCTION)) {
921
- fxGetNextToken(parser);
922
- flag = mxAsyncFlag;
923
- goto again2;
924
- }
925
- }
926
- fxReportParserError(parser, parser->line, "invalid export %s", gxTokenNames[parser->token]);
927
- fxGetNextToken(parser);
928
- break;
929
- }
930
- }
931
-
932
- void fxExportBinding(txParser* parser, txNode* node)
933
- {
934
- txToken token = node->description->token;
935
- if ((token == XS_TOKEN_CONST) || (token == XS_TOKEN_LET) || (token == XS_TOKEN_VAR)) {
936
- fxPushSymbol(parser, ((txDeclareNode*)node)->symbol);
937
- fxPushNULL(parser);
938
- fxPushNodeStruct(parser, 2, XS_TOKEN_SPECIFIER, node->line);
939
- }
940
- else if (token == XS_TOKEN_BINDING) {
941
- fxExportBinding(parser, ((txBindingNode*)node)->target);
942
- }
943
- else if (token == XS_TOKEN_ARRAY_BINDING) {
944
- node = ((txArrayBindingNode*)node)->items->first;
945
- while (node) {
946
- fxExportBinding(parser, node);
947
- node = node->next;
948
- }
949
- }
950
- else if (token == XS_TOKEN_OBJECT_BINDING) {
951
- node = ((txObjectBindingNode*)node)->items->first;
952
- while (node) {
953
- fxExportBinding(parser, node);
954
- node = node->next;
955
- }
956
- }
957
- else if (token == XS_TOKEN_PROPERTY_BINDING)
958
- fxExportBinding(parser, ((txPropertyBindingNode*)node)->binding);
959
- else if (token == XS_TOKEN_PROPERTY_BINDING_AT)
960
- fxExportBinding(parser, ((txPropertyBindingAtNode*)node)->binding);
961
- else if (token == XS_TOKEN_REST_BINDING)
962
- fxExportBinding(parser, ((txRestBindingNode*)node)->binding);
963
- else if (token == XS_TOKEN_STATEMENTS) {
964
- node = ((txStatementsNode*)node)->items->first;
965
- while (node) {
966
- fxExportBinding(parser, node);
967
- node = node->next;
968
- }
969
- }
970
- }
971
-
972
-
973
- void fxImport(txParser* parser)
974
- {
975
- txBoolean asFlag = 1;
976
- txBoolean fromFlag = 0;
977
- txInteger count = parser->nodeCount;
978
- fxMatchToken(parser, XS_TOKEN_IMPORT);
979
- if (parser->token == XS_TOKEN_IDENTIFIER) {
980
- fxPushSymbol(parser, parser->defaultSymbol);
981
- fxPushSymbol(parser, parser->symbol);
982
- fxPushNodeStruct(parser, 2, XS_TOKEN_SPECIFIER, parser->line);
983
- fxGetNextToken(parser);
984
- if (parser->token == XS_TOKEN_COMMA)
985
- fxGetNextToken(parser);
986
- else
987
- asFlag = 0;
988
- fromFlag = 1;
989
- }
990
- if (asFlag) {
991
- if (parser->token == XS_TOKEN_MULTIPLY) {
992
- fxGetNextToken(parser);
993
- if (fxIsKeyword(parser, parser->asSymbol)) {
994
- fxGetNextToken(parser);
995
- if (parser->token == XS_TOKEN_IDENTIFIER) {
996
- fxPushNULL(parser);
997
- fxPushSymbol(parser, parser->symbol);
998
- fxPushNodeStruct(parser, 2, XS_TOKEN_SPECIFIER, parser->line);
999
- fxGetNextToken(parser);
1000
- }
1001
- else {
1002
- fxReportParserError(parser, parser->line, "missing identifier");
1003
- }
1004
- }
1005
- else {
1006
- fxReportParserError(parser, parser->line, "missing as");
1007
- }
1008
- fromFlag = 1;
1009
- }
1010
- else if (parser->token == XS_TOKEN_LEFT_BRACE) {
1011
- fxSpecifiers(parser);
1012
- fromFlag = 1;
1013
- }
1014
- }
1015
- fxPushNodeList(parser, parser->nodeCount - count);
1016
- if (fromFlag) {
1017
- if (fxIsKeyword(parser, parser->fromSymbol)) {
1018
- fxGetNextToken(parser);
1019
- if (parser->token == XS_TOKEN_STRING) {
1020
- fxPushStringNode(parser, parser->stringLength, parser->string, parser->line);
1021
- fxGetNextToken(parser);
1022
- }
1023
- else {
1024
- fxPushNULL(parser);
1025
- fxReportParserError(parser, parser->line, "missing module");
1026
- }
1027
- }
1028
- else {
1029
- fxPushNULL(parser);
1030
- fxReportParserError(parser, parser->line, "missing from");
1031
- }
1032
- }
1033
- else if (parser->token == XS_TOKEN_STRING) {
1034
- fxPushStringNode(parser, parser->stringLength, parser->string, parser->line);
1035
- fxGetNextToken(parser);
1036
- }
1037
- else {
1038
- fxPushNULL(parser);
1039
- fxReportParserError(parser, parser->line, "missing module");
1040
- }
1041
- fxPushNodeStruct(parser, 2, XS_TOKEN_IMPORT, parser->line);
1042
- fxSemicolon(parser);
1043
- }
1044
-
1045
- void fxSpecifiers(txParser* parser)
1046
- {
1047
- txInteger aCount = 0;
1048
- fxMatchToken(parser, XS_TOKEN_LEFT_BRACE);
1049
- while (gxTokenFlags[parser->token] & XS_TOKEN_IDENTIFIER_NAME) {
1050
- fxPushSymbol(parser, parser->symbol);
1051
- fxGetNextToken(parser);
1052
- if (fxIsKeyword(parser, parser->asSymbol)) {
1053
- fxGetNextToken(parser);
1054
- if (gxTokenFlags[parser->token] & XS_TOKEN_IDENTIFIER_NAME) {
1055
- fxPushSymbol(parser, parser->symbol);
1056
- fxGetNextToken(parser);
1057
- }
1058
- else {
1059
- fxPushNULL(parser);
1060
- fxReportParserError(parser, parser->line, "missing identifier");
1061
- }
1062
- }
1063
- else
1064
- fxPushNULL(parser);
1065
- fxPushNodeStruct(parser, 2, XS_TOKEN_SPECIFIER, parser->line);
1066
- aCount++;
1067
- if (parser->token != XS_TOKEN_COMMA)
1068
- break;
1069
- fxGetNextToken(parser);
1070
- }
1071
- fxMatchToken(parser, XS_TOKEN_RIGHT_BRACE);
1072
- }
1073
-
1074
- void fxProgram(txParser* parser)
1075
- {
1076
- txInteger count = parser->nodeCount;
1077
- txInteger line = parser->line;
1078
- txNode* node;
1079
- while (parser->token != XS_TOKEN_EOF) {
1080
- fxStatement(parser, 1);
1081
- node = parser->root;
1082
- if (!node || !node->description || (node->description->token != XS_TOKEN_STATEMENT))
1083
- break;
1084
- node = ((txStatementNode*)node)->expression;
1085
- if (!node || !node->description || (node->description->token != XS_TOKEN_STRING))
1086
- break;
1087
- if (!(node->flags & mxStringEscapeFlag) && (c_strcmp(((txStringNode*)node)->value, "use strict") == 0)) {
1088
- if (!(parser->flags & mxStrictFlag)) {
1089
- parser->flags |= mxStrictFlag;
1090
- if (parser->token == XS_TOKEN_IDENTIFIER)
1091
- fxCheckStrictKeyword(parser);
1092
- }
1093
- }
1094
- }
1095
- while (parser->token != XS_TOKEN_EOF) {
1096
- fxStatement(parser, 1);
1097
- }
1098
- count = parser->nodeCount - count;
1099
- if (count > 1) {
1100
- fxPushNodeList(parser, count);
1101
- fxPushNodeStruct(parser, 1, XS_TOKEN_STATEMENTS, line);
1102
- }
1103
- else if (count == 0) {
1104
- fxPushNodeStruct(parser, 0, XS_TOKEN_UNDEFINED, line);
1105
- fxPushNodeStruct(parser, 1, XS_TOKEN_STATEMENT, line);
1106
- }
1107
- fxPushNodeStruct(parser, 1, XS_TOKEN_PROGRAM, line);
1108
- if (parser->flags & mxFieldFlag)
1109
- if (parser->flags & mxArgumentsFlag)
1110
- fxReportParserError(parser, parser->line, "invalid arguments");
1111
- parser->root->flags = parser->flags & mxStrictFlag;
1112
- }
1113
-
1114
- void fxBody(txParser* parser)
1115
- {
1116
- txInteger count = parser->nodeCount;
1117
- txInteger line = parser->line;
1118
- txNode* node;
1119
- fxCheckParserStack(parser, line);
1120
- while ((parser->token != XS_TOKEN_EOF) && (parser->token != XS_TOKEN_RIGHT_BRACE)) {
1121
- fxStatement(parser, 1);
1122
- node = parser->root;
1123
- if (!node || !node->description || (node->description->token != XS_TOKEN_STATEMENT))
1124
- break;
1125
- node = ((txStatementNode*)node)->expression;
1126
- if (!node || !node->description || (node->description->token != XS_TOKEN_STRING))
1127
- break;
1128
- if (!(node->flags & mxStringEscapeFlag) && (c_strcmp(((txStringNode*)node)->value, "use strict") == 0)) {
1129
- if (parser->flags & mxNotSimpleParametersFlag)
1130
- fxReportParserError(parser, parser->line, "invalid directive");
1131
- if (!(parser->flags & mxStrictFlag)) {
1132
- parser->flags |= mxStrictFlag;
1133
- if (parser->token == XS_TOKEN_IDENTIFIER)
1134
- fxCheckStrictKeyword(parser);
1135
- }
1136
- }
1137
- }
1138
- while ((parser->token != XS_TOKEN_EOF) && (parser->token != XS_TOKEN_RIGHT_BRACE)) {
1139
- fxStatement(parser, 1);
1140
- }
1141
- count = parser->nodeCount - count;
1142
- if (count > 1) {
1143
- fxPushNodeList(parser, count);
1144
- fxPushNodeStruct(parser, 1, XS_TOKEN_STATEMENTS, line);
1145
- }
1146
- else if (count == 0) {
1147
- fxPushNodeStruct(parser, 0, XS_TOKEN_UNDEFINED, line);
1148
- fxPushNodeStruct(parser, 1, XS_TOKEN_STATEMENT, line);
1149
- }
1150
- }
1151
-
1152
- void fxBlock(txParser* parser)
1153
- {
1154
- txInteger aLine = parser->line;
1155
- fxCheckParserStack(parser, aLine);
1156
- fxMatchToken(parser, XS_TOKEN_LEFT_BRACE);
1157
- fxStatements(parser);
1158
- fxMatchToken(parser, XS_TOKEN_RIGHT_BRACE);
1159
- fxPushNodeStruct(parser, 1, XS_TOKEN_BLOCK, aLine);
1160
- }
1161
-
1162
- void fxStatements(txParser* parser)
1163
- {
1164
- txInteger count = parser->nodeCount;
1165
- txInteger line = parser->line;
1166
- while ((parser->token != XS_TOKEN_EOF) && (parser->token != XS_TOKEN_RIGHT_BRACE)) {
1167
- fxStatement(parser, 1);
1168
- }
1169
- count = parser->nodeCount - count;
1170
- fxPushNodeList(parser, count);
1171
- fxPushNodeStruct(parser, 1, XS_TOKEN_STATEMENTS, line);
1172
- }
1173
-
1174
- void fxStatement(txParser* parser, txBoolean blockIt)
1175
- {
1176
- txInteger line = parser->line;
1177
- txSymbol* symbol = C_NULL;
1178
- txUnsigned flag = 0;
1179
- switch (parser->token) {
1180
- // case XS_TOKEN_COMMA:
1181
- case XS_TOKEN_SEMICOLON:
1182
- fxGetNextToken(parser);
1183
- if (!blockIt) {
1184
- fxPushNodeStruct(parser, 0, XS_TOKEN_UNDEFINED, line);
1185
- fxPushNodeStruct(parser, 1, XS_TOKEN_STATEMENT, line);
1186
- }
1187
- break;
1188
- case XS_TOKEN_BREAK:
1189
- fxBreakStatement(parser);
1190
- fxSemicolon(parser);
1191
- break;
1192
- case XS_TOKEN_CLASS:
1193
- if (!blockIt)
1194
- fxReportParserError(parser, parser->line, "no block");
1195
- fxClassExpression(parser, line, &symbol);
1196
- if (symbol) {
1197
- fxPushSymbol(parser, symbol);
1198
- fxPushNodeStruct(parser, 1, XS_TOKEN_LET, line);
1199
- fxSwapNodes(parser);
1200
- fxPushNodeStruct(parser, 2, XS_TOKEN_BINDING, line);
1201
- }
1202
- else
1203
- fxReportParserError(parser, parser->line, "missing identifier");
1204
- break;
1205
- case XS_TOKEN_CONST:
1206
- if (!blockIt)
1207
- fxReportParserError(parser, parser->line, "no block");
1208
- fxVariableStatement(parser, XS_TOKEN_CONST);
1209
- fxSemicolon(parser);
1210
- break;
1211
- case XS_TOKEN_CONTINUE:
1212
- fxContinueStatement(parser);
1213
- fxSemicolon(parser);
1214
- break;
1215
- case XS_TOKEN_DEBUGGER:
1216
- fxDebuggerStatement(parser);
1217
- fxSemicolon(parser);
1218
- break;
1219
- case XS_TOKEN_DO:
1220
- fxDoStatement(parser);
1221
- break;
1222
- case XS_TOKEN_FOR:
1223
- fxForStatement(parser);
1224
- break;
1225
- case XS_TOKEN_FUNCTION:
1226
- //if ((parser->flags & mxStrictFlag) && !blockIt) BROWSER
1227
- again:
1228
- if (!blockIt)
1229
- fxReportParserError(parser, parser->line, "no block (strict code)");
1230
- fxMatchToken(parser, XS_TOKEN_FUNCTION);
1231
- if (parser->token == XS_TOKEN_MULTIPLY) {
1232
- fxGetNextToken(parser);
1233
- fxGeneratorExpression(parser, line, &symbol, flag);
1234
- }
1235
- else
1236
- fxFunctionExpression(parser, line, &symbol, flag);
1237
- if (symbol) {
1238
- txDefineNode* node = fxDefineNodeNew(parser, XS_TOKEN_DEFINE, symbol);
1239
- node->initializer = fxPopNode(parser);
1240
- fxPushNode(parser, (txNode*)node);
1241
- }
1242
- else
1243
- fxReportParserError(parser, parser->line, "missing identifier");
1244
- break;
1245
- case XS_TOKEN_IF:
1246
- fxIfStatement(parser);
1247
- break;
1248
- case XS_TOKEN_RETURN:
1249
- if (!(parser->flags & (mxArrowFlag | mxFunctionFlag | mxGeneratorFlag)))
1250
- fxReportParserError(parser, parser->line, "invalid return");
1251
- fxReturnStatement(parser);
1252
- fxSemicolon(parser);
1253
- break;
1254
- case XS_TOKEN_LEFT_BRACE:
1255
- fxBlock(parser);
1256
- break;
1257
- case XS_TOKEN_LET:
1258
- if (!blockIt)
1259
- fxReportParserError(parser, parser->line, "no block");
1260
- fxVariableStatement(parser, XS_TOKEN_LET);
1261
- fxSemicolon(parser);
1262
- break;
1263
- case XS_TOKEN_SWITCH:
1264
- fxSwitchStatement(parser);
1265
- break;
1266
- case XS_TOKEN_THROW:
1267
- fxThrowStatement(parser);
1268
- fxSemicolon(parser);
1269
- break;
1270
- case XS_TOKEN_TRY:
1271
- fxTryStatement(parser);
1272
- break;
1273
- case XS_TOKEN_VAR:
1274
- fxVariableStatement(parser, XS_TOKEN_VAR);
1275
- fxSemicolon(parser);
1276
- break;
1277
- case XS_TOKEN_WHILE:
1278
- fxWhileStatement(parser);
1279
- break;
1280
- case XS_TOKEN_WITH:
1281
- if (parser->flags & mxStrictFlag)
1282
- fxReportParserError(parser, parser->line, "with (strict code)");
1283
- fxWithStatement(parser);
1284
- break;
1285
- case XS_TOKEN_IDENTIFIER:
1286
- fxGetNextToken2(parser);
1287
- if (parser->token2 == XS_TOKEN_COLON) {
1288
- fxPushSymbol(parser, parser->symbol);
1289
- fxGetNextToken(parser);
1290
- fxMatchToken(parser, XS_TOKEN_COLON);
1291
- //if ((parser->flags & mxStrictFlag) && (parser->token == XS_TOKEN_FUNCTION)) BROWSER
1292
- // fxReportParserError(parser, parser->line, "labeled function (strict code)");
1293
- if (parser->token == XS_TOKEN_FUNCTION)
1294
- fxReportParserError(parser, parser->line, "labeled function");
1295
- fxCheckParserStack(parser, line);
1296
- fxStatement(parser, 0);
1297
- fxPushNodeStruct(parser, 2, XS_TOKEN_LABEL, line);
1298
- break;
1299
- }
1300
- if ((parser->symbol == parser->asyncSymbol) && (!parser->escaped)
1301
- && (!parser->crlf2) && (parser->token2 == XS_TOKEN_FUNCTION)) {
1302
- fxGetNextToken(parser);
1303
- flag = mxAsyncFlag;
1304
- goto again;
1305
- }
1306
- if ((parser->symbol == parser->letSymbol) && (!parser->escaped)
1307
- && ((gxTokenFlags[parser->token2] & XS_TOKEN_BEGIN_BINDING) || (parser->token2 == XS_TOKEN_AWAIT) || (parser->token2 == XS_TOKEN_YIELD))
1308
- && (blockIt || (!parser->crlf2) || (parser->token2 == XS_TOKEN_LEFT_BRACKET))) {
1309
- parser->token = XS_TOKEN_LET;
1310
- if (!blockIt)
1311
- fxReportParserError(parser, parser->line, "no block");
1312
- fxVariableStatement(parser, XS_TOKEN_LET);
1313
- fxSemicolon(parser);
1314
- break;
1315
- }
1316
- /* continue */
1317
- default:
1318
- if (gxTokenFlags[parser->token] & XS_TOKEN_BEGIN_EXPRESSION) {
1319
- fxCommaExpression(parser);
1320
- fxPushNodeStruct(parser, 1, XS_TOKEN_STATEMENT, line);
1321
- fxSemicolon(parser);
1322
- }
1323
- else {
1324
- fxReportParserError(parser, parser->line, "invalid token %s", gxTokenNames[parser->token]);
1325
- fxPushNULL(parser);
1326
- fxGetNextToken(parser);
1327
- }
1328
- break;
1329
- }
1330
- }
1331
-
1332
- void fxSemicolon(txParser* parser)
1333
- {
1334
- if ((parser->crlf) || (gxTokenFlags[parser->token] & XS_TOKEN_END_STATEMENT)) {
1335
- if (parser->token == XS_TOKEN_SEMICOLON)
1336
- fxGetNextToken(parser);
1337
- }
1338
- else
1339
- fxReportParserError(parser, parser->line, "missing ;");
1340
- }
1341
-
1342
- void fxBreakStatement(txParser* parser)
1343
- {
1344
- txInteger aLine = parser->line;
1345
- fxMatchToken(parser, XS_TOKEN_BREAK);
1346
- if ((!parser->crlf) && (parser->token == XS_TOKEN_IDENTIFIER)) {
1347
- fxPushSymbol(parser, parser->symbol);
1348
- fxGetNextToken(parser);
1349
- }
1350
- else {
1351
- fxPushNULL(parser);
1352
- }
1353
- fxPushNodeStruct(parser, 1, XS_TOKEN_BREAK, aLine);
1354
- }
1355
-
1356
- void fxContinueStatement(txParser* parser)
1357
- {
1358
- txInteger aLine = parser->line;
1359
- fxMatchToken(parser, XS_TOKEN_CONTINUE);
1360
- if ((!parser->crlf) && (parser->token == XS_TOKEN_IDENTIFIER)) {
1361
- fxPushSymbol(parser, parser->symbol);
1362
- fxGetNextToken(parser);
1363
- }
1364
- else {
1365
- fxPushNULL(parser);
1366
- }
1367
- fxPushNodeStruct(parser, 1, XS_TOKEN_CONTINUE, aLine);
1368
- }
1369
-
1370
- void fxDebuggerStatement(txParser* parser)
1371
- {
1372
- txInteger aLine = parser->line;
1373
- fxMatchToken(parser, XS_TOKEN_DEBUGGER);
1374
- fxPushNodeStruct(parser, 0, XS_TOKEN_DEBUGGER, aLine);
1375
- }
1376
-
1377
- void fxDoStatement(txParser* parser)
1378
- {
1379
- txInteger aLine = parser->line;
1380
- fxCheckParserStack(parser, aLine);
1381
- fxPushNULL(parser);
1382
- fxMatchToken(parser, XS_TOKEN_DO);
1383
- fxStatement(parser, 0);
1384
- fxMatchToken(parser, XS_TOKEN_WHILE);
1385
- fxMatchToken(parser, XS_TOKEN_LEFT_PARENTHESIS);
1386
- fxCommaExpression(parser);
1387
- fxMatchToken(parser, XS_TOKEN_RIGHT_PARENTHESIS);
1388
- if (parser->token == XS_TOKEN_SEMICOLON)
1389
- fxGetNextToken(parser);
1390
- fxPushNodeStruct(parser, 2, XS_TOKEN_DO, aLine);
1391
- fxPushNodeStruct(parser, 2, XS_TOKEN_LABEL, aLine);
1392
- }
1393
-
1394
- void fxForStatement(txParser* parser)
1395
- {
1396
- txInteger aLine = parser->line;
1397
- txBoolean awaitFlag = 0;
1398
- txBoolean expressionFlag = 0;
1399
- txToken aToken;
1400
- fxPushNULL(parser);
1401
- fxMatchToken(parser, XS_TOKEN_FOR);
1402
- if (parser->token == XS_TOKEN_AWAIT) {
1403
- awaitFlag = 1;
1404
- fxMatchToken(parser, XS_TOKEN_AWAIT);
1405
- }
1406
- fxMatchToken(parser, XS_TOKEN_LEFT_PARENTHESIS);
1407
- fxGetNextToken2(parser);
1408
- parser->flags |= mxForFlag;
1409
- if (parser->token == XS_TOKEN_SEMICOLON) {
1410
- fxPushNULL(parser);
1411
- }
1412
- else if (parser->token == XS_TOKEN_CONST) {
1413
- fxVariableStatement(parser, XS_TOKEN_CONST);
1414
- }
1415
- else if (parser->token == XS_TOKEN_LET) {
1416
- fxVariableStatement(parser, XS_TOKEN_LET);
1417
- }
1418
- else if (fxIsKeyword(parser, parser->letSymbol) && (gxTokenFlags[parser->token2] & XS_TOKEN_BEGIN_BINDING)) {
1419
- parser->token = XS_TOKEN_LET;
1420
- fxVariableStatement(parser, XS_TOKEN_LET);
1421
- }
1422
- else if (parser->token == XS_TOKEN_VAR) {
1423
- fxVariableStatement(parser, XS_TOKEN_VAR);
1424
- }
1425
- else {
1426
- fxCommaExpression(parser);
1427
- expressionFlag = 1;
1428
- }
1429
- parser->flags &= ~mxForFlag;
1430
- if (awaitFlag && !fxIsKeyword(parser, parser->ofSymbol))
1431
- fxReportParserError(parser, parser->line, "invalid for await");
1432
- if (fxIsToken(parser, XS_TOKEN_IN) || fxIsKeyword(parser, parser->ofSymbol)) {
1433
- if (expressionFlag) {
1434
- if (!fxCheckReference(parser, XS_TOKEN_ASSIGN)) {
1435
- fxReportParserError(parser, parser->line, "no reference");
1436
- }
1437
- }
1438
- else {
1439
- aToken = parser->root->description->token;
1440
- if (aToken == XS_TOKEN_BINDING) {
1441
- if (((txBindingNode*)(parser->root))->initializer)
1442
- fxReportParserError(parser, parser->line, "invalid binding initializer");
1443
- }
1444
- // else if (aToken == XS_TOKEN_ARRAY_BINDING) {
1445
- // if (((txArrayBindingNode*)(parser->root))->initializer)
1446
- // fxReportParserError(parser, parser->line, "invalid array binding initializer");
1447
- // }
1448
- // else if (aToken == XS_TOKEN_OBJECT_BINDING) {
1449
- // if (((txObjectBindingNode*)(parser->root))->initializer)
1450
- // fxReportParserError(parser, parser->line, "invalid object binding initializer");
1451
- // }
1452
- // else
1453
- // fxReportParserError(parser, parser->line, "no reference %s", gxTokenNames[aToken]);
1454
- }
1455
- aToken = parser->token;
1456
- fxGetNextToken(parser);
1457
- if (aToken == XS_TOKEN_IN)
1458
- fxCommaExpression(parser);
1459
- else
1460
- fxAssignmentExpression(parser);
1461
- fxMatchToken(parser, XS_TOKEN_RIGHT_PARENTHESIS);
1462
- fxStatement(parser, 0);
1463
- if (awaitFlag)
1464
- fxPushNodeStruct(parser, 3, XS_TOKEN_FOR_AWAIT_OF, aLine);
1465
- else if (aToken == XS_TOKEN_IN)
1466
- fxPushNodeStruct(parser, 3, XS_TOKEN_FOR_IN, aLine);
1467
- else
1468
- fxPushNodeStruct(parser, 3, XS_TOKEN_FOR_OF, aLine);
1469
- }
1470
- else {
1471
- if (expressionFlag)
1472
- fxPushNodeStruct(parser, 1, XS_TOKEN_STATEMENT, aLine);
1473
- fxMatchToken(parser, XS_TOKEN_SEMICOLON);
1474
- if (gxTokenFlags[parser->token] & XS_TOKEN_BEGIN_EXPRESSION) {
1475
- fxCommaExpression(parser);
1476
- }
1477
- else {
1478
- fxPushNULL(parser);
1479
- }
1480
- fxMatchToken(parser, XS_TOKEN_SEMICOLON);
1481
- if (gxTokenFlags[parser->token] & XS_TOKEN_BEGIN_EXPRESSION) {
1482
- fxCommaExpression(parser);
1483
- }
1484
- else {
1485
- fxPushNULL(parser);
1486
- }
1487
- fxMatchToken(parser, XS_TOKEN_RIGHT_PARENTHESIS);
1488
- fxCheckParserStack(parser, aLine);
1489
- fxStatement(parser, 0);
1490
- fxPushNodeStruct(parser, 4, XS_TOKEN_FOR, aLine);
1491
- }
1492
- fxPushNodeStruct(parser, 2, XS_TOKEN_LABEL, aLine);
1493
- }
1494
-
1495
- void fxIfStatement(txParser* parser)
1496
- {
1497
- txInteger aLine = parser->line;
1498
- fxMatchToken(parser, XS_TOKEN_IF);
1499
- fxMatchToken(parser, XS_TOKEN_LEFT_PARENTHESIS);
1500
- fxCommaExpression(parser);
1501
- fxMatchToken(parser, XS_TOKEN_RIGHT_PARENTHESIS);
1502
- fxStatement(parser, 0);
1503
- if (parser->token == XS_TOKEN_ELSE) {
1504
- fxMatchToken(parser, XS_TOKEN_ELSE);
1505
- fxStatement(parser, 0);
1506
- }
1507
- else {
1508
- fxPushNULL(parser);
1509
- }
1510
- fxPushNodeStruct(parser, 3, XS_TOKEN_IF, aLine);
1511
- }
1512
-
1513
- void fxReturnStatement(txParser* parser)
1514
- {
1515
- txInteger aLine = parser->line;
1516
- fxMatchToken(parser, XS_TOKEN_RETURN);
1517
- if ((!parser->crlf) && (gxTokenFlags[parser->token] & XS_TOKEN_BEGIN_EXPRESSION)) {
1518
- fxCommaExpression(parser);
1519
- }
1520
- else {
1521
- fxPushNULL(parser);
1522
- }
1523
- fxPushNodeStruct(parser, 1, XS_TOKEN_RETURN, aLine);
1524
- }
1525
-
1526
- void fxSwitchStatement(txParser* parser)
1527
- {
1528
- txInteger aCount = 0;
1529
- txBoolean aDefaultFlag = 0;
1530
- txInteger aLine = parser->line;
1531
- fxMatchToken(parser, XS_TOKEN_SWITCH);
1532
- fxMatchToken(parser, XS_TOKEN_LEFT_PARENTHESIS);
1533
- fxCommaExpression(parser);
1534
- fxMatchToken(parser, XS_TOKEN_RIGHT_PARENTHESIS);
1535
- fxMatchToken(parser, XS_TOKEN_LEFT_BRACE);
1536
- while ((parser->token == XS_TOKEN_CASE) || (parser->token == XS_TOKEN_DEFAULT)) {
1537
- txInteger aCaseCount;
1538
- txInteger aCaseLine = parser->line;
1539
- if (parser->token == XS_TOKEN_CASE) {
1540
- fxMatchToken(parser, XS_TOKEN_CASE);
1541
- fxCommaExpression(parser);
1542
- fxMatchToken(parser, XS_TOKEN_COLON);
1543
- aCaseCount = parser->nodeCount;
1544
- while (gxTokenFlags[parser->token] & XS_TOKEN_BEGIN_STATEMENT)
1545
- fxStatement(parser, 1);
1546
- aCaseCount = parser->nodeCount - aCaseCount;
1547
- if (aCaseCount > 1) {
1548
- fxPushNodeList(parser, aCaseCount);
1549
- fxPushNodeStruct(parser, 1, XS_TOKEN_STATEMENTS, aCaseLine);
1550
- }
1551
- else if (aCaseCount == 0) {
1552
- fxPushNULL(parser);
1553
- }
1554
- fxPushNodeStruct(parser, 2, XS_TOKEN_CASE, aCaseLine);
1555
- }
1556
- else {
1557
- fxMatchToken(parser, XS_TOKEN_DEFAULT);
1558
- if (aDefaultFlag)
1559
- fxReportParserError(parser, parser->line, "invalid default");
1560
- fxPushNULL(parser);
1561
- fxMatchToken(parser, XS_TOKEN_COLON);
1562
- aCaseCount = parser->nodeCount;
1563
- while (gxTokenFlags[parser->token] & XS_TOKEN_BEGIN_STATEMENT)
1564
- fxStatement(parser, 1);
1565
- aCaseCount = parser->nodeCount - aCaseCount;
1566
- if (aCaseCount > 1) {
1567
- fxPushNodeList(parser, aCaseCount);
1568
- fxPushNodeStruct(parser, 1, XS_TOKEN_STATEMENTS, aLine);
1569
- }
1570
- else if (aCaseCount == 0) {
1571
- fxPushNULL(parser);
1572
- }
1573
- fxPushNodeStruct(parser, 2, XS_TOKEN_CASE, aCaseLine);
1574
- aDefaultFlag = 1;
1575
- }
1576
- aCount++;
1577
- }
1578
- fxMatchToken(parser, XS_TOKEN_RIGHT_BRACE);
1579
- fxPushNodeList(parser, aCount);
1580
- fxPushNodeStruct(parser, 2, XS_TOKEN_SWITCH, aLine);
1581
- }
1582
-
1583
- void fxThrowStatement(txParser* parser)
1584
- {
1585
- txInteger aLine = parser->line;
1586
- fxMatchToken(parser, XS_TOKEN_THROW);
1587
- if ((!parser->crlf) && (gxTokenFlags[parser->token] & XS_TOKEN_BEGIN_EXPRESSION)) {
1588
- fxCommaExpression(parser);
1589
- }
1590
- else {
1591
- fxReportParserError(parser, parser->line, "missing expression");
1592
- fxPushNodeStruct(parser, 0, XS_TOKEN_UNDEFINED, aLine);
1593
- }
1594
- fxPushNodeStruct(parser, 1, XS_TOKEN_THROW, aLine);
1595
- }
1596
-
1597
- void fxTryStatement(txParser* parser)
1598
- {
1599
- txInteger aLine = parser->line;
1600
- fxMatchToken(parser, XS_TOKEN_TRY);
1601
- fxBlock(parser);
1602
- if (parser->token == XS_TOKEN_CATCH) {
1603
- txInteger aCatchLine = parser->line;
1604
- fxMatchToken(parser, XS_TOKEN_CATCH);
1605
- if (parser->token == XS_TOKEN_LEFT_PARENTHESIS) {
1606
- fxMatchToken(parser, XS_TOKEN_LEFT_PARENTHESIS);
1607
- fxBinding(parser, XS_TOKEN_LET, 1);
1608
- fxMatchToken(parser, XS_TOKEN_RIGHT_PARENTHESIS);
1609
- }
1610
- else
1611
- fxPushNULL(parser);
1612
- fxMatchToken(parser, XS_TOKEN_LEFT_BRACE);
1613
- fxStatements(parser);
1614
- fxMatchToken(parser, XS_TOKEN_RIGHT_BRACE);
1615
- fxPushNodeStruct(parser, 2, XS_TOKEN_CATCH, aCatchLine);
1616
- }
1617
- else {
1618
- fxPushNULL(parser);
1619
- }
1620
- if (parser->token == XS_TOKEN_FINALLY) {
1621
- fxMatchToken(parser, XS_TOKEN_FINALLY);
1622
- fxBlock(parser);
1623
- }
1624
- else {
1625
- fxPushNULL(parser);
1626
- }
1627
- fxPushNodeStruct(parser, 3, XS_TOKEN_TRY, aLine);
1628
- }
1629
-
1630
- void fxVariableStatement(txParser* parser, txToken theToken)
1631
- {
1632
- txBoolean commaFlag = 0;
1633
- txInteger aCount = 0;
1634
- txInteger aLine = parser->line;
1635
- fxMatchToken(parser, theToken);
1636
- while (gxTokenFlags[parser->token] & XS_TOKEN_BEGIN_BINDING) {
1637
- commaFlag = 0;
1638
- fxBinding(parser, theToken, 1);
1639
- // if (parser->token == XS_TOKEN_ASSIGN) {
1640
- // parser->flags &= ~mxForFlag;
1641
- // fxGetNextToken(parser);
1642
- // fxAssignmentExpression(parser);
1643
- // fxPushNodeStruct(parser, 2, XS_TOKEN_ASSIGN, aLine);
1644
- // fxPushNodeStruct(parser, 1, XS_TOKEN_STATEMENT, aLine);
1645
- // }
1646
- aCount++;
1647
- if (parser->token == XS_TOKEN_COMMA) {
1648
- parser->flags &= ~mxForFlag;
1649
- fxGetNextToken(parser);
1650
- commaFlag = 1;
1651
- }
1652
- else
1653
- break;
1654
- }
1655
- if ((aCount == 0) || commaFlag) {
1656
- fxPushNULL(parser);
1657
- fxPushNULL(parser);
1658
- fxPushNodeStruct(parser, 2, theToken, aLine);
1659
- fxReportParserError(parser, parser->line, "missing identifier");
1660
- }
1661
- if (aCount > 1) {
1662
- fxPushNodeList(parser, aCount);
1663
- fxPushNodeStruct(parser, 1, XS_TOKEN_STATEMENTS, aLine);
1664
- }
1665
- }
1666
-
1667
- void fxWhileStatement(txParser* parser)
1668
- {
1669
- txInteger aLine = parser->line;
1670
- fxPushNULL(parser);
1671
- fxMatchToken(parser, XS_TOKEN_WHILE);
1672
- fxMatchToken(parser, XS_TOKEN_LEFT_PARENTHESIS);
1673
- fxCommaExpression(parser);
1674
- fxMatchToken(parser, XS_TOKEN_RIGHT_PARENTHESIS);
1675
- fxStatement(parser, 0);
1676
- fxPushNodeStruct(parser, 2, XS_TOKEN_WHILE, aLine);
1677
- fxPushNodeStruct(parser, 2, XS_TOKEN_LABEL, aLine);
1678
- }
1679
-
1680
- void fxWithStatement(txParser* parser)
1681
- {
1682
- txInteger aLine = parser->line;
1683
- fxMatchToken(parser, XS_TOKEN_WITH);
1684
- fxMatchToken(parser, XS_TOKEN_LEFT_PARENTHESIS);
1685
- fxCommaExpression(parser);
1686
- fxMatchToken(parser, XS_TOKEN_RIGHT_PARENTHESIS);
1687
- fxStatement(parser, 0);
1688
- fxPushNodeStruct(parser, 2, XS_TOKEN_WITH, aLine);
1689
- }
1690
-
1691
- void fxCommaExpression(txParser* parser)
1692
- {
1693
- txInteger aCount = 0;
1694
- txInteger aLine = parser->line;
1695
- if (gxTokenFlags[parser->token] & XS_TOKEN_BEGIN_EXPRESSION) {
1696
- fxAssignmentExpression(parser);
1697
- aCount++;
1698
- while (parser->token == XS_TOKEN_COMMA) {
1699
- fxGetNextToken(parser);
1700
- fxAssignmentExpression(parser);
1701
- aCount++;
1702
- }
1703
- }
1704
- if (aCount > 1) {
1705
- fxPushNodeList(parser, aCount);
1706
- fxPushNodeStruct(parser, 1, XS_TOKEN_EXPRESSIONS, aLine);
1707
- }
1708
- else if (aCount == 0) {
1709
- fxPushNULL(parser);
1710
- fxReportParserError(parser, parser->line, "missing expression");
1711
- }
1712
- }
1713
-
1714
- void fxAssignmentExpression(txParser* parser)
1715
- {
1716
- if (parser->token == XS_TOKEN_YIELD)
1717
- fxYieldExpression(parser);
1718
- else {
1719
- fxConditionalExpression(parser);
1720
- while (gxTokenFlags[parser->token] & XS_TOKEN_ASSIGN_EXPRESSION) {
1721
- txToken aToken = parser->token;
1722
- txInteger aLine = parser->line;
1723
- if (!fxCheckReference(parser, aToken))
1724
- fxReportParserError(parser, parser->line, "no reference");
1725
- fxGetNextToken(parser);
1726
- fxAssignmentExpression(parser);
1727
- fxPushNodeStruct(parser, 2, aToken, aLine);
1728
- }
1729
- }
1730
- }
1731
-
1732
- void fxConditionalExpression(txParser* parser)
1733
- {
1734
- fxCoalesceExpression(parser);
1735
- if (parser->token == XS_TOKEN_QUESTION_MARK) {
1736
- txInteger aLine = parser->line;
1737
- txUnsigned flags;
1738
- fxCheckArrowFunction(parser, 1);
1739
- fxGetNextToken(parser);
1740
- flags = parser->flags & mxForFlag;
1741
- parser->flags &= ~mxForFlag;
1742
- fxAssignmentExpression(parser);
1743
- parser->flags |= flags;
1744
- fxMatchToken(parser, XS_TOKEN_COLON);
1745
- fxAssignmentExpression(parser);
1746
- fxPushNodeStruct(parser, 3, XS_TOKEN_QUESTION_MARK, aLine);
1747
- }
1748
- }
1749
-
1750
- void fxCoalesceExpression(txParser* parser)
1751
- {
1752
- fxOrExpression(parser);
1753
- while (parser->token == XS_TOKEN_COALESCE) {
1754
- txInteger aLine = parser->line;
1755
- fxGetNextToken(parser);
1756
- fxOrExpression(parser);
1757
- fxCheckArrowFunction(parser, 2);
1758
- fxPushNodeStruct(parser, 2, XS_TOKEN_COALESCE, aLine);
1759
- }
1760
- }
1761
-
1762
- void fxOrExpression(txParser* parser)
1763
- {
1764
- fxAndExpression(parser);
1765
- while (parser->token == XS_TOKEN_OR) {
1766
- txInteger aLine = parser->line;
1767
- fxGetNextToken(parser);
1768
- fxAndExpression(parser);
1769
- fxCheckArrowFunction(parser, 2);
1770
- fxPushNodeStruct(parser, 2, XS_TOKEN_OR, aLine);
1771
- }
1772
- }
1773
-
1774
- void fxAndExpression(txParser* parser)
1775
- {
1776
- fxBitOrExpression(parser);
1777
- while (parser->token == XS_TOKEN_AND) {
1778
- txInteger aLine = parser->line;
1779
- fxGetNextToken(parser);
1780
- fxBitOrExpression(parser);
1781
- fxCheckArrowFunction(parser, 2);
1782
- fxPushNodeStruct(parser, 2, XS_TOKEN_AND, aLine);
1783
- }
1784
- }
1785
-
1786
- void fxBitOrExpression(txParser* parser)
1787
- {
1788
- fxBitXorExpression(parser);
1789
- while (parser->token == XS_TOKEN_BIT_OR) {
1790
- txInteger aLine = parser->line;
1791
- fxGetNextToken(parser);
1792
- fxBitXorExpression(parser);
1793
- fxCheckArrowFunction(parser, 2);
1794
- fxPushNodeStruct(parser, 2, XS_TOKEN_BIT_OR, aLine);
1795
- }
1796
- }
1797
-
1798
- void fxBitXorExpression(txParser* parser)
1799
- {
1800
- fxBitAndExpression(parser);
1801
- while (parser->token == XS_TOKEN_BIT_XOR) {
1802
- txInteger aLine = parser->line;
1803
- fxGetNextToken(parser);
1804
- fxBitAndExpression(parser);
1805
- fxCheckArrowFunction(parser, 2);
1806
- fxPushNodeStruct(parser, 2, XS_TOKEN_BIT_XOR, aLine);
1807
- }
1808
- }
1809
-
1810
- void fxBitAndExpression(txParser* parser)
1811
- {
1812
- fxEqualExpression(parser);
1813
- while (parser->token == XS_TOKEN_BIT_AND) {
1814
- txInteger aLine = parser->line;
1815
- fxGetNextToken(parser);
1816
- fxEqualExpression(parser);
1817
- fxCheckArrowFunction(parser, 2);
1818
- fxPushNodeStruct(parser, 2, XS_TOKEN_BIT_AND, aLine);
1819
- }
1820
- }
1821
-
1822
- void fxEqualExpression(txParser* parser)
1823
- {
1824
- fxRelationalExpression(parser);
1825
- while (gxTokenFlags[parser->token] & XS_TOKEN_EQUAL_EXPRESSION) {
1826
- txToken aToken = parser->token;
1827
- txInteger aLine = parser->line;
1828
- fxGetNextToken(parser);
1829
- fxRelationalExpression(parser);
1830
- fxCheckArrowFunction(parser, 2);
1831
- fxPushNodeStruct(parser, 2, aToken, aLine);
1832
- }
1833
- }
1834
-
1835
- void fxRelationalExpression(txParser* parser)
1836
- {
1837
- if (parser->token == XS_TOKEN_PRIVATE_IDENTIFIER) {
1838
- txInteger aLine = parser->line;
1839
- fxPushSymbol(parser, parser->symbol);
1840
- fxGetNextToken(parser);
1841
- fxMatchToken(parser, XS_TOKEN_IN);
1842
- if (parser->flags & mxForFlag)
1843
- fxReportParserError(parser, parser->line, "invalid %s", gxTokenNames[XS_TOKEN_IN]);
1844
- fxShiftExpression(parser);
1845
- fxCheckArrowFunction(parser, 2);
1846
- fxPushNodeStruct(parser, 2, XS_TOKEN_PRIVATE_IDENTIFIER, aLine);
1847
- }
1848
- else {
1849
- fxShiftExpression(parser);
1850
- if ((parser->flags & mxForFlag) && ((parser->token == XS_TOKEN_IN) || fxIsKeyword(parser, parser->ofSymbol)))
1851
- return;
1852
- while (gxTokenFlags[parser->token] & XS_TOKEN_RELATIONAL_EXPRESSION) {
1853
- txToken aToken = parser->token;
1854
- txInteger aLine = parser->line;
1855
- fxMatchToken(parser, aToken);
1856
- fxShiftExpression(parser);
1857
- fxCheckArrowFunction(parser, 2);
1858
- fxPushNodeStruct(parser, 2, aToken, aLine);
1859
- }
1860
- }
1861
- }
1862
-
1863
- void fxShiftExpression(txParser* parser)
1864
- {
1865
- fxAdditiveExpression(parser);
1866
- while (gxTokenFlags[parser->token] & XS_TOKEN_SHIFT_EXPRESSION) {
1867
- txToken aToken = parser->token;
1868
- txInteger aLine = parser->line;
1869
- fxGetNextToken(parser);
1870
- fxAdditiveExpression(parser);
1871
- fxCheckArrowFunction(parser, 2);
1872
- fxPushNodeStruct(parser, 2, aToken, aLine);
1873
- }
1874
- }
1875
-
1876
- void fxAdditiveExpression(txParser* parser)
1877
- {
1878
- fxMultiplicativeExpression(parser);
1879
- while (gxTokenFlags[parser->token] & XS_TOKEN_ADDITIVE_EXPRESSION) {
1880
- txToken aToken = parser->token;
1881
- txInteger aLine = parser->line;
1882
- fxGetNextToken(parser);
1883
- fxMultiplicativeExpression(parser);
1884
- fxCheckArrowFunction(parser, 2);
1885
- fxPushNodeStruct(parser, 2, aToken, aLine);
1886
- }
1887
- }
1888
-
1889
- void fxMultiplicativeExpression(txParser* parser)
1890
- {
1891
- fxExponentiationExpression(parser);
1892
- while (gxTokenFlags[parser->token] & XS_TOKEN_MULTIPLICATIVE_EXPRESSION) {
1893
- txToken aToken = parser->token;
1894
- txInteger aLine = parser->line;
1895
- fxGetNextToken(parser);
1896
- fxExponentiationExpression(parser);
1897
- fxCheckArrowFunction(parser, 2);
1898
- fxPushNodeStruct(parser, 2, aToken, aLine);
1899
- }
1900
- }
1901
-
1902
- void fxExponentiationExpression(txParser* parser)
1903
- {
1904
- if (gxTokenFlags[parser->token] & XS_TOKEN_UNARY_EXPRESSION)
1905
- fxUnaryExpression(parser);
1906
- else {
1907
- fxPrefixExpression(parser);
1908
- if (gxTokenFlags[parser->token] & XS_TOKEN_EXPONENTIATION_EXPRESSION) {
1909
- txToken aToken = parser->token;
1910
- txInteger aLine = parser->line;
1911
- fxGetNextToken(parser);
1912
- fxExponentiationExpression(parser);
1913
- fxCheckArrowFunction(parser, 2);
1914
- fxPushNodeStruct(parser, 2, aToken, aLine);
1915
- }
1916
- }
1917
- }
1918
-
1919
- void fxUnaryExpression(txParser* parser)
1920
- {
1921
- if (gxTokenFlags[parser->token] & XS_TOKEN_UNARY_EXPRESSION) {
1922
- txToken aToken = parser->token;
1923
- txInteger aLine = parser->line;
1924
- fxCheckParserStack(parser, aLine);
1925
- fxMatchToken(parser, aToken);
1926
- fxUnaryExpression(parser);
1927
- fxCheckArrowFunction(parser, 1);
1928
- if (aToken == XS_TOKEN_ADD)
1929
- fxPushNodeStruct(parser, 1, XS_TOKEN_PLUS, aLine);
1930
- else if (aToken == XS_TOKEN_SUBTRACT)
1931
- fxPushNodeStruct(parser, 1, XS_TOKEN_MINUS, aLine);
1932
- else if (aToken == XS_TOKEN_DELETE) {
1933
- //if ((parser->flags & mxStrictFlag) && (parser->root->description->token == XS_TOKEN_ACCESS)) {
1934
- // fxReportParserError(parser, parser->line, "no reference (strict mode)");
1935
- //}
1936
- if (!fxCheckReference(parser, aToken))
1937
- fxReportParserError(parser, parser->line, "no reference");
1938
- fxPushNodeStruct(parser, 1, aToken, aLine);
1939
- }
1940
- else if (aToken == XS_TOKEN_AWAIT) {
1941
- if ((parser->flags & mxGeneratorFlag) && !(parser->flags & mxYieldFlag))
1942
- fxReportParserError(parser, parser->line, "invalid await");
1943
- else
1944
- parser->flags |= mxAwaitingFlag;
1945
- fxPushNodeStruct(parser, 1, aToken, aLine);
1946
- }
1947
- else
1948
- fxPushNodeStruct(parser, 1, aToken, aLine);
1949
-
1950
- }
1951
- else
1952
- fxPrefixExpression(parser);
1953
- }
1954
-
1955
- void fxPrefixExpression(txParser* parser)
1956
- {
1957
- if (gxTokenFlags[parser->token] & XS_TOKEN_PREFIX_EXPRESSION) {
1958
- txToken aToken = parser->token;
1959
- txInteger aLine = parser->line;
1960
- fxCheckParserStack(parser, aLine);
1961
- fxGetNextToken(parser);
1962
- fxPrefixExpression(parser);
1963
- fxCheckArrowFunction(parser, 1);
1964
- if (!fxCheckReference(parser, aToken))
1965
- fxReportParserError(parser, parser->line, "no reference");
1966
- fxPushNodeStruct(parser, 1, aToken, aLine);
1967
- parser->root->flags = mxExpressionNoValue;
1968
- }
1969
- else
1970
- fxPostfixExpression(parser);
1971
- }
1972
-
1973
- void fxPostfixExpression(txParser* parser)
1974
- {
1975
- fxCallExpression(parser);
1976
- if ((!parser->crlf) && (gxTokenFlags[parser->token] & XS_TOKEN_POSTFIX_EXPRESSION)) {
1977
- fxCheckArrowFunction(parser, 1);
1978
- if (!fxCheckReference(parser, parser->token))
1979
- fxReportParserError(parser, parser->line, "no reference");
1980
- fxPushNodeStruct(parser, 1, parser->token, parser->line);
1981
- fxGetNextToken(parser);
1982
- }
1983
- }
1984
-
1985
- void fxCallExpression(txParser* parser)
1986
- {
1987
- txInteger chainLine = parser->line;
1988
- fxLiteralExpression(parser, 0);
1989
- if (gxTokenFlags[parser->token] & XS_TOKEN_CALL_EXPRESSION) {
1990
- txBoolean chainFlag = 0;
1991
- fxCheckArrowFunction(parser, 1);
1992
- for (;;) {
1993
- txInteger aLine = parser->line;
1994
- if (parser->token == XS_TOKEN_DOT) {
1995
- fxGetNextToken(parser);
1996
- if (parser->token == XS_TOKEN_IDENTIFIER) {
1997
- fxPushSymbol(parser, parser->symbol);
1998
- fxPushNodeStruct(parser, 2, XS_TOKEN_MEMBER, aLine);
1999
- fxGetNextToken(parser);
2000
- }
2001
- else if (parser->token == XS_TOKEN_PRIVATE_IDENTIFIER) {
2002
- if (parser->root->flags & mxSuperFlag)
2003
- fxReportParserError(parser, parser->line, "invalid super");
2004
- fxPushSymbol(parser, parser->symbol);
2005
- fxSwapNodes(parser);
2006
- fxPushNodeStruct(parser, 2, XS_TOKEN_PRIVATE_MEMBER, aLine);
2007
- fxGetNextToken(parser);
2008
- }
2009
- else
2010
- fxReportParserError(parser, parser->line, "missing property");
2011
- }
2012
- //else if (parser->crlf)
2013
- // break;
2014
- else if (parser->token == XS_TOKEN_LEFT_BRACKET) {
2015
- fxGetNextToken(parser);
2016
- fxCommaExpression(parser);
2017
- fxPushNodeStruct(parser, 2, XS_TOKEN_MEMBER_AT, aLine);
2018
- fxMatchToken(parser, XS_TOKEN_RIGHT_BRACKET);
2019
- }
2020
- else if (parser->token == XS_TOKEN_LEFT_PARENTHESIS) {
2021
- if (parser->root->description && (parser->root->description->token == XS_TOKEN_ACCESS)) {
2022
- txAccessNode* access = (txAccessNode*)parser->root;
2023
- if (access->symbol == parser->evalSymbol) {
2024
- parser->flags |= mxEvalFlag;
2025
- }
2026
- }
2027
- fxParameters(parser);
2028
- fxPushNodeStruct(parser, 2, XS_TOKEN_CALL, aLine);
2029
- }
2030
- else if (parser->token == XS_TOKEN_TEMPLATE) {
2031
- if (chainFlag)
2032
- fxReportParserError(parser, parser->line, "invalid template");
2033
- fxPushStringNode(parser, parser->stringLength, parser->string, aLine);
2034
- fxPushRawNode(parser, parser->rawLength, parser->raw, aLine);
2035
- fxPushNodeStruct(parser, 2, XS_TOKEN_TEMPLATE_MIDDLE, aLine);
2036
- fxGetNextToken(parser);
2037
- fxPushNodeList(parser, 1);
2038
- fxPushNodeStruct(parser, 2, XS_TOKEN_TEMPLATE, aLine);
2039
- }
2040
- else if (parser->token == XS_TOKEN_TEMPLATE_HEAD) {
2041
- if (chainFlag)
2042
- fxReportParserError(parser, parser->line, "invalid template");
2043
- fxTemplateExpression(parser);
2044
- fxPushNodeStruct(parser, 2, XS_TOKEN_TEMPLATE, aLine);
2045
- }
2046
- else if (parser->token == XS_TOKEN_CHAIN) {
2047
- fxGetNextToken(parser);
2048
- chainFlag = 1;
2049
- if (parser->token == XS_TOKEN_IDENTIFIER) {
2050
- fxPushNodeStruct(parser, 1, XS_TOKEN_OPTION, aLine);
2051
- fxPushSymbol(parser, parser->symbol);
2052
- fxPushNodeStruct(parser, 2, XS_TOKEN_MEMBER, aLine);
2053
- fxGetNextToken(parser);
2054
- }
2055
- else if (parser->token == XS_TOKEN_PRIVATE_IDENTIFIER) {
2056
- fxPushNodeStruct(parser, 1, XS_TOKEN_OPTION, aLine);
2057
- fxPushSymbol(parser, parser->symbol);
2058
- fxSwapNodes(parser);
2059
- fxPushNodeStruct(parser, 2, XS_TOKEN_PRIVATE_MEMBER, aLine);
2060
- fxGetNextToken(parser);
2061
- }
2062
- else if (parser->token == XS_TOKEN_LEFT_BRACKET) {
2063
- fxPushNodeStruct(parser, 1, XS_TOKEN_OPTION, aLine);
2064
- fxGetNextToken(parser);
2065
- fxCommaExpression(parser);
2066
- fxPushNodeStruct(parser, 2, XS_TOKEN_MEMBER_AT, aLine);
2067
- fxMatchToken(parser, XS_TOKEN_RIGHT_BRACKET);
2068
- }
2069
- else if (parser->token == XS_TOKEN_LEFT_PARENTHESIS) {
2070
- fxPushNodeStruct(parser, 1, XS_TOKEN_OPTION, aLine);
2071
- fxParameters(parser);
2072
- fxPushNodeStruct(parser, 2, XS_TOKEN_CALL, aLine);
2073
- }
2074
- else
2075
- fxReportParserError(parser, parser->line, "invalid ?.");
2076
- }
2077
- else
2078
- break;
2079
- }
2080
- if (chainFlag)
2081
- fxPushNodeStruct(parser, 1, XS_TOKEN_CHAIN, chainLine);
2082
- }
2083
- }
2084
-
2085
- void fxLiteralExpression(txParser* parser, txUnsigned flag)
2086
- {
2087
- int escaped;
2088
- txSymbol* aSymbol;
2089
- txInteger aLine = parser->line;
2090
- txUnsigned flags = 0;
2091
- char c = 0;
2092
- fxCheckParserStack(parser, aLine);
2093
- switch (parser->token) {
2094
- case XS_TOKEN_NULL:
2095
- case XS_TOKEN_TRUE:
2096
- case XS_TOKEN_FALSE:
2097
- fxPushNodeStruct(parser, 0, parser->token, aLine);
2098
- fxMatchToken(parser, parser->token);
2099
- break;
2100
- case XS_TOKEN_IMPORT:
2101
- fxMatchToken(parser, XS_TOKEN_IMPORT);
2102
- if (!flag && (parser->token == XS_TOKEN_LEFT_PARENTHESIS)) {
2103
- fxGetNextToken(parser);
2104
- fxAssignmentExpression(parser);
2105
- fxMatchToken(parser, XS_TOKEN_RIGHT_PARENTHESIS);
2106
- fxPushNodeStruct(parser, 1, XS_TOKEN_IMPORT_CALL, aLine);
2107
- }
2108
- else if (parser->token == XS_TOKEN_DOT) {
2109
- fxGetNextToken(parser);
2110
- if ((parser->token == XS_TOKEN_IDENTIFIER) && (parser->symbol == parser->metaSymbol) && (!parser->escaped)) {
2111
- fxGetNextToken(parser);
2112
- if (parser->flags & mxProgramFlag)
2113
- fxReportParserError(parser, parser->line, "invalid import.meta");
2114
- else
2115
- fxPushNodeStruct(parser, 0, XS_TOKEN_IMPORT_META, aLine);
2116
- }
2117
- else
2118
- fxReportParserError(parser, parser->line, "invalid import.");
2119
- }
2120
- else
2121
- fxReportParserError(parser, parser->line, "invalid import");
2122
- break;
2123
- case XS_TOKEN_SUPER:
2124
- fxMatchToken(parser, XS_TOKEN_SUPER);
2125
- if (parser->token == XS_TOKEN_LEFT_PARENTHESIS) {
2126
- if (parser->flags & mxDerivedFlag) {
2127
- fxParameters(parser);
2128
- fxPushNodeStruct(parser, 1, XS_TOKEN_SUPER, aLine);
2129
- }
2130
- else {
2131
- fxPushNodeStruct(parser, 0, XS_TOKEN_UNDEFINED, aLine);
2132
- fxReportParserError(parser, parser->line, "invalid super");
2133
- }
2134
- }
2135
- else if ((parser->token == XS_TOKEN_DOT) || (parser->token == XS_TOKEN_LEFT_BRACKET)) {
2136
- if (parser->flags & mxSuperFlag) {
2137
- fxPushNodeStruct(parser, 0, XS_TOKEN_THIS, aLine);
2138
- parser->root->flags |= parser->flags & (mxDerivedFlag | mxSuperFlag);
2139
- }
2140
- else {
2141
- fxPushNodeStruct(parser, 0, XS_TOKEN_UNDEFINED, aLine);
2142
- fxReportParserError(parser, parser->line, "invalid super");
2143
- }
2144
- }
2145
- else
2146
- fxReportParserError(parser, parser->line, "invalid super");
2147
- parser->flags |= mxSuperFlag;
2148
- break;
2149
- case XS_TOKEN_THIS:
2150
- fxPushNodeStruct(parser, 0, parser->token, aLine);
2151
- parser->root->flags |= parser->flags & mxDerivedFlag;
2152
- fxMatchToken(parser, XS_TOKEN_THIS);
2153
- break;
2154
- case XS_TOKEN_INTEGER:
2155
- fxPushIntegerNode(parser, parser->integer, aLine);
2156
- fxGetNextToken(parser);
2157
- break;
2158
- case XS_TOKEN_NUMBER:
2159
- fxPushNumberNode(parser, parser->number, aLine);
2160
- fxGetNextToken(parser);
2161
- break;
2162
- case XS_TOKEN_BIGINT:
2163
- fxPushBigIntNode(parser, &parser->bigint, aLine);
2164
- fxGetNextToken(parser);
2165
- break;
2166
- case XS_TOKEN_DIVIDE_ASSIGN:
2167
- c = '=';
2168
- // continue
2169
- case XS_TOKEN_DIVIDE:
2170
- fxGetNextRegExp(parser, c);
2171
- fxPushStringNode(parser, parser->modifierLength, parser->modifier, aLine);
2172
- fxPushStringNode(parser, parser->stringLength, parser->string, aLine);
2173
- fxPushNodeStruct(parser, 2, XS_TOKEN_REGEXP, aLine);
2174
- fxGetNextToken(parser);
2175
- break;
2176
- case XS_TOKEN_STRING:
2177
- fxPushStringNode(parser, parser->stringLength, parser->string, aLine);
2178
- fxGetNextToken(parser);
2179
- break;
2180
- case XS_TOKEN_IDENTIFIER:
2181
- escaped = parser->escaped;
2182
- aSymbol = parser->symbol;
2183
- fxGetNextToken(parser);
2184
- if (aSymbol == parser->undefinedSymbol) {
2185
- fxPushNodeStruct(parser, 0, XS_TOKEN_UNDEFINED, aLine);
2186
- break;
2187
- }
2188
- flags = 0;
2189
- if ((aSymbol == parser->asyncSymbol) && (!escaped) && (!parser->crlf)) {
2190
- if (parser->token == XS_TOKEN_FUNCTION) {
2191
- fxMatchToken(parser, XS_TOKEN_FUNCTION);
2192
- if (parser->token == XS_TOKEN_MULTIPLY) {
2193
- fxGetNextToken(parser);
2194
- fxGeneratorExpression(parser, aLine, C_NULL, mxAsyncFlag);
2195
- }
2196
- else
2197
- fxFunctionExpression(parser, aLine, C_NULL, mxAsyncFlag);
2198
- break;
2199
- }
2200
- if (parser->token == XS_TOKEN_LEFT_PARENTHESIS) {
2201
- fxGroupExpression(parser, mxAsyncFlag);
2202
- break;
2203
- }
2204
- if (parser->token == XS_TOKEN_IDENTIFIER) {
2205
- // if (!(parser->flags & mxForFlag) || !fxIsKeyword(parser, parser->ofSymbol)) {
2206
- aSymbol = parser->symbol;
2207
- fxGetNextToken(parser);
2208
- flags = mxAsyncFlag;
2209
- // }
2210
- }
2211
- }
2212
- if (aSymbol == parser->awaitSymbol)
2213
- parser->flags |= mxAwaitingFlag;
2214
- if ((!parser->crlf) && (parser->token == XS_TOKEN_ARROW)) {
2215
- fxCheckStrictSymbol(parser, aSymbol);
2216
- if (flags && (aSymbol == parser->awaitSymbol))
2217
- fxReportParserError(parser, parser->line, "invalid await");
2218
- fxPushSymbol(parser, aSymbol);
2219
- fxPushNULL(parser);
2220
- fxPushNodeStruct(parser, 2, XS_TOKEN_ARG, aLine);
2221
- fxPushNodeList(parser, 1);
2222
- fxPushNodeStruct(parser, 1, XS_TOKEN_PARAMS_BINDING, aLine);
2223
- fxArrowExpression(parser, flags);
2224
- break;
2225
- }
2226
- if (aSymbol == parser->argumentsSymbol)
2227
- parser->flags |= mxArgumentsFlag;
2228
- fxPushSymbol(parser, aSymbol);
2229
- fxPushNodeStruct(parser, 1, XS_TOKEN_ACCESS, aLine);
2230
- break;
2231
- case XS_TOKEN_CLASS:
2232
- flags = parser->flags & mxForFlag;
2233
- parser->flags &= ~mxForFlag;
2234
- fxClassExpression(parser, aLine, C_NULL);
2235
- parser->flags |= flags;
2236
- break;
2237
- case XS_TOKEN_FUNCTION:
2238
- fxMatchToken(parser, XS_TOKEN_FUNCTION);
2239
- if (parser->token == XS_TOKEN_MULTIPLY) {
2240
- fxGetNextToken(parser);
2241
- fxGeneratorExpression(parser, aLine, C_NULL, 0);
2242
- }
2243
- else
2244
- fxFunctionExpression(parser, aLine, C_NULL, 0);
2245
- break;
2246
- case XS_TOKEN_NEW:
2247
- fxNewExpression(parser);
2248
- break;
2249
- case XS_TOKEN_LEFT_BRACE:
2250
- flags = parser->flags & mxForFlag;
2251
- parser->flags &= ~mxForFlag;
2252
- fxObjectExpression(parser);
2253
- parser->flags |= flags;
2254
- break;
2255
- case XS_TOKEN_LEFT_BRACKET:
2256
- flags = parser->flags & mxForFlag;
2257
- parser->flags &= ~mxForFlag;
2258
- fxArrayExpression(parser);
2259
- parser->flags |= flags;
2260
- break;
2261
- case XS_TOKEN_LEFT_PARENTHESIS:
2262
- fxGroupExpression(parser, 0);
2263
- break;
2264
- case XS_TOKEN_TEMPLATE:
2265
- fxPushNULL(parser);
2266
- fxPushStringNode(parser, parser->stringLength, parser->string, aLine);
2267
- fxPushRawNode(parser, parser->rawLength, parser->raw, aLine);
2268
- fxPushNodeStruct(parser, 2, XS_TOKEN_TEMPLATE_MIDDLE, aLine);
2269
- fxGetNextToken(parser);
2270
- fxPushNodeList(parser, 1);
2271
- fxPushNodeStruct(parser, 2, XS_TOKEN_TEMPLATE, aLine);
2272
- break;
2273
- case XS_TOKEN_TEMPLATE_HEAD:
2274
- fxPushNULL(parser);
2275
- fxTemplateExpression(parser);
2276
- fxPushNodeStruct(parser, 2, XS_TOKEN_TEMPLATE, aLine);
2277
- break;
2278
- case XS_TOKEN_HOST:
2279
- fxGetNextToken(parser);
2280
- fxPushNULL(parser);
2281
- fxPushNULL(parser);
2282
- if (parser->token == XS_TOKEN_STRING) {
2283
- fxPushStringNode(parser, parser->stringLength, parser->string, aLine);
2284
- fxGetNextToken(parser);
2285
- }
2286
- else {
2287
- fxReportParserError(parser, parser->line, "invalid host object");
2288
- fxPushNULL(parser);
2289
- }
2290
- fxPushNodeStruct(parser, 3, XS_TOKEN_HOST, aLine);
2291
- break;
2292
- case XS_TOKEN_LESS:
2293
- fxGetNextToken(parser);
2294
- fxJSXElement(parser);
2295
- fxGetNextToken(parser);
2296
- break;
2297
- default:
2298
- fxPushNodeStruct(parser, 0, XS_TOKEN_UNDEFINED, aLine);
2299
- fxReportParserError(parser, parser->line, "missing expression");
2300
- break;
2301
- }
2302
- }
2303
-
2304
- void fxArrayExpression(txParser* parser)
2305
- {
2306
- txInteger aCount = 0;
2307
- int elision = 1;
2308
- txInteger aLine = parser->line;
2309
- txBoolean aSpreadFlag = 0;
2310
- fxMatchToken(parser, XS_TOKEN_LEFT_BRACKET);
2311
- while ((parser->token == XS_TOKEN_COMMA) || (parser->token == XS_TOKEN_SPREAD) || (gxTokenFlags[parser->token] & XS_TOKEN_BEGIN_EXPRESSION)) {
2312
- txInteger anItemLine = parser->line;
2313
- if (parser->token == XS_TOKEN_COMMA) {
2314
- fxGetNextToken(parser);
2315
- if (elision) {
2316
- fxPushNodeStruct(parser, 0, XS_TOKEN_ELISION, anItemLine);
2317
- aCount++;
2318
- }
2319
- else
2320
- elision = 1;
2321
- }
2322
- else if (parser->token == XS_TOKEN_SPREAD) {
2323
- fxGetNextToken(parser);
2324
- if (!elision)
2325
- fxReportParserError(parser, parser->line, "missing ,");
2326
- fxAssignmentExpression(parser);
2327
- fxPushNodeStruct(parser, 1, XS_TOKEN_SPREAD, anItemLine);
2328
- aCount++;
2329
- elision = 0;
2330
- aSpreadFlag = 1;
2331
- }
2332
- else {
2333
- if (!elision)
2334
- fxReportParserError(parser, parser->line, "missing ,");
2335
- fxAssignmentExpression(parser);
2336
- aCount++;
2337
- elision = 0;
2338
- }
2339
- }
2340
- fxMatchToken(parser, XS_TOKEN_RIGHT_BRACKET);
2341
- fxPushNodeList(parser, aCount);
2342
- fxPushNodeStruct(parser, 1, XS_TOKEN_ARRAY, aLine);
2343
- if (aCount && elision)
2344
- parser->root->flags |= mxElisionFlag;
2345
- if (aSpreadFlag)
2346
- parser->root->flags |= mxSpreadFlag;
2347
- }
2348
-
2349
- void fxArrowExpression(txParser* parser, txUnsigned flag)
2350
- {
2351
- txInteger aLine = parser->line;
2352
- txUnsigned flags = parser->flags;
2353
- parser->flags &= ~mxAsyncFlag;
2354
- parser->flags |= mxArrowFlag | flag;
2355
- fxMatchToken(parser, XS_TOKEN_ARROW);
2356
- fxPushNULL(parser);
2357
- fxSwapNodes(parser);
2358
- if (parser->token == XS_TOKEN_LEFT_BRACE) {
2359
- fxMatchToken(parser, XS_TOKEN_LEFT_BRACE);
2360
- fxBody(parser);
2361
- fxPushNodeStruct(parser, 1, XS_TOKEN_BODY, aLine);
2362
- fxMatchToken(parser, XS_TOKEN_RIGHT_BRACE);
2363
- }
2364
- else {
2365
- fxAssignmentExpression(parser);
2366
- fxPushNodeStruct(parser, 1, XS_TOKEN_RETURN, aLine);
2367
- fxPushNodeStruct(parser, 1, XS_TOKEN_BODY, aLine);
2368
- }
2369
- fxPushNodeStruct(parser, 3, XS_TOKEN_FUNCTION, aLine);
2370
- parser->root->flags = parser->flags & (mxStrictFlag | mxFieldFlag | mxNotSimpleParametersFlag | mxArrowFlag | mxSuperFlag | flag);
2371
- if (!(flags & mxStrictFlag) && (parser->flags & mxStrictFlag))
2372
- fxCheckStrictFunction(parser, (txFunctionNode*)parser->root);
2373
- parser->flags = flags | (parser->flags & (mxArgumentsFlag | mxEvalFlag));
2374
- }
2375
-
2376
- void fxClassExpression(txParser* parser, txInteger theLine, txSymbol** theSymbol)
2377
- {
2378
- txBoolean heritageFlag = 0;
2379
- // txBoolean hostFlag = 0;
2380
- txNode* constructor = NULL;
2381
- txInteger aCount = 0;
2382
- txInteger aLine = parser->line;
2383
- txUnsigned flags = parser->flags;
2384
- txInteger constructorInitCount = 0;
2385
- txInteger instanceInitCount = 0;
2386
- parser->flags |= mxStrictFlag;
2387
- fxMatchToken(parser, XS_TOKEN_CLASS);
2388
- if (parser->token == XS_TOKEN_IDENTIFIER) {
2389
- fxPushSymbol(parser, parser->symbol);
2390
- if (theSymbol)
2391
- *theSymbol = parser->symbol;
2392
- fxGetNextToken(parser);
2393
- }
2394
- else
2395
- fxPushNULL(parser);
2396
- if (parser->token == XS_TOKEN_EXTENDS) {
2397
- fxMatchToken(parser, XS_TOKEN_EXTENDS);
2398
- fxCallExpression(parser);
2399
- fxCheckArrowFunction(parser, 1);
2400
- flags |= parser->flags & mxAwaitingFlag;
2401
- heritageFlag = 1;
2402
- }
2403
- else if (parser->token == XS_TOKEN_HOST) {
2404
- fxGetNextToken(parser);
2405
- fxPushNULL(parser);
2406
- fxPushNULL(parser);
2407
- if (parser->token == XS_TOKEN_STRING) {
2408
- fxPushStringNode(parser, parser->stringLength, parser->string, aLine);
2409
- fxGetNextToken(parser);
2410
- }
2411
- else {
2412
- fxReportParserError(parser, parser->line, "invalid host class");
2413
- fxPushNULL(parser);
2414
- }
2415
- fxPushNodeStruct(parser, 3, XS_TOKEN_HOST, aLine);
2416
- // hostFlag = 1;
2417
- }
2418
- else {
2419
- fxPushNULL(parser);
2420
- }
2421
- if (parser->token == XS_TOKEN_LEFT_BRACE) {
2422
- fxMatchToken(parser, XS_TOKEN_LEFT_BRACE);
2423
- for (;;) {
2424
- txBoolean aStaticFlag;
2425
- txInteger aPropertyLine = parser->line;
2426
- txSymbol* aSymbol;
2427
- txToken aToken0;
2428
- txToken aToken1;
2429
- txToken aToken2;
2430
- txUnsigned flag;
2431
- while (parser->token == XS_TOKEN_SEMICOLON)
2432
- fxGetNextToken(parser);
2433
- if (parser->token == XS_TOKEN_RIGHT_BRACE)
2434
- break;
2435
- aStaticFlag = 0;
2436
- if ((parser->token == XS_TOKEN_STATIC) && (!parser->escaped)) {
2437
- fxGetNextToken(parser);
2438
- if ((parser->token == XS_TOKEN_ASSIGN) || parser->token == XS_TOKEN_SEMICOLON) {
2439
- fxPushSymbol(parser, parser->staticSymbol);
2440
- aToken1 = XS_TOKEN_PROPERTY;
2441
- goto field;
2442
- }
2443
- if (parser->token == XS_TOKEN_LEFT_BRACE) {
2444
- txUnsigned flags = parser->flags;
2445
- parser->flags = (flags & (mxParserFlags | mxStrictFlag)) | mxSuperFlag | mxTargetFlag | mxFieldFlag | mxAsyncFlag;
2446
- fxCheckParserStack(parser, aPropertyLine);
2447
- fxGetNextToken(parser);
2448
- fxStatements(parser);
2449
- fxMatchToken(parser, XS_TOKEN_RIGHT_BRACE);
2450
- fxPushNodeStruct(parser, 1, XS_TOKEN_BODY, aPropertyLine);
2451
- if (parser->flags & mxArgumentsFlag)
2452
- fxReportParserError(parser, parser->line, "invalid arguments");
2453
- if (parser->flags & mxAwaitingFlag)
2454
- fxReportParserError(parser, parser->line, "invalid await");
2455
- parser->flags = flags;
2456
- parser->root->flags |= mxStaticFlag;
2457
- constructorInitCount++;
2458
- aCount++;
2459
- continue;
2460
- }
2461
- aStaticFlag = 1;
2462
- }
2463
- fxPropertyName(parser, &aSymbol, &aToken0, &aToken1, &aToken2, &flag);
2464
- if ((aStaticFlag == 0) && (aSymbol == parser->constructorSymbol)) {
2465
- fxPopNode(parser); // symbol
2466
- if (constructor || (aToken2 == XS_TOKEN_GENERATOR) || (aToken2 == XS_TOKEN_GETTER) || (aToken2 == XS_TOKEN_SETTER) || (flag & mxAsyncFlag))
2467
- fxReportParserError(parser, parser->line, "invalid constructor");
2468
- fxFunctionExpression(parser, aPropertyLine, C_NULL, mxSuperFlag | ((heritageFlag) ? mxDerivedFlag : mxBaseFlag));
2469
- constructor = fxPopNode(parser);
2470
- }
2471
- else if (parser->token == XS_TOKEN_LEFT_PARENTHESIS) {
2472
- if ((aToken1 == XS_TOKEN_PRIVATE_PROPERTY) && (aSymbol == parser->privateConstructorSymbol))
2473
- fxReportParserError(parser, parser->line, "invalid method: #constructor");
2474
- if (aStaticFlag && (aSymbol == parser->prototypeSymbol))
2475
- fxReportParserError(parser, parser->line, "invalid static method: prototype");
2476
- if (aStaticFlag)
2477
- flag |= mxStaticFlag;
2478
- if (aToken2 == XS_TOKEN_GETTER)
2479
- flag |= mxGetterFlag;
2480
- else if (aToken2 == XS_TOKEN_SETTER)
2481
- flag |= mxSetterFlag;
2482
- else
2483
- flag |= mxMethodFlag;
2484
- if (aToken2 == XS_TOKEN_GENERATOR)
2485
- fxGeneratorExpression(parser, aPropertyLine, C_NULL, mxSuperFlag | flag);
2486
- else
2487
- fxFunctionExpression(parser, aPropertyLine, C_NULL, mxSuperFlag | flag);
2488
- fxPushNodeStruct(parser, 2, aToken1, aPropertyLine);
2489
- parser->root->flags |= flag & (mxStaticFlag | mxGetterFlag | mxSetterFlag | mxMethodFlag);
2490
- if (aToken1 == XS_TOKEN_PRIVATE_PROPERTY) {
2491
- if (aStaticFlag)
2492
- constructorInitCount++;
2493
- else
2494
- instanceInitCount++;
2495
- }
2496
- aCount++;
2497
- }
2498
- else {
2499
- if ((aToken1 == XS_TOKEN_PRIVATE_PROPERTY) && (aSymbol == parser->privateConstructorSymbol))
2500
- fxReportParserError(parser, parser->line, "invalid field: #constructor");
2501
- if (aSymbol == parser->constructorSymbol)
2502
- fxReportParserError(parser, parser->line, "invalid field: constructor");
2503
- if (aSymbol == parser->prototypeSymbol)
2504
- fxReportParserError(parser, parser->line, "invalid field: prototype");
2505
- field:
2506
- if (parser->token == XS_TOKEN_ASSIGN) {
2507
- txUnsigned flags = parser->flags;
2508
- parser->flags = (flags & (mxParserFlags | mxStrictFlag)) | mxSuperFlag | mxTargetFlag | mxFieldFlag;
2509
- fxGetNextToken(parser);
2510
- fxAssignmentExpression(parser);
2511
- if (parser->flags & mxArgumentsFlag)
2512
- fxReportParserError(parser, parser->line, "invalid arguments");
2513
- parser->flags = flags;
2514
- }
2515
- else {
2516
- fxPushNodeStruct(parser, 0, XS_TOKEN_UNDEFINED, aLine);
2517
- }
2518
- fxPushNodeStruct(parser, 2, aToken1, aPropertyLine);
2519
- if (aStaticFlag) {
2520
- parser->root->flags |= mxStaticFlag;
2521
- constructorInitCount++;
2522
- }
2523
- else
2524
- instanceInitCount++;
2525
- fxSemicolon(parser);
2526
- aCount++;
2527
- }
2528
- }
2529
- }
2530
- fxMatchToken(parser, XS_TOKEN_RIGHT_BRACE);
2531
- fxPushNodeList(parser, aCount);
2532
-
2533
- if (constructorInitCount || instanceInitCount) {
2534
- txNodeList* itemsList = (txNodeList*)(parser->root);
2535
- txNodeList* constructorInitList = C_NULL;
2536
- txNode** constructorInitAddress = C_NULL;
2537
- txNodeList* instanceInitList = C_NULL;
2538
- txNode** instanceInitAddress = C_NULL;
2539
- txNode** address;
2540
- txNode* item;
2541
- if (constructorInitCount) {
2542
- fxPushNULL(parser);
2543
- fxPushNodeList(parser, 0);
2544
- fxPushNodeStruct(parser, 1, XS_TOKEN_PARAMS_BINDING, aLine);
2545
- fxPushNodeList(parser, 0);
2546
- constructorInitList = (txNodeList*)(parser->root);
2547
- constructorInitList->length = constructorInitCount;
2548
- constructorInitAddress = &(((txNodeList*)(parser->root))->first);
2549
- fxPushNodeStruct(parser, 1, XS_TOKEN_STATEMENTS, aLine);
2550
- fxPushNodeStruct(parser, 1, XS_TOKEN_BODY, aLine);
2551
- fxPushNodeStruct(parser, 3, XS_TOKEN_FUNCTION, aLine);
2552
- parser->root->flags = mxStrictFlag | mxSuperFlag | mxFieldFlag;
2553
- }
2554
- else
2555
- fxPushNULL(parser);
2556
- if (instanceInitCount) {
2557
- fxPushNULL(parser);
2558
- fxPushNodeList(parser, 0);
2559
- fxPushNodeStruct(parser, 1, XS_TOKEN_PARAMS_BINDING, aLine);
2560
- fxPushNodeList(parser, 0);
2561
- instanceInitList = (txNodeList*)(parser->root);
2562
- instanceInitList->length = instanceInitCount;
2563
- instanceInitAddress = &(((txNodeList*)(parser->root))->first);
2564
- fxPushNodeStruct(parser, 1, XS_TOKEN_STATEMENTS, aLine);
2565
- fxPushNodeStruct(parser, 1, XS_TOKEN_BODY, aLine);
2566
- fxPushNodeStruct(parser, 3, XS_TOKEN_FUNCTION, aLine);
2567
- parser->root->flags = mxStrictFlag | mxSuperFlag | mxFieldFlag;
2568
- }
2569
- else
2570
- fxPushNULL(parser);
2571
- address = &(itemsList->first);
2572
- while ((item = *address)) {
2573
- if (item->flags & (mxMethodFlag | mxGetterFlag | mxSetterFlag)) {
2574
- if (item->description->token == XS_TOKEN_PRIVATE_PROPERTY) {
2575
- txFieldNode* field = fxFieldNodeNew(parser, XS_TOKEN_FIELD);
2576
- field->item = item;
2577
- if (item->flags & mxStaticFlag) {
2578
- *constructorInitAddress = (txNode*)field;
2579
- constructorInitAddress = &field->next;
2580
- }
2581
- else {
2582
- *instanceInitAddress = (txNode*)field;
2583
- instanceInitAddress = &field->next;
2584
- }
2585
- }
2586
- }
2587
- address = &(item->next);
2588
- }
2589
- address = &(itemsList->first);
2590
- while ((item = *address)) {
2591
- if (item->description->token == XS_TOKEN_BODY) {
2592
- *address = item->next;
2593
- item->next = C_NULL;
2594
- itemsList->length--;
2595
- *constructorInitAddress = (txNode*)item;
2596
- constructorInitAddress = &item->next;
2597
- }
2598
- else if (item->flags & (mxMethodFlag | mxGetterFlag | mxSetterFlag)) {
2599
- address = &(item->next);
2600
- }
2601
- else {
2602
- txFieldNode* field = fxFieldNodeNew(parser, XS_TOKEN_FIELD);
2603
- field->item = item;
2604
- if (item->description->token == XS_TOKEN_PROPERTY) {
2605
- field->value = ((txPropertyNode*)item)->value;
2606
- ((txPropertyNode*)item)->value = C_NULL;
2607
- }
2608
- else if (item->description->token == XS_TOKEN_PROPERTY_AT) {
2609
- field->value = ((txPropertyAtNode*)item)->value;
2610
- ((txPropertyAtNode*)item)->value = C_NULL;
2611
- }
2612
- else {
2613
- field->value = ((txPrivatePropertyNode*)item)->value;
2614
- ((txPrivatePropertyNode*)item)->value = C_NULL;
2615
- }
2616
- if (item->flags & mxStaticFlag) {
2617
- *constructorInitAddress = (txNode*)field;
2618
- constructorInitAddress = &field->next;
2619
- }
2620
- else {
2621
- *instanceInitAddress = (txNode*)field;
2622
- instanceInitAddress = &field->next;
2623
- }
2624
- address = &(item->next);
2625
- }
2626
- }
2627
- }
2628
- else {
2629
- fxPushNULL(parser);
2630
- fxPushNULL(parser);
2631
- }
2632
- if (constructor) {
2633
- fxPushNode(parser, constructor);
2634
- }
2635
- else {
2636
- if (heritageFlag) {
2637
- fxPushNULL(parser);
2638
-
2639
- fxPushSymbol(parser, parser->argsSymbol);
2640
- fxPushNULL(parser);
2641
- fxPushNodeStruct(parser, 2, XS_TOKEN_ARG, aLine);
2642
- fxPushNodeStruct(parser, 1, XS_TOKEN_REST_BINDING, aLine);
2643
- fxPushNodeList(parser, 1);
2644
- fxPushNodeStruct(parser, 1, XS_TOKEN_PARAMS_BINDING, aLine);
2645
-
2646
- fxPushSymbol(parser, parser->argsSymbol);
2647
- fxPushNodeStruct(parser, 1, XS_TOKEN_ACCESS, aLine);
2648
- fxPushNodeStruct(parser, 1, XS_TOKEN_SPREAD, aLine);
2649
- fxPushNodeList(parser, 1);
2650
- fxPushNodeStruct(parser, 1, XS_TOKEN_PARAMS, aLine);
2651
- parser->root->flags |= mxSpreadFlag;
2652
- fxPushNodeStruct(parser, 1, XS_TOKEN_SUPER, aLine);
2653
- fxPushNodeStruct(parser, 1, XS_TOKEN_STATEMENT, aLine);
2654
- fxPushNodeStruct(parser, 1, XS_TOKEN_BODY, aLine);
2655
-
2656
- fxPushNodeStruct(parser, 3, XS_TOKEN_FUNCTION, aLine);
2657
- parser->root->flags = mxStrictFlag | mxDerivedFlag | mxMethodFlag | mxTargetFlag | mxSuperFlag;
2658
- }
2659
- else {
2660
- fxPushNULL(parser);
2661
-
2662
- fxPushNodeList(parser, 0);
2663
- fxPushNodeStruct(parser, 1, XS_TOKEN_PARAMS_BINDING, aLine);
2664
-
2665
- fxPushNodeStruct(parser, 0, XS_TOKEN_UNDEFINED, aLine);
2666
- fxPushNodeStruct(parser, 1, XS_TOKEN_STATEMENT, aLine);
2667
- fxPushNodeStruct(parser, 1, XS_TOKEN_BODY, aLine);
2668
-
2669
- fxPushNodeStruct(parser, 3, XS_TOKEN_FUNCTION, aLine);
2670
- parser->root->flags = mxStrictFlag | mxBaseFlag | mxMethodFlag | mxTargetFlag;
2671
- }
2672
- }
2673
- fxPushNodeStruct(parser, 6, XS_TOKEN_CLASS, aLine);
2674
- parser->flags = flags | (parser->flags & (mxArgumentsFlag));
2675
- }
2676
-
2677
- void fxFunctionExpression(txParser* parser, txInteger theLine, txSymbol** theSymbol, txUnsigned flag)
2678
- {
2679
- txUnsigned flags = parser->flags;
2680
- parser->flags = (flags & (mxParserFlags | mxStrictFlag)) | mxFunctionFlag | mxTargetFlag | flag;
2681
- if ((parser->token == XS_TOKEN_IDENTIFIER)
2682
- || ((flags & mxGeneratorFlag) && !(flags & mxStrictFlag) && (parser->token == XS_TOKEN_YIELD))
2683
- || ((theSymbol == C_NULL) && (parser->token == XS_TOKEN_AWAIT))) {
2684
- fxPushSymbol(parser, parser->symbol);
2685
- if (theSymbol)
2686
- *theSymbol = parser->symbol;
2687
- fxCheckStrictSymbol(parser, parser->symbol);
2688
- fxGetNextToken(parser);
2689
- }
2690
- else
2691
- fxPushNULL(parser);
2692
- fxParametersBinding(parser);
2693
- if (parser->token == XS_TOKEN_HOST) {
2694
- fxGetNextToken(parser);
2695
- if (parser->token == XS_TOKEN_STRING) {
2696
- fxPushStringNode(parser, parser->stringLength, parser->string, theLine);
2697
- fxGetNextToken(parser);
2698
- }
2699
- else {
2700
- fxReportParserError(parser, parser->line, "invalid host function");
2701
- fxPushNULL(parser);
2702
- }
2703
- fxPushNodeStruct(parser, 3, XS_TOKEN_HOST, theLine);
2704
- parser->root->flags = parser->flags & (mxStrictFlag | mxNotSimpleParametersFlag | mxTargetFlag | mxArgumentsFlag | mxEvalFlag | flag);
2705
- if (!(flags & mxStrictFlag) && (parser->flags & mxStrictFlag))
2706
- fxCheckStrictFunction(parser, (txFunctionNode*)parser->root);
2707
- parser->flags = flags;
2708
- }
2709
- else {
2710
- fxMatchToken(parser, XS_TOKEN_LEFT_BRACE);
2711
- fxBody(parser);
2712
- fxPushNodeStruct(parser, 1, XS_TOKEN_BODY, theLine);
2713
- fxPushNodeStruct(parser, 3, XS_TOKEN_FUNCTION, theLine);
2714
- parser->root->flags = parser->flags & (mxStrictFlag | mxNotSimpleParametersFlag | mxTargetFlag | mxArgumentsFlag | mxEvalFlag | flag);
2715
- if (!(flags & mxStrictFlag) && (parser->flags & mxStrictFlag))
2716
- fxCheckStrictFunction(parser, (txFunctionNode*)parser->root);
2717
- parser->flags = flags;
2718
- fxMatchToken(parser, XS_TOKEN_RIGHT_BRACE);
2719
- }
2720
- }
2721
-
2722
- void fxGeneratorExpression(txParser* parser, txInteger theLine, txSymbol** theSymbol, txUnsigned flag)
2723
- {
2724
- txUnsigned flags = parser->flags;
2725
- parser->flags = (flags & (mxParserFlags | mxStrictFlag)) | mxGeneratorFlag | mxTargetFlag | flag;
2726
- if ((parser->token == XS_TOKEN_IDENTIFIER)
2727
- || ((theSymbol == C_NULL) && (parser->token == XS_TOKEN_AWAIT))) {
2728
- fxPushSymbol(parser, parser->symbol);
2729
- if (theSymbol)
2730
- *theSymbol = parser->symbol;
2731
- else if (parser->symbol == parser->yieldSymbol)
2732
- fxReportParserError(parser, parser->line, "invalid yield");
2733
- else if ((parser->flags & mxAsyncFlag) && (parser->symbol == parser->awaitSymbol))
2734
- fxReportParserError(parser, parser->line, "invalid await");
2735
- fxCheckStrictSymbol(parser, parser->symbol);
2736
- fxGetNextToken(parser);
2737
- }
2738
- else
2739
- fxPushNULL(parser);
2740
- fxParametersBinding(parser);
2741
- fxMatchToken(parser, XS_TOKEN_LEFT_BRACE);
2742
- parser->flags |= mxYieldFlag;
2743
- fxBody(parser);
2744
- parser->flags &= ~mxYieldFlag;
2745
- fxPushNodeStruct(parser, 1, XS_TOKEN_BODY, theLine);
2746
- fxPushNodeStruct(parser, 3, XS_TOKEN_GENERATOR, theLine);
2747
- parser->root->flags = parser->flags & (mxStrictFlag | mxNotSimpleParametersFlag | mxGeneratorFlag | mxArgumentsFlag | mxEvalFlag | flag);
2748
- if (!(flags & mxStrictFlag) && (parser->flags & mxStrictFlag))
2749
- fxCheckStrictFunction(parser, (txFunctionNode*)parser->root);
2750
- parser->flags = flags;
2751
- fxMatchToken(parser, XS_TOKEN_RIGHT_BRACE);
2752
- }
2753
-
2754
- void fxGroupExpression(txParser* parser, txUnsigned flag)
2755
- {
2756
- txBoolean commaFlag = 0;
2757
- txBoolean spreadFlag = 0;
2758
- txInteger aCount = 0;
2759
- txInteger aLine;
2760
- txUnsigned formerAwaitingYieldingFlags = parser->flags & (mxAwaitingFlag | mxYieldingFlag);
2761
- parser->flags &= ~(mxAwaitingFlag | mxYieldingFlag);
2762
- fxMatchToken(parser, XS_TOKEN_LEFT_PARENTHESIS);
2763
- while ((parser->token == XS_TOKEN_SPREAD) || (gxTokenFlags[parser->token] & XS_TOKEN_BEGIN_EXPRESSION)) {
2764
- aLine = parser->line;
2765
- commaFlag = 0;
2766
- if (parser->token == XS_TOKEN_SPREAD) {
2767
- fxGetNextToken(parser);
2768
- fxAssignmentExpression(parser);
2769
- fxPushNodeStruct(parser, 1, XS_TOKEN_SPREAD, aLine);
2770
- spreadFlag = 1;
2771
- }
2772
- else
2773
- fxAssignmentExpression(parser);
2774
- aCount++;
2775
- if (parser->token != XS_TOKEN_COMMA)
2776
- break;
2777
- fxGetNextToken(parser);
2778
- commaFlag = 1;
2779
- }
2780
- aLine = parser->line;
2781
- fxMatchToken(parser, XS_TOKEN_RIGHT_PARENTHESIS);
2782
- if ((!parser->crlf) && (parser->token == XS_TOKEN_ARROW)) {
2783
- fxPushNodeList(parser, aCount);
2784
- fxPushNodeStruct(parser, 1, XS_TOKEN_EXPRESSIONS, aLine);
2785
- if (commaFlag && spreadFlag)
2786
- fxReportParserError(parser, parser->line, "invalid parameters");
2787
- if (!fxParametersBindingFromExpressions(parser, parser->root))
2788
- fxReportParserError(parser, parser->line, "no parameters");
2789
- fxCheckStrictBinding(parser, parser->root);
2790
- parser->root->flags |= flag;
2791
- if (parser->flags & mxAwaitingFlag) {
2792
- if (flag || (parser->flags & mxAsyncFlag))
2793
- fxReportParserError(parser, parser->line, "invalid await");
2794
- else
2795
- formerAwaitingYieldingFlags |= mxAwaitingFlag;
2796
- }
2797
- if (parser->flags & mxYieldingFlag)
2798
- fxReportParserError(parser, parser->line, "invalid yield");
2799
- fxArrowExpression(parser, flag);
2800
- }
2801
- else if (flag) {
2802
- fxPushNodeList(parser, aCount);
2803
- fxPushNodeStruct(parser, 1, XS_TOKEN_PARAMS, aLine);
2804
- if (spreadFlag)
2805
- parser->root->flags |= mxSpreadFlag;
2806
-
2807
- fxPushSymbol(parser, parser->asyncSymbol);
2808
- fxPushNodeStruct(parser, 1, XS_TOKEN_ACCESS, aLine);
2809
- fxSwapNodes(parser);
2810
- fxPushNodeStruct(parser, 2, XS_TOKEN_CALL, aLine);
2811
- }
2812
- else {
2813
- if ((aCount == 0) || commaFlag) {
2814
- fxPushNULL(parser);
2815
- fxReportParserError(parser, parser->line, "missing expression");
2816
- }
2817
- else /*if (aCount > 1)*/ {
2818
- fxPushNodeList(parser, aCount);
2819
- fxPushNodeStruct(parser, 1, XS_TOKEN_EXPRESSIONS, aLine);
2820
- }
2821
- }
2822
- parser->flags |= formerAwaitingYieldingFlags;
2823
- }
2824
-
2825
- void fxNewExpression(txParser* parser)
2826
- {
2827
- txInteger aLine = parser->line;
2828
- fxMatchToken(parser, XS_TOKEN_NEW);
2829
- if (parser->token == XS_TOKEN_DOT) {
2830
- fxGetNextToken(parser);
2831
- if (fxIsKeyword(parser, parser->targetSymbol)) {
2832
- if (!(parser->flags & mxTargetFlag))
2833
- fxReportParserError(parser, parser->line, "invalid new.target");
2834
- fxGetNextToken(parser);
2835
- fxPushNodeStruct(parser, 0, XS_TOKEN_TARGET, aLine);
2836
- }
2837
- else
2838
- fxReportParserError(parser, parser->line, "missing target");
2839
- return;
2840
- }
2841
- fxLiteralExpression(parser, 1);
2842
- fxCheckArrowFunction(parser, 1);
2843
- for (;;) {
2844
- txInteger aMemberLine = parser->line;
2845
- if (parser->token == XS_TOKEN_DOT) {
2846
- fxGetNextToken(parser);
2847
- if (parser->token == XS_TOKEN_IDENTIFIER) {
2848
- fxPushSymbol(parser, parser->symbol);
2849
- fxPushNodeStruct(parser, 2, XS_TOKEN_MEMBER, aMemberLine);
2850
- fxGetNextToken(parser);
2851
- }
2852
- else if (parser->token == XS_TOKEN_PRIVATE_IDENTIFIER) {
2853
- fxPushSymbol(parser, parser->symbol);
2854
- fxSwapNodes(parser);
2855
- fxPushNodeStruct(parser, 2, XS_TOKEN_PRIVATE_MEMBER, aMemberLine);
2856
- fxGetNextToken(parser);
2857
- }
2858
- else
2859
- fxReportParserError(parser, parser->line, "missing property");
2860
- }
2861
- else if (parser->token == XS_TOKEN_LEFT_BRACKET) {
2862
- fxGetNextToken(parser);
2863
- fxCommaExpression(parser);
2864
- fxPushNodeStruct(parser, 2, XS_TOKEN_MEMBER_AT, aMemberLine);
2865
- fxMatchToken(parser, XS_TOKEN_RIGHT_BRACKET);
2866
- }
2867
- else if (parser->token == XS_TOKEN_TEMPLATE) {
2868
- fxPushStringNode(parser, parser->stringLength, parser->string, aLine);
2869
- fxPushRawNode(parser, parser->rawLength, parser->raw, aLine);
2870
- fxPushNodeStruct(parser, 2, XS_TOKEN_TEMPLATE_MIDDLE, aLine);
2871
- fxGetNextToken(parser);
2872
- fxPushNodeList(parser, 1);
2873
- fxPushNodeStruct(parser, 2, XS_TOKEN_TEMPLATE, aLine);
2874
- }
2875
- else if (parser->token == XS_TOKEN_TEMPLATE_HEAD) {
2876
- fxTemplateExpression(parser);
2877
- fxPushNodeStruct(parser, 2, XS_TOKEN_TEMPLATE, aLine);
2878
- }
2879
- else
2880
- break;
2881
- }
2882
- if (parser->token == XS_TOKEN_LEFT_PARENTHESIS)
2883
- fxParameters(parser);
2884
- else {
2885
- fxPushNodeList(parser, 0);
2886
- fxPushNodeStruct(parser, 1, XS_TOKEN_PARAMS, aLine);
2887
- }
2888
- fxPushNodeStruct(parser, 2, XS_TOKEN_NEW, aLine);
2889
- }
2890
-
2891
- void fxObjectExpression(txParser* parser)
2892
- {
2893
- txInteger aCount = 0;
2894
- txSymbol* aSymbol;
2895
- txToken aToken0;
2896
- txToken aToken1;
2897
- txToken aToken2;
2898
- txInteger aLine = parser->line;
2899
- txNode* base = parser->root;
2900
- fxMatchToken(parser, XS_TOKEN_LEFT_BRACE);
2901
- for (;;) {
2902
- txInteger aPropertyLine = parser->line;
2903
- txUnsigned flags = 0;
2904
- if (parser->token == XS_TOKEN_RIGHT_BRACE)
2905
- break;
2906
- if (parser->token == XS_TOKEN_SPREAD) {
2907
- fxGetNextToken(parser);
2908
- fxAssignmentExpression(parser);
2909
- fxPushNodeStruct(parser, 1, XS_TOKEN_SPREAD, aPropertyLine);
2910
- }
2911
- else {
2912
- fxPropertyName(parser, &aSymbol, &aToken0, &aToken1, &aToken2, &flags);
2913
- if (aToken1 == XS_TOKEN_PRIVATE_PROPERTY) {
2914
- fxReportParserError(parser, parser->line, "invalid private property");
2915
- }
2916
- else if ((aToken2 == XS_TOKEN_GETTER) || (aToken2 == XS_TOKEN_SETTER)) {
2917
- flags |= mxShorthandFlag;
2918
- if (aToken2 == XS_TOKEN_GETTER)
2919
- flags |= mxGetterFlag;
2920
- else if (aToken2 == XS_TOKEN_SETTER)
2921
- flags |= mxSetterFlag;
2922
- if (parser->token == XS_TOKEN_LEFT_PARENTHESIS)
2923
- fxFunctionExpression(parser, aPropertyLine, C_NULL, mxSuperFlag);
2924
- else
2925
- fxReportParserError(parser, parser->line, "missing (");
2926
- }
2927
- else if (aToken2 == XS_TOKEN_GENERATOR) {
2928
- flags |= mxShorthandFlag | mxMethodFlag;
2929
- if (parser->token == XS_TOKEN_LEFT_PARENTHESIS)
2930
- fxGeneratorExpression(parser, aPropertyLine, C_NULL, mxSuperFlag | flags);
2931
- else
2932
- fxReportParserError(parser, parser->line, "missing (");
2933
- }
2934
- else if (aToken2 == XS_TOKEN_FUNCTION) {
2935
- flags |= mxShorthandFlag | mxMethodFlag;
2936
- if (parser->token == XS_TOKEN_LEFT_PARENTHESIS)
2937
- fxFunctionExpression(parser, aPropertyLine, C_NULL, mxSuperFlag | flags);
2938
- else
2939
- fxReportParserError(parser, parser->line, "missing (");
2940
- }
2941
- else if (parser->token == XS_TOKEN_LEFT_PARENTHESIS) {
2942
- flags |= mxShorthandFlag | mxMethodFlag;
2943
- fxFunctionExpression(parser, aPropertyLine, C_NULL, mxSuperFlag | flags);
2944
- }
2945
- else if (parser->token == XS_TOKEN_COLON) {
2946
- fxGetNextToken(parser);
2947
- fxAssignmentExpression(parser);
2948
- }
2949
- else if (aToken1 == XS_TOKEN_PROPERTY) {
2950
- flags |= mxShorthandFlag;
2951
- fxPushSymbol(parser, aSymbol);
2952
- if (parser->token == XS_TOKEN_ASSIGN) {
2953
- fxPushNodeStruct(parser, 1, XS_TOKEN_ACCESS, aPropertyLine);
2954
- fxGetNextToken(parser);
2955
- fxAssignmentExpression(parser);
2956
- fxPushNodeStruct(parser, 2, XS_TOKEN_BINDING, aPropertyLine);
2957
- }
2958
- else if (aToken0 == XS_TOKEN_IDENTIFIER) {
2959
- fxPushNodeStruct(parser, 1, XS_TOKEN_ACCESS, aPropertyLine);
2960
- }
2961
- else {
2962
- fxReportParserError(parser, parser->line, "invalid identifier");
2963
- fxPushNodeStruct(parser, 0, XS_TOKEN_UNDEFINED, aPropertyLine);
2964
- }
2965
- }
2966
- else {
2967
- fxReportParserError(parser, parser->line, "missing :");
2968
- fxPushNodeStruct(parser, 0, XS_TOKEN_UNDEFINED, aPropertyLine);
2969
- }
2970
- fxPushNodeStruct(parser, 2, aToken1, aPropertyLine);
2971
- parser->root->flags |= flags;
2972
- fxCheckUniqueProperty(parser, base, parser->root);
2973
- }
2974
- aCount++;
2975
- if (parser->token == XS_TOKEN_RIGHT_BRACE)
2976
- break;
2977
- fxMatchToken(parser, XS_TOKEN_COMMA);
2978
- }
2979
- fxMatchToken(parser, XS_TOKEN_RIGHT_BRACE);
2980
- fxPushNodeList(parser, aCount);
2981
- fxPushNodeStruct(parser, 1, XS_TOKEN_OBJECT, aLine);
2982
- }
2983
-
2984
- void fxTemplateExpression(txParser* parser)
2985
- {
2986
- txInteger aCount = 0;
2987
- txInteger aLine = parser->line;
2988
- fxPushStringNode(parser, parser->stringLength, parser->string, aLine);
2989
- fxPushRawNode(parser, parser->rawLength, parser->raw, aLine);
2990
- fxPushNodeStruct(parser, 2, XS_TOKEN_TEMPLATE_MIDDLE, aLine);
2991
- aCount++;
2992
- for (;;) {
2993
- fxGetNextToken(parser);
2994
- if (parser->token != XS_TOKEN_RIGHT_BRACE) {
2995
- fxCommaExpression(parser);
2996
- aCount++;
2997
- }
2998
- if (parser->token != XS_TOKEN_RIGHT_BRACE) {
2999
- fxReportParserError(parser, parser->line, "missing }");
3000
- }
3001
- fxGetNextTokenTemplate(parser);
3002
- fxPushStringNode(parser, parser->stringLength, parser->string, aLine);
3003
- fxPushRawNode(parser, parser->rawLength, parser->raw, aLine);
3004
- fxPushNodeStruct(parser, 2, XS_TOKEN_TEMPLATE_MIDDLE, aLine);
3005
- aCount++;
3006
- if (parser->token == XS_TOKEN_TEMPLATE_TAIL) {
3007
- fxGetNextToken(parser);
3008
- break;
3009
- }
3010
- }
3011
- fxPushNodeList(parser, aCount);
3012
- }
3013
-
3014
- void fxYieldExpression(txParser* parser)
3015
- {
3016
- txInteger aLine = parser->line;
3017
- if (!(parser->flags & mxYieldFlag))
3018
- fxReportParserError(parser, parser->line, "invalid yield");
3019
- else
3020
- parser->flags |= mxYieldingFlag;
3021
- fxMatchToken(parser, XS_TOKEN_YIELD);
3022
- if ((!parser->crlf) && (parser->token == XS_TOKEN_MULTIPLY)) {
3023
- fxGetNextToken(parser);
3024
- fxAssignmentExpression(parser);
3025
- fxPushNodeStruct(parser, 1, XS_TOKEN_DELEGATE, aLine);
3026
- return;
3027
- }
3028
- if ((!parser->crlf) && (gxTokenFlags[parser->token] & XS_TOKEN_BEGIN_EXPRESSION)) {
3029
- fxAssignmentExpression(parser);
3030
- }
3031
- else {
3032
- fxPushNodeStruct(parser, 0, XS_TOKEN_UNDEFINED, aLine);
3033
- }
3034
- fxPushNodeStruct(parser, 1, XS_TOKEN_YIELD, aLine);
3035
- }
3036
-
3037
- void fxParameters(txParser* parser)
3038
- {
3039
- txInteger aCount = 0;
3040
- txInteger aLine = parser->line;
3041
- txBoolean aSpreadFlag = 0;
3042
- fxMatchToken(parser, XS_TOKEN_LEFT_PARENTHESIS);
3043
- while ((parser->token == XS_TOKEN_SPREAD) || (gxTokenFlags[parser->token] & XS_TOKEN_BEGIN_EXPRESSION)) {
3044
- txInteger aParamLine = parser->line;
3045
- if (parser->token == XS_TOKEN_SPREAD) {
3046
- fxGetNextToken(parser);
3047
- fxAssignmentExpression(parser);
3048
- fxPushNodeStruct(parser, 1, XS_TOKEN_SPREAD, aParamLine);
3049
- aSpreadFlag = 1;
3050
- }
3051
- else
3052
- fxAssignmentExpression(parser);
3053
- aCount++;
3054
- if (parser->token != XS_TOKEN_RIGHT_PARENTHESIS)
3055
- fxMatchToken(parser, XS_TOKEN_COMMA);
3056
- }
3057
- fxMatchToken(parser, XS_TOKEN_RIGHT_PARENTHESIS);
3058
- fxPushNodeList(parser, aCount);
3059
- fxPushNodeStruct(parser, 1, XS_TOKEN_PARAMS, aLine);
3060
- if (aSpreadFlag)
3061
- parser->root->flags |= mxSpreadFlag;
3062
- }
3063
-
3064
- void fxPropertyName(txParser* parser, txSymbol** theSymbol, txToken* theToken0, txToken* theToken1, txToken* theToken2, txUnsigned* flag)
3065
- {
3066
- txSymbol* aSymbol = C_NULL;
3067
- txToken aToken0 = XS_NO_TOKEN;
3068
- txToken aToken1 = XS_NO_TOKEN;
3069
- txToken aToken2 = XS_NO_TOKEN;
3070
- txInteger aLine = parser->line;
3071
- txIndex index;
3072
- *flag = 0;
3073
- fxGetNextToken2(parser);
3074
- aToken0 = parser->token;
3075
- if ((gxTokenFlags[aToken0] & XS_TOKEN_IDENTIFIER_NAME)) {
3076
- aSymbol = parser->symbol;
3077
- if (parser->token2 == XS_TOKEN_COLON) {
3078
- fxPushSymbol(parser, aSymbol);
3079
- aToken1 = XS_TOKEN_PROPERTY;
3080
- }
3081
- else if (fxIsKeyword(parser, parser->asyncSymbol) && (!parser->crlf2)) {
3082
- *flag = mxAsyncFlag;
3083
- fxGetNextToken(parser);
3084
- if (parser->token == XS_TOKEN_MULTIPLY) {
3085
- aToken2 = XS_TOKEN_GENERATOR;
3086
- fxGetNextToken(parser);
3087
- }
3088
- else
3089
- aToken2 = XS_TOKEN_FUNCTION;
3090
- }
3091
- else if (fxIsKeyword(parser, parser->getSymbol)) {
3092
- aToken2 = XS_TOKEN_GETTER;
3093
- fxGetNextToken(parser);
3094
- }
3095
- else if (fxIsKeyword(parser, parser->setSymbol)) {
3096
- aToken2 = XS_TOKEN_SETTER;
3097
- fxGetNextToken(parser);
3098
- }
3099
- else {
3100
- fxPushSymbol(parser, aSymbol);
3101
- aToken1 = XS_TOKEN_PROPERTY;
3102
- }
3103
- }
3104
- else if (parser->token == XS_TOKEN_MULTIPLY) {
3105
- aToken2 = XS_TOKEN_GENERATOR;
3106
- fxGetNextToken(parser);
3107
- }
3108
- else if (parser->token == XS_TOKEN_PRIVATE_IDENTIFIER) {
3109
- aSymbol = parser->symbol;
3110
- fxPushSymbol(parser, aSymbol);
3111
- aToken1 = XS_TOKEN_PRIVATE_PROPERTY;
3112
- }
3113
- else if (parser->token == XS_TOKEN_INTEGER) {
3114
- if (fxIntegerToIndex(parser->dtoa, parser->integer, &index)) {
3115
- fxPushIndexNode(parser, index, aLine);
3116
- aToken1 = XS_TOKEN_PROPERTY_AT;
3117
- }
3118
- else {
3119
- aSymbol = fxNewParserSymbol(parser, fxIntegerToString(parser->dtoa, parser->integer, parser->buffer, parser->bufferSize));
3120
- fxPushSymbol(parser, aSymbol);
3121
- aToken1 = XS_TOKEN_PROPERTY;
3122
- }
3123
- }
3124
- else if (parser->token == XS_TOKEN_NUMBER) {
3125
- if (fxNumberToIndex(parser->dtoa, parser->number, &index)) {
3126
- fxPushIndexNode(parser, index, aLine);
3127
- aToken1 = XS_TOKEN_PROPERTY_AT;
3128
- }
3129
- else {
3130
- aSymbol = fxNewParserSymbol(parser, fxNumberToString(parser->dtoa, parser->number, parser->buffer, parser->bufferSize, 0, 0));
3131
- fxPushSymbol(parser, aSymbol);
3132
- aToken1 = XS_TOKEN_PROPERTY;
3133
- }
3134
- }
3135
- else if (parser->token == XS_TOKEN_STRING) {
3136
- if (fxStringToIndex(parser->dtoa, parser->string, &index)) {
3137
- fxPushIndexNode(parser, index, aLine);
3138
- aToken1 = XS_TOKEN_PROPERTY_AT;
3139
- }
3140
- else {
3141
- aSymbol = fxNewParserSymbol(parser, parser->string);
3142
- fxPushSymbol(parser, aSymbol);
3143
- aToken1 = XS_TOKEN_PROPERTY;
3144
- }
3145
- }
3146
- else if (parser->token == XS_TOKEN_LEFT_BRACKET) {
3147
- fxGetNextToken(parser);
3148
- fxCommaExpression(parser);
3149
- if (parser->token != XS_TOKEN_RIGHT_BRACKET) {
3150
- fxReportParserError(parser, parser->line, "missing ]");
3151
- }
3152
- aToken1 = XS_TOKEN_PROPERTY_AT;
3153
- }
3154
- else {
3155
- fxReportParserError(parser, parser->line, "missing identifier");
3156
- fxPushNULL(parser);
3157
- }
3158
- if (aToken2 != XS_NO_TOKEN) {
3159
- if ((gxTokenFlags[parser->token] & XS_TOKEN_IDENTIFIER_NAME)) {
3160
- aSymbol = parser->symbol;
3161
- fxPushSymbol(parser, aSymbol);
3162
- aToken1 = XS_TOKEN_PROPERTY;
3163
- fxGetNextToken(parser);
3164
- }
3165
- else if (parser->token == XS_TOKEN_PRIVATE_IDENTIFIER) {
3166
- aSymbol = parser->symbol;
3167
- fxPushSymbol(parser, aSymbol);
3168
- aToken1 = XS_TOKEN_PRIVATE_PROPERTY;
3169
- fxGetNextToken(parser);
3170
- }
3171
- else if (parser->token == XS_TOKEN_INTEGER) {
3172
- if (fxIntegerToIndex(parser->dtoa, parser->integer, &index)) {
3173
- fxPushIndexNode(parser, index, aLine);
3174
- aToken1 = XS_TOKEN_PROPERTY_AT;
3175
- }
3176
- else {
3177
- aSymbol = fxNewParserSymbol(parser, fxIntegerToString(parser->dtoa, parser->integer, parser->buffer, parser->bufferSize));
3178
- fxPushSymbol(parser, aSymbol);
3179
- aToken1 = XS_TOKEN_PROPERTY;
3180
- }
3181
- fxGetNextToken(parser);
3182
- }
3183
- else if (parser->token == XS_TOKEN_NUMBER) {
3184
- if (fxNumberToIndex(parser->dtoa, parser->number, &index)) {
3185
- fxPushIndexNode(parser, index, aLine);
3186
- aToken1 = XS_TOKEN_PROPERTY_AT;
3187
- }
3188
- else {
3189
- aSymbol = fxNewParserSymbol(parser, fxNumberToString(parser->dtoa, parser->number, parser->buffer, parser->bufferSize, 0, 0));
3190
- fxPushSymbol(parser, aSymbol);
3191
- aToken1 = XS_TOKEN_PROPERTY;
3192
- }
3193
- fxGetNextToken(parser);
3194
- }
3195
- else if (parser->token == XS_TOKEN_STRING) {
3196
- if (fxStringToIndex(parser->dtoa, parser->string, &index)) {
3197
- fxPushIndexNode(parser, index, aLine);
3198
- aToken1 = XS_TOKEN_PROPERTY_AT;
3199
- }
3200
- else {
3201
- aSymbol = fxNewParserSymbol(parser, parser->string);
3202
- fxPushSymbol(parser, aSymbol);
3203
- aToken1 = XS_TOKEN_PROPERTY;
3204
- }
3205
- fxGetNextToken(parser);
3206
- }
3207
- else if (parser->token == XS_TOKEN_LEFT_BRACKET) {
3208
- fxGetNextToken(parser);
3209
- fxCommaExpression(parser);
3210
- if (parser->token != XS_TOKEN_RIGHT_BRACKET) {
3211
- fxReportParserError(parser, parser->line, "missing ]");
3212
- }
3213
- aToken1 = XS_TOKEN_PROPERTY_AT;
3214
- fxGetNextToken(parser);
3215
- }
3216
- else if (aToken2 == XS_TOKEN_GETTER) {
3217
- fxPushSymbol(parser, aSymbol);
3218
- aToken1 = XS_TOKEN_PROPERTY;
3219
- aToken2 = XS_NO_TOKEN;
3220
- }
3221
- else if (aToken2 == XS_TOKEN_SETTER) {
3222
- fxPushSymbol(parser, aSymbol);
3223
- aToken1 = XS_TOKEN_PROPERTY;
3224
- aToken2 = XS_NO_TOKEN;
3225
- }
3226
- else {
3227
- fxReportParserError(parser, parser->line, "missing identifier");
3228
- fxPushNULL(parser);
3229
- }
3230
- }
3231
- else
3232
- fxGetNextToken(parser);
3233
- *theSymbol = aSymbol;
3234
- *theToken0 = aToken0;
3235
- *theToken1 = aToken1;
3236
- *theToken2 = aToken2;
3237
- }
3238
-
3239
- void fxBinding(txParser* parser, txToken theToken, txFlag initializeIt)
3240
- {
3241
- txInteger aLine = parser->line;
3242
- fxCheckParserStack(parser, aLine);
3243
- if (parser->token == XS_TOKEN_IDENTIFIER) {
3244
- fxCheckStrictSymbol(parser, parser->symbol);
3245
- if (((theToken == XS_TOKEN_CONST) || (theToken == XS_TOKEN_LET)) && (parser->symbol == parser->letSymbol))
3246
- fxReportParserError(parser, parser->line, "invalid identifier");
3247
- fxPushSymbol(parser, parser->symbol);
3248
- fxPushNodeStruct(parser, 1, theToken, aLine);
3249
- fxGetNextToken(parser);
3250
- }
3251
- else if (parser->token == XS_TOKEN_LEFT_BRACE) {
3252
- fxObjectBinding(parser, theToken);
3253
- }
3254
- else if (parser->token == XS_TOKEN_LEFT_BRACKET) {
3255
- fxArrayBinding(parser, theToken);
3256
- }
3257
- else {
3258
- fxReportParserError(parser, parser->line, "missing identifier");
3259
- fxPushNULL(parser);
3260
- }
3261
- if (initializeIt && (parser->token == XS_TOKEN_ASSIGN)) {
3262
- parser->flags &= ~mxForFlag;
3263
- fxGetNextToken(parser);
3264
- fxAssignmentExpression(parser);
3265
- fxPushNodeStruct(parser, 2, XS_TOKEN_BINDING, aLine);
3266
- }
3267
- }
3268
-
3269
- txNode* fxBindingFromExpression(txParser* parser, txNode* theNode, txToken theToken)
3270
- {
3271
- txToken aToken = (theNode && theNode->description) ? theNode->description->token : XS_NO_TOKEN;
3272
- txNode* binding;
3273
- again:
3274
- if (aToken == XS_TOKEN_EXPRESSIONS) {
3275
- txNode* item = ((txExpressionsNode*)theNode)->items->first;
3276
- if (item && !item->next) {
3277
- aToken = item->description->token;
3278
- if ((aToken == XS_TOKEN_ACCESS) || (aToken == XS_TOKEN_MEMBER) || (aToken == XS_TOKEN_MEMBER_AT) || (aToken == XS_TOKEN_PRIVATE_MEMBER) || (aToken == XS_TOKEN_UNDEFINED)) {
3279
- item->next = theNode->next;
3280
- theNode = item;
3281
- }
3282
- else if (aToken == XS_TOKEN_EXPRESSIONS) {
3283
- item->next = theNode->next;
3284
- theNode = item;
3285
- goto again;
3286
- }
3287
- else
3288
- return NULL;
3289
- }
3290
- }
3291
- if (aToken == XS_TOKEN_BINDING) {
3292
- binding = fxBindingFromExpression(parser, ((txBindingNode*)theNode)->target, theToken);
3293
- ((txBindingNode*)theNode)->target = binding;
3294
- // fxCheckStrictBinding(parser, theNode);
3295
- // fxCheckStrictSymbol(parser, ((txBindingNode*)theNode)->symbol);
3296
- // theNode->description = &gxTokenDescriptions[theToken];
3297
- return theNode;
3298
- }
3299
- if (aToken == XS_TOKEN_ARRAY_BINDING) {
3300
- txNodeList* list = ((txArrayBindingNode*)theNode)->items;
3301
- txNode** address = &(list->first);
3302
- txNode* item;
3303
- while ((item = *address)) {
3304
- txNode* binding = *address = fxBindingFromExpression(parser, item, theToken);
3305
- binding->next = item->next;
3306
- address = &(binding->next);
3307
- }
3308
- return theNode;
3309
- }
3310
- if (aToken == XS_TOKEN_OBJECT_BINDING) {
3311
- txNodeList* list = ((txObjectBindingNode*)theNode)->items;
3312
- txNode** address = &(list->first);
3313
- txNode* item;
3314
- while ((item = *address)) {
3315
- txNode* binding = *address = fxBindingFromExpression(parser, item, theToken);
3316
- binding->next = item->next;
3317
- address = &(binding->next);
3318
- }
3319
- return theNode;
3320
- }
3321
- if (aToken == XS_TOKEN_PROPERTY_BINDING) {
3322
- ((txPropertyBindingNode*)theNode)->binding = fxBindingFromExpression(parser, ((txPropertyBindingNode*)theNode)->binding, theToken);
3323
- return theNode;
3324
- }
3325
- if (aToken == XS_TOKEN_PROPERTY_BINDING_AT) {
3326
- ((txPropertyBindingAtNode*)theNode)->binding = fxBindingFromExpression(parser, ((txPropertyBindingAtNode*)theNode)->binding, theToken);
3327
- return theNode;
3328
- }
3329
- if (aToken == XS_TOKEN_REST_BINDING) {
3330
- ((txRestBindingNode*)theNode)->binding = fxBindingFromExpression(parser, ((txRestBindingNode*)theNode)->binding, theToken);
3331
- return theNode;
3332
- }
3333
- if (aToken == XS_TOKEN_SKIP_BINDING)
3334
- return theNode;
3335
-
3336
- if (aToken == XS_TOKEN_ACCESS) {
3337
- fxCheckStrictSymbol(parser, ((txAccessNode*)theNode)->symbol);
3338
- if (theToken == XS_TOKEN_ACCESS)
3339
- return theNode;
3340
- fxPushSymbol(parser, ((txAccessNode*)theNode)->symbol);
3341
- fxPushNodeStruct(parser, 1, theToken, ((txAccessNode*)theNode)->line);
3342
- return fxPopNode(parser);
3343
- }
3344
- if ((aToken == XS_TOKEN_MEMBER) || (aToken == XS_TOKEN_MEMBER_AT) || (aToken == XS_TOKEN_PRIVATE_MEMBER) || (aToken == XS_TOKEN_UNDEFINED)) {
3345
- return theNode;
3346
- }
3347
- if (aToken == XS_TOKEN_ASSIGN) {
3348
- binding = fxBindingFromExpression(parser, ((txAssignNode*)theNode)->reference, theToken);
3349
- if (!binding)
3350
- return NULL;
3351
- ((txBindingNode*)theNode)->description = &gxTokenDescriptions[XS_TOKEN_BINDING];
3352
- ((txBindingNode*)theNode)->target = binding;
3353
- ((txBindingNode*)theNode)->initializer = ((txAssignNode*)theNode)->value;
3354
- return theNode;
3355
- }
3356
-
3357
- if (aToken == XS_TOKEN_ARRAY)
3358
- return fxArrayBindingFromExpression(parser, theNode, theToken);
3359
- if (aToken == XS_TOKEN_OBJECT)
3360
- return fxObjectBindingFromExpression(parser, theNode, theToken);
3361
- return NULL;
3362
- }
3363
-
3364
- void fxArrayBinding(txParser* parser, txToken theToken)
3365
- {
3366
- txInteger aCount = 0;
3367
- txInteger aLine = parser->line;
3368
- int elision = 1;
3369
- fxCheckParserStack(parser, aLine);
3370
- fxMatchToken(parser, XS_TOKEN_LEFT_BRACKET);
3371
- while ((parser->token == XS_TOKEN_COMMA) || (gxTokenFlags[parser->token] & XS_TOKEN_BEGIN_BINDING)) {
3372
- txInteger anItemLine = parser->line;
3373
- if (parser->token == XS_TOKEN_COMMA) {
3374
- fxGetNextToken(parser);
3375
- if (elision) {
3376
- fxPushNodeStruct(parser, 0, XS_TOKEN_SKIP_BINDING, anItemLine);
3377
- aCount++;
3378
- }
3379
- else
3380
- elision = 1;
3381
- }
3382
- else {
3383
- if (!elision)
3384
- fxReportParserError(parser, parser->line, "missing ,");
3385
- if (parser->token == XS_TOKEN_SPREAD) {
3386
- fxRestBinding(parser, theToken, 0);
3387
- aCount++;
3388
- break;
3389
- }
3390
- fxBinding(parser, theToken, 1);
3391
- aCount++;
3392
- elision = 0;
3393
- }
3394
- }
3395
- fxMatchToken(parser, XS_TOKEN_RIGHT_BRACKET);
3396
- fxPushNodeList(parser, aCount);
3397
- fxPushNodeStruct(parser, 1, XS_TOKEN_ARRAY_BINDING, aLine);
3398
- }
3399
-
3400
- txNode* fxArrayBindingFromExpression(txParser* parser, txNode* theNode, txToken theToken)
3401
- {
3402
- txNodeList* list = ((txArrayNode*)theNode)->items;
3403
- txNode** address = &(list->first);
3404
- txNode* item;
3405
- txNode* binding;
3406
- while ((item = *address)) {
3407
- if (!item->description) {
3408
- parser->errorSymbol = parser->SyntaxErrorSymbol;
3409
- return NULL;
3410
- }
3411
- if (item->description->token == XS_TOKEN_SPREAD) {
3412
- if (theNode->flags & mxElisionFlag) {
3413
- parser->errorSymbol = parser->SyntaxErrorSymbol;
3414
- return NULL;
3415
- }
3416
- binding = fxRestBindingFromExpression(parser, item, theToken, 0);
3417
- if (!binding) {
3418
- parser->errorSymbol = parser->SyntaxErrorSymbol;
3419
- return NULL;
3420
- }
3421
- break;
3422
- }
3423
- if (item->description->token == XS_TOKEN_ELISION) {
3424
- item->description = &gxTokenDescriptions[XS_TOKEN_SKIP_BINDING];
3425
- }
3426
- else {
3427
- // if ((theToken == XS_TOKEN_BINDING) && ((item->description->token== XS_TOKEN_MEMBER) || (item->description->token == XS_TOKEN_MEMBER_AT)))
3428
- // binding = item;
3429
- // else {
3430
- binding = fxBindingFromExpression(parser, item, theToken);
3431
- if (!binding) {
3432
- parser->errorSymbol = parser->SyntaxErrorSymbol;
3433
- return NULL;
3434
- }
3435
- binding->next = item->next;
3436
- item = *address = binding;
3437
- // }
3438
- }
3439
- address = &(item->next);
3440
- }
3441
- fxPushNode(parser, (txNode*)list);
3442
- fxPushNodeStruct(parser, 1, XS_TOKEN_ARRAY_BINDING, theNode->line);
3443
- return fxPopNode(parser);
3444
- }
3445
-
3446
- txUnsigned fxObjectBinding(txParser* parser, txToken theToken)
3447
- {
3448
- txUnsigned flags = 0;
3449
- txInteger aCount = 0;
3450
- txInteger aLine = parser->line;
3451
- txSymbol* aSymbol;
3452
- txToken aToken;
3453
- txIndex index;
3454
- fxMatchToken(parser, XS_TOKEN_LEFT_BRACE);
3455
- for (;;) {
3456
- txInteger aPropertyLine = parser->line;
3457
- if (parser->token == XS_TOKEN_RIGHT_BRACE)
3458
- break;
3459
- aSymbol = NULL;
3460
- aToken = XS_TOKEN_PROPERTY_BINDING;
3461
- if ((gxTokenFlags[parser->token] & XS_TOKEN_IDENTIFIER_NAME)) {
3462
- aSymbol = parser->symbol;
3463
- fxPushSymbol(parser, aSymbol);
3464
- aToken = XS_TOKEN_PROPERTY_BINDING;
3465
- }
3466
- else if (parser->token == XS_TOKEN_INTEGER) {
3467
- if (fxIntegerToIndex(parser->dtoa, parser->integer, &index)) {
3468
- fxPushIndexNode(parser, index, aPropertyLine);
3469
- aToken = XS_TOKEN_PROPERTY_BINDING_AT;
3470
- }
3471
- else {
3472
- aSymbol = fxNewParserSymbol(parser, fxIntegerToString(parser->dtoa, parser->integer, parser->buffer, parser->bufferSize));
3473
- fxPushSymbol(parser, aSymbol);
3474
- aToken = XS_TOKEN_PROPERTY_BINDING;
3475
- }
3476
- }
3477
- else if (parser->token == XS_TOKEN_NUMBER) {
3478
- if (fxNumberToIndex(parser->dtoa, parser->number, &index)) {
3479
- fxPushIndexNode(parser, index, aPropertyLine);
3480
- aToken = XS_TOKEN_PROPERTY_BINDING_AT;
3481
- }
3482
- else {
3483
- aSymbol = fxNewParserSymbol(parser, fxNumberToString(parser->dtoa, parser->number, parser->buffer, parser->bufferSize, 0, 0));
3484
- fxPushSymbol(parser, aSymbol);
3485
- aToken = XS_TOKEN_PROPERTY_BINDING;
3486
- }
3487
- }
3488
- else if (parser->token == XS_TOKEN_STRING) {
3489
- if (fxStringToIndex(parser->dtoa, parser->string, &index)) {
3490
- fxPushIndexNode(parser, index, aPropertyLine);
3491
- aToken = XS_TOKEN_PROPERTY_BINDING_AT;
3492
- }
3493
- else {
3494
- aSymbol = fxNewParserSymbol(parser, parser->string);
3495
- fxPushSymbol(parser, aSymbol);
3496
- aToken = XS_TOKEN_PROPERTY_BINDING;
3497
- }
3498
- }
3499
- else if (parser->token == XS_TOKEN_LEFT_BRACKET) {
3500
- fxGetNextToken(parser);
3501
- fxCommaExpression(parser);
3502
- if (parser->token != XS_TOKEN_RIGHT_BRACKET) {
3503
- fxReportParserError(parser, parser->line, "missing ]");
3504
- }
3505
- aToken = XS_TOKEN_PROPERTY_BINDING_AT;
3506
- }
3507
- else if (parser->token == XS_TOKEN_SPREAD) {
3508
- flags |= mxSpreadFlag;
3509
- fxRestBinding(parser, theToken, 1);
3510
- aCount++;
3511
- break;
3512
- }
3513
- else {
3514
- fxReportParserError(parser, parser->line, "missing identifier");
3515
- fxPushNULL(parser);
3516
- }
3517
- fxGetNextToken2(parser);
3518
- if (parser->token2 == XS_TOKEN_COLON) {
3519
- fxGetNextToken(parser);
3520
- fxGetNextToken(parser);
3521
- fxBinding(parser, theToken, 1);
3522
- }
3523
- else if (aSymbol) {
3524
- fxBinding(parser, theToken, 1);
3525
- }
3526
- else {
3527
- fxReportParserError(parser, parser->line, "missing :");
3528
- fxPushNULL(parser);
3529
- }
3530
- fxPushNodeStruct(parser, 2, aToken, aPropertyLine);
3531
- aCount++;
3532
- if (parser->token == XS_TOKEN_RIGHT_BRACE)
3533
- break;
3534
- if (parser->token == XS_TOKEN_COMMA)
3535
- fxGetNextToken(parser);
3536
- else
3537
- break;
3538
- }
3539
- fxMatchToken(parser, XS_TOKEN_RIGHT_BRACE);
3540
- fxPushNodeList(parser, aCount);
3541
- fxPushNodeStruct(parser, 1, XS_TOKEN_OBJECT_BINDING, aLine);
3542
- parser->root->flags |= flags;
3543
- return flags;
3544
- }
3545
-
3546
- txNode* fxObjectBindingFromExpression(txParser* parser, txNode* theNode, txToken theToken)
3547
- {
3548
- txNodeList* list = ((txObjectNode*)theNode)->items;
3549
- txNode* property = list->first;
3550
- txNode* binding;
3551
- txUnsigned flags = 0;
3552
- while (property) {
3553
- if (!property->description) {
3554
- parser->errorSymbol = parser->SyntaxErrorSymbol;
3555
- return NULL;
3556
- }
3557
- if (property->description->token == XS_TOKEN_PROPERTY) {
3558
- binding = fxBindingFromExpression(parser, ((txPropertyNode*)property)->value, theToken);
3559
- if (!binding) {
3560
- parser->errorSymbol = parser->SyntaxErrorSymbol;
3561
- return NULL;
3562
- }
3563
- property->description = &gxTokenDescriptions[XS_TOKEN_PROPERTY_BINDING];
3564
- ((txPropertyBindingNode*)property)->binding = binding;
3565
- }
3566
- else if (property->description->token == XS_TOKEN_PROPERTY_AT) {
3567
- binding = fxBindingFromExpression(parser, ((txPropertyAtNode*)property)->value, theToken);
3568
- if (!binding) {
3569
- parser->errorSymbol = parser->SyntaxErrorSymbol;
3570
- return NULL;
3571
- }
3572
- property->description = &gxTokenDescriptions[XS_TOKEN_PROPERTY_BINDING_AT];
3573
- ((txPropertyBindingAtNode*)property)->binding = binding;
3574
- }
3575
- else if (property->description->token == XS_TOKEN_SPREAD) {
3576
- binding = fxRestBindingFromExpression(parser, property, theToken, 1);
3577
- if (!binding) {
3578
- parser->errorSymbol = parser->SyntaxErrorSymbol;
3579
- return NULL;
3580
- }
3581
- flags |= mxSpreadFlag;
3582
- break;
3583
- }
3584
- property = property->next;
3585
- }
3586
- fxPushNode(parser, (txNode*)list);
3587
- fxPushNodeStruct(parser, 1, XS_TOKEN_OBJECT_BINDING, theNode->line);
3588
- parser->root->flags |= flags;
3589
- return fxPopNode(parser);
3590
- }
3591
-
3592
- void fxParametersBinding(txParser* parser)
3593
- {
3594
- txInteger aCount = 0;
3595
- txInteger aLine = parser->line;
3596
- txBindingNode* binding;
3597
- if (parser->token == XS_TOKEN_LEFT_PARENTHESIS) {
3598
- fxGetNextToken(parser);
3599
- while (gxTokenFlags[parser->token] & XS_TOKEN_BEGIN_BINDING) {
3600
- if (parser->token == XS_TOKEN_SPREAD) {
3601
- parser->flags |= mxNotSimpleParametersFlag;
3602
- fxRestBinding(parser, XS_TOKEN_ARG, 0);
3603
- aCount++;
3604
- break;
3605
- }
3606
- fxBinding(parser, XS_TOKEN_ARG, 1);
3607
- binding = (txBindingNode*)parser->root;
3608
- if (binding->description->token != XS_TOKEN_ARG)
3609
- parser->flags |= mxNotSimpleParametersFlag;
3610
- aCount++;
3611
- if (parser->token != XS_TOKEN_RIGHT_PARENTHESIS)
3612
- fxMatchToken(parser, XS_TOKEN_COMMA);
3613
- }
3614
- fxMatchToken(parser, XS_TOKEN_RIGHT_PARENTHESIS);
3615
- }
3616
- else
3617
- fxReportParserError(parser, parser->line, "missing (");
3618
- fxPushNodeList(parser, aCount);
3619
- fxPushNodeStruct(parser, 1, XS_TOKEN_PARAMS_BINDING, aLine);
3620
- }
3621
-
3622
- txNode* fxParametersBindingFromExpressions(txParser* parser, txNode* theNode)
3623
- {
3624
- txNodeList* list = ((txParamsNode*)theNode)->items;
3625
- txNode** address = &(list->first);
3626
- txNode* item;
3627
- txBindingNode* binding;
3628
- while ((item = *address)) {
3629
- txToken aToken = (item && item->description) ? item->description->token : XS_NO_TOKEN;
3630
- if (aToken == XS_TOKEN_SPREAD) {
3631
- binding = (txBindingNode*)fxRestBindingFromExpression(parser, item, XS_TOKEN_ARG, 0);
3632
- if (!binding)
3633
- return NULL;
3634
- parser->flags |= mxNotSimpleParametersFlag;
3635
- break;
3636
- }
3637
- binding = (txBindingNode*)fxBindingFromExpression(parser, item, XS_TOKEN_ARG);
3638
- if (!binding)
3639
- return NULL;
3640
- if (binding->description->token != XS_TOKEN_ARG)
3641
- parser->flags |= mxNotSimpleParametersFlag;
3642
- binding->next = item->next;
3643
- item = *address = (txNode*)binding;
3644
- address = &(item->next);
3645
- }
3646
- theNode->description = &gxTokenDescriptions[XS_TOKEN_PARAMS_BINDING];
3647
- return theNode;
3648
- }
3649
-
3650
- void fxRestBinding(txParser* parser, txToken theToken, txUnsigned flag)
3651
- {
3652
- txInteger aLine = parser->line;
3653
- fxMatchToken(parser, XS_TOKEN_SPREAD);
3654
- fxBinding(parser, theToken, 0);
3655
- if (flag && ((parser->root->description->token == XS_TOKEN_ARRAY_BINDING) || (parser->root->description->token == XS_TOKEN_OBJECT_BINDING))) {
3656
- fxReportParserError(parser, parser->line, "invalid rest");
3657
- }
3658
- fxPushNodeStruct(parser, 1, XS_TOKEN_REST_BINDING, aLine);
3659
- }
3660
-
3661
- txNode* fxRestBindingFromExpression(txParser* parser, txNode* theNode, txToken theToken, txUnsigned flag)
3662
- {
3663
- txNode* expression = ((txSpreadNode*)theNode)->expression;
3664
- txNode* binding;
3665
- if (theNode->next) {
3666
- parser->errorSymbol = parser->SyntaxErrorSymbol;
3667
- return NULL;
3668
- }
3669
- if (!expression)
3670
- return NULL;
3671
- // if ((theToken == XS_TOKEN_BINDING) && ((expression->description->token == XS_TOKEN_MEMBER) || (expression->description->token == XS_TOKEN_MEMBER_AT)))
3672
- // binding = expression;
3673
- // else {
3674
- binding = fxBindingFromExpression(parser, expression, theToken);
3675
- if (!binding) {
3676
- parser->errorSymbol = parser->SyntaxErrorSymbol;
3677
- return NULL;
3678
- }
3679
- if (binding->description->token == XS_TOKEN_BINDING) {
3680
- fxReportParserError(parser, parser->line, "invalid rest");
3681
- return NULL;
3682
- }
3683
- if (flag && ((binding->description->token == XS_TOKEN_ARRAY_BINDING) || (binding->description->token == XS_TOKEN_OBJECT_BINDING))) {
3684
- fxReportParserError(parser, parser->line, "invalid rest");
3685
- return NULL;
3686
- }
3687
- // }
3688
- theNode->description = &gxTokenDescriptions[XS_TOKEN_REST_BINDING];
3689
- ((txRestBindingNode*)theNode)->binding = binding;
3690
- return theNode;
3691
- }
3692
-
3693
- void fxCheckArrowFunction(txParser* parser, txInteger count)
3694
- {
3695
- txNode* node = parser->root;
3696
- while (count) {
3697
- if (node->flags & mxArrowFlag)
3698
- fxReportParserError(parser, parser->line, "invalid arrow function");
3699
- count--;
3700
- node = node->next;
3701
- }
3702
- }
3703
-
3704
- txBoolean fxCheckReference(txParser* parser, txToken theToken)
3705
- {
3706
- txNode* node = parser->root;
3707
- txToken aToken = (node && node->description) ? node->description->token : XS_NO_TOKEN;
3708
- if (aToken == XS_TOKEN_EXPRESSIONS) {
3709
- txNode* item = ((txExpressionsNode*)node)->items->first;
3710
- if (item && !item->next) {
3711
- aToken = (item->description) ? item->description->token : XS_NO_TOKEN;
3712
- if ((aToken == XS_TOKEN_ACCESS) || (aToken == XS_TOKEN_MEMBER) || (aToken == XS_TOKEN_MEMBER_AT) || (aToken == XS_TOKEN_PRIVATE_MEMBER) || (aToken == XS_TOKEN_UNDEFINED)) {
3713
- item->next = node->next;
3714
- node = parser->root = item;
3715
- }
3716
- else
3717
- aToken = XS_TOKEN_EXPRESSIONS;
3718
- }
3719
- }
3720
- if (aToken == XS_TOKEN_ACCESS) {
3721
- fxCheckStrictSymbol(parser, ((txAccessNode*)node)->symbol);
3722
- return 1;
3723
- }
3724
- if ((aToken == XS_TOKEN_MEMBER) || (aToken == XS_TOKEN_MEMBER_AT) || (aToken == XS_TOKEN_PRIVATE_MEMBER) || (aToken == XS_TOKEN_UNDEFINED))
3725
- return 1;
3726
-
3727
- if (theToken == XS_TOKEN_ASSIGN) {
3728
- if (aToken == XS_TOKEN_ARRAY) {
3729
- txNode* binding = fxArrayBindingFromExpression(parser, node, XS_TOKEN_ACCESS);
3730
- if (binding) {
3731
- binding->next = node->next;
3732
- parser->root = binding;
3733
- return 1;
3734
- }
3735
- }
3736
- else if (aToken == XS_TOKEN_OBJECT) {
3737
- txNode* binding = fxObjectBindingFromExpression(parser, node, XS_TOKEN_ACCESS);
3738
- if (binding) {
3739
- binding->next = node->next;
3740
- parser->root = binding;
3741
- return 1;
3742
- }
3743
- }
3744
- }
3745
- else if (theToken == XS_TOKEN_DELETE)
3746
- return 1;
3747
- return 0;
3748
- }
3749
-
3750
- void fxCheckStrictBinding(txParser* parser, txNode* node)
3751
- {
3752
- if (node && node->description) {
3753
- if (node->description->token == XS_TOKEN_ACCESS) {
3754
- fxCheckStrictSymbol(parser, ((txAccessNode*)node)->symbol);
3755
- }
3756
- else if (node->description->token == XS_TOKEN_ARG) {
3757
- fxCheckStrictSymbol(parser, ((txDeclareNode*)node)->symbol);
3758
- }
3759
- else if (node->description->token == XS_TOKEN_CONST) {
3760
- fxCheckStrictSymbol(parser, ((txDeclareNode*)node)->symbol);
3761
- }
3762
- else if (node->description->token == XS_TOKEN_LET) {
3763
- fxCheckStrictSymbol(parser, ((txDeclareNode*)node)->symbol);
3764
- }
3765
- else if (node->description->token == XS_TOKEN_VAR) {
3766
- fxCheckStrictSymbol(parser, ((txDeclareNode*)node)->symbol);
3767
- }
3768
- else if (node->description->token == XS_TOKEN_BINDING) {
3769
- fxCheckStrictBinding(parser, ((txBindingNode*)node)->target);
3770
- }
3771
- else if (node->description->token == XS_TOKEN_ARRAY_BINDING) {
3772
- node = ((txArrayBindingNode*)node)->items->first;
3773
- while (node) {
3774
- fxCheckStrictBinding(parser, node);
3775
- node = node->next;
3776
- }
3777
- }
3778
- else if (node->description->token == XS_TOKEN_OBJECT_BINDING) {
3779
- node = ((txObjectBindingNode*)node)->items->first;
3780
- while (node) {
3781
- fxCheckStrictBinding(parser, node);
3782
- node = node->next;
3783
- }
3784
- }
3785
- else if (node->description->token == XS_TOKEN_PARAMS_BINDING) {
3786
- node = ((txParamsBindingNode*)node)->items->first;
3787
- while (node) {
3788
- fxCheckStrictBinding(parser, node);
3789
- node = node->next;
3790
- }
3791
- }
3792
- else if (node->description->token == XS_TOKEN_PROPERTY_BINDING)
3793
- fxCheckStrictBinding(parser, ((txPropertyBindingNode*)node)->binding);
3794
- else if (node->description->token == XS_TOKEN_PROPERTY_BINDING_AT)
3795
- fxCheckStrictBinding(parser, ((txPropertyBindingAtNode*)node)->binding);
3796
- else if (node->description->token == XS_TOKEN_REST_BINDING)
3797
- fxCheckStrictBinding(parser, ((txRestBindingNode*)node)->binding);
3798
- }
3799
- }
3800
-
3801
- void fxCheckStrictFunction(txParser* parser, txFunctionNode* function)
3802
- {
3803
- parser->line = function->line;
3804
- fxCheckStrictSymbol(parser, function->symbol);
3805
- fxCheckStrictBinding(parser, function->params);
3806
- }
3807
-
3808
- void fxCheckStrictSymbol(txParser* parser, txSymbol* symbol)
3809
- {
3810
- if (parser->flags & mxStrictFlag) {
3811
- if (symbol == parser->argumentsSymbol)
3812
- fxReportParserError(parser, parser->line, "invalid arguments (strict mode)");
3813
- else if (symbol == parser->evalSymbol)
3814
- fxReportParserError(parser, parser->line, "invalid eval (strict mode)");
3815
- else if (symbol == parser->yieldSymbol)
3816
- fxReportParserError(parser, parser->line, "invalid yield (strict mode)");
3817
- }
3818
- else if (parser->flags & mxYieldFlag) {
3819
- if (symbol == parser->yieldSymbol)
3820
- fxReportParserError(parser, parser->line, "invalid yield");
3821
- }
3822
- }
3823
-
3824
- void fxCheckUniqueProperty(txParser* parser, txNode* base, txNode* current)
3825
- {
3826
- return; // no more!
3827
- if (current->description->token == XS_TOKEN_PROPERTY) {
3828
- txPropertyNode* currentNode = (txPropertyNode*)current;
3829
- while (base != current) {
3830
- txPropertyNode* baseNode = (txPropertyNode*)base;
3831
- if (baseNode->description->token == XS_TOKEN_PROPERTY) {
3832
- if (baseNode->symbol == currentNode->symbol) {
3833
- fxCheckUniquePropertyAux(parser, (txNode*)baseNode, (txNode*)currentNode);
3834
- }
3835
- }
3836
- base = base->next;
3837
- }
3838
- }
3839
- else {
3840
- txPropertyAtNode* currentNode = (txPropertyAtNode*)current;
3841
- txIntegerNode* currentAt = (txIntegerNode*)(currentNode->at);
3842
- if (currentAt->description->token == XS_TOKEN_INTEGER) {
3843
- while (base != current) {
3844
- txPropertyAtNode* baseNode = (txPropertyAtNode*)base;
3845
- if (baseNode->description->token == XS_TOKEN_PROPERTY_AT) {
3846
- txIntegerNode* baseAt = (txIntegerNode*)(baseNode->at);
3847
- if (baseAt->description->token == XS_TOKEN_INTEGER) {
3848
- if (baseAt->value == currentAt->value) {
3849
- fxCheckUniquePropertyAux(parser, (txNode*)baseNode, (txNode*)currentNode);
3850
- }
3851
- }
3852
- }
3853
- base = base->next;
3854
- }
3855
- }
3856
- }
3857
- }
3858
-
3859
- void fxCheckUniquePropertyAux(txParser* parser, txNode* baseNode, txNode* currentNode)
3860
- {
3861
- if (currentNode->flags & mxGetterFlag) {
3862
- if (baseNode->flags & mxGetterFlag)
3863
- fxReportParserError(parser, parser->line, "getter already defined");
3864
- else if (!(baseNode->flags & mxSetterFlag))
3865
- fxReportParserError(parser, parser->line, "property already defined");
3866
- }
3867
- else if (currentNode->flags & mxSetterFlag) {
3868
- if (baseNode->flags & mxSetterFlag)
3869
- fxReportParserError(parser, parser->line, "setter already defined");
3870
- else if (!(baseNode->flags & mxGetterFlag))
3871
- fxReportParserError(parser, parser->line, "property already defined");
3872
- }
3873
- else {
3874
- if (baseNode->flags & mxGetterFlag)
3875
- fxReportParserError(parser, parser->line, "getter already defined");
3876
- else if (baseNode->flags & mxSetterFlag)
3877
- fxReportParserError(parser, parser->line, "setter already defined");
3878
- else if (parser->flags & mxStrictFlag)
3879
- fxReportParserError(parser, parser->line, "property already defined (strict mode)");
3880
- }
3881
- }
3882
-
3883
-
3884
- void fxJSONValue(txParser* parser)
3885
- {
3886
- switch (parser->token) {
3887
- case XS_TOKEN_FALSE:
3888
- fxPushNodeStruct(parser, 0, parser->token, parser->line);
3889
- fxGetNextTokenJSON(parser);
3890
- break;
3891
- case XS_TOKEN_TRUE:
3892
- fxPushNodeStruct(parser, 0, parser->token, parser->line);
3893
- fxGetNextTokenJSON(parser);
3894
- break;
3895
- case XS_TOKEN_NULL:
3896
- fxPushNodeStruct(parser, 0, parser->token, parser->line);
3897
- fxGetNextTokenJSON(parser);
3898
- break;
3899
- case XS_TOKEN_INTEGER:
3900
- fxPushIntegerNode(parser, parser->integer, parser->line);
3901
- fxGetNextTokenJSON(parser);
3902
- break;
3903
- case XS_TOKEN_NUMBER:
3904
- fxPushNumberNode(parser, parser->number, parser->line);
3905
- fxGetNextTokenJSON(parser);
3906
- break;
3907
- case XS_TOKEN_STRING:
3908
- fxPushStringNode(parser, parser->stringLength, parser->string, parser->line);
3909
- fxGetNextTokenJSON(parser);
3910
- break;
3911
- case XS_TOKEN_LEFT_BRACE:
3912
- fxJSONObject(parser);
3913
- break;
3914
- case XS_TOKEN_LEFT_BRACKET:
3915
- fxJSONArray(parser);
3916
- break;
3917
- default:
3918
- fxPushNULL(parser);
3919
- fxReportParserError(parser, parser->line, "invalid value");
3920
- break;
3921
- }
3922
- }
3923
-
3924
- void fxJSONObject(txParser* parser)
3925
- {
3926
- txIndex aLength = 0;
3927
- txInteger aLine = parser->line;
3928
- fxGetNextTokenJSON(parser);
3929
- for (;;) {
3930
- if (parser->token == XS_TOKEN_RIGHT_BRACE)
3931
- break;
3932
- if (parser->token != XS_TOKEN_STRING) {
3933
- fxReportParserError(parser, parser->line, "missing name");
3934
- break;
3935
- }
3936
- fxPushStringNode(parser, parser->stringLength, parser->string, parser->line);
3937
- fxGetNextTokenJSON(parser);
3938
- if (parser->token != XS_TOKEN_COLON) {
3939
- fxReportParserError(parser, parser->line, "missing :");
3940
- break;
3941
- }
3942
- fxGetNextTokenJSON(parser);
3943
- fxJSONValue(parser);
3944
- fxPushNodeStruct(parser, 2, XS_TOKEN_PROPERTY_AT, parser->line);
3945
- aLength++;
3946
- if (parser->token != XS_TOKEN_COMMA)
3947
- break;
3948
- fxGetNextTokenJSON(parser);
3949
- }
3950
- if (parser->token != XS_TOKEN_RIGHT_BRACE)
3951
- fxReportParserError(parser, parser->line, "missing }");
3952
- fxGetNextTokenJSON(parser);
3953
- fxPushNodeList(parser, aLength);
3954
- fxPushNodeStruct(parser, 1, XS_TOKEN_OBJECT, aLine);
3955
- }
3956
-
3957
- void fxJSONArray(txParser* parser)
3958
- {
3959
- txIndex aLength = 0;
3960
- txInteger aLine = parser->line;
3961
- fxGetNextTokenJSON(parser);
3962
- for (;;) {
3963
- if (parser->token == XS_TOKEN_RIGHT_BRACKET)
3964
- break;
3965
- fxJSONValue(parser);
3966
- aLength++;
3967
- if (parser->token != XS_TOKEN_COMMA)
3968
- break;
3969
- fxGetNextTokenJSON(parser);
3970
- }
3971
- if (parser->token != XS_TOKEN_RIGHT_BRACKET)
3972
- fxReportParserError(parser, parser->line, "missing ]");
3973
- fxGetNextTokenJSON(parser);
3974
- fxPushNodeList(parser, aLength);
3975
- fxPushNodeStruct(parser, 1, XS_TOKEN_ARRAY, aLine);
3976
- }
3977
-
3978
- void fxJSXAttributeName(txParser* parser)
3979
- {
3980
- txSymbol* symbol = parser->symbol;
3981
- fxGetNextToken(parser);
3982
- if (parser->token == XS_TOKEN_COLON) {
3983
- fxGetNextToken(parser);
3984
- if (gxTokenFlags[parser->token] & XS_TOKEN_IDENTIFIER_NAME)
3985
- symbol = fxJSXNamespace(parser, symbol, parser->symbol);
3986
- else
3987
- fxReportParserError(parser, parser->line, "missing name");
3988
- }
3989
- fxPushSymbol(parser, symbol);
3990
- }
3991
-
3992
- void fxJSXAttributeValue(txParser* parser)
3993
- {
3994
- txInteger line = parser->line;
3995
- fxGetNextTokenJSXAttribute(parser);
3996
- if (parser->token == XS_TOKEN_STRING) {
3997
- fxPushStringNode(parser, parser->stringLength, parser->string, line);
3998
- fxGetNextToken(parser);
3999
- }
4000
- else if (parser->token == XS_TOKEN_LEFT_BRACE) {
4001
- fxGetNextToken(parser);
4002
- if (parser->token == XS_TOKEN_RIGHT_BRACE) {
4003
- fxGetNextToken(parser);
4004
- fxReportParserError(parser, parser->line, "missing expression");
4005
- fxPushNodeStruct(parser, 0, XS_TOKEN_UNDEFINED, line);
4006
- }
4007
- else {
4008
- fxAssignmentExpression(parser);
4009
- if (parser->token == XS_TOKEN_RIGHT_BRACE)
4010
- fxGetNextToken(parser);
4011
- else
4012
- fxReportParserError(parser, parser->line, "missing }");
4013
- }
4014
- }
4015
- else {
4016
- fxReportParserError(parser, parser->line, "invalid %s", gxTokenNames[parser->token]);
4017
- fxPushNodeStruct(parser, 0, XS_TOKEN_UNDEFINED, line);
4018
- }
4019
- }
4020
-
4021
- void fxJSXElement(txParser* parser)
4022
- {
4023
- txBoolean closed = 0;
4024
- txInteger line = parser->line;
4025
- txNode* name = NULL;
4026
- txInteger nodeCount = parser->nodeCount;
4027
- txInteger propertyCount = 0;
4028
- fxPushSymbol(parser, parser->__jsx__Symbol);
4029
- fxPushNodeStruct(parser, 1, XS_TOKEN_ACCESS, parser->line);
4030
- if (parser->token == XS_TOKEN_IDENTIFIER) {
4031
- fxJSXElementName(parser);
4032
- name = parser->root;
4033
- }
4034
- else {
4035
- fxReportParserError(parser, parser->line, "missing identifier");
4036
- fxPushNULL(parser);
4037
- }
4038
- for (;;) {
4039
- if (parser->token == XS_TOKEN_MORE)
4040
- break;
4041
- if (parser->token == XS_TOKEN_DIVIDE) {
4042
- fxGetNextToken(parser);
4043
- if (parser->token != XS_TOKEN_MORE)
4044
- fxReportParserError(parser, parser->line, "missing >");
4045
- closed = 1;
4046
- break;
4047
- }
4048
- if (gxTokenFlags[parser->token] & XS_TOKEN_IDENTIFIER_NAME) {
4049
- fxJSXAttributeName(parser);
4050
- if (parser->token == XS_TOKEN_ASSIGN)
4051
- fxJSXAttributeValue(parser);
4052
- else
4053
- fxPushNodeStruct(parser, 0, XS_TOKEN_TRUE, parser->line);
4054
- fxPushNodeStruct(parser, 2, XS_TOKEN_PROPERTY, parser->line);
4055
- propertyCount++;
4056
- }
4057
- else if (parser->token == XS_TOKEN_LEFT_BRACE) {
4058
- fxGetNextToken(parser);
4059
- if (parser->token == XS_TOKEN_SPREAD) {
4060
- fxGetNextToken(parser);
4061
- fxAssignmentExpression(parser);
4062
- if (parser->token == XS_TOKEN_RIGHT_BRACE)
4063
- fxGetNextToken(parser);
4064
- else
4065
- fxReportParserError(parser, parser->line, "missing }");
4066
- fxPushNodeStruct(parser, 1, XS_TOKEN_SPREAD, parser->line);
4067
- propertyCount++;
4068
- }
4069
- else
4070
- fxReportParserError(parser, parser->line, "invalid %s", gxTokenNames[parser->token]);
4071
- }
4072
- else {
4073
- fxReportParserError(parser, parser->line, "invalid %s", gxTokenNames[parser->token]);
4074
- break;
4075
- }
4076
- }
4077
- if (propertyCount > 0) {
4078
- fxPushNodeList(parser, propertyCount);
4079
- fxPushNodeStruct(parser, 1, XS_TOKEN_OBJECT, parser->line);
4080
- }
4081
- else
4082
- fxPushNodeStruct(parser, 0, XS_TOKEN_NULL, parser->line);
4083
- if (!closed) {
4084
- for (;;) {
4085
- fxGetNextTokenJSXChild(parser);
4086
- if (parser->stringLength)
4087
- fxPushStringNode(parser, parser->stringLength, parser->string, parser->line);
4088
- if (parser->token == XS_TOKEN_LEFT_BRACE) {
4089
- fxGetNextToken(parser);
4090
- if (parser->token == XS_TOKEN_RIGHT_BRACE)
4091
- fxGetNextToken(parser);
4092
- else {
4093
- fxAssignmentExpression(parser);
4094
- if (parser->token != XS_TOKEN_RIGHT_BRACE)
4095
- fxReportParserError(parser, parser->line, "missing }");
4096
- }
4097
- }
4098
- else if (parser->token == XS_TOKEN_LESS) {
4099
- fxGetNextToken(parser);
4100
- if (parser->token == XS_TOKEN_DIVIDE) {
4101
- fxGetNextToken(parser);
4102
- if (parser->token == XS_TOKEN_IDENTIFIER) {
4103
- fxJSXElementName(parser);
4104
- if (!fxJSXMatch(parser, name, parser->root)) {
4105
- fxReportParserError(parser, parser->line, "invalid element");
4106
- fxPushNULL(parser);
4107
- }
4108
- }
4109
- else {
4110
- fxReportParserError(parser, parser->line, "missing identifier");
4111
- fxPushNULL(parser);
4112
- }
4113
- if (parser->token != XS_TOKEN_MORE)
4114
- fxReportParserError(parser, parser->line, "missing >");
4115
- fxPopNode(parser);
4116
- break;
4117
- }
4118
- else
4119
- fxJSXElement(parser);
4120
- }
4121
- else {
4122
- fxReportParserError(parser, parser->line, "invalid %s", gxTokenNames[parser->token]);
4123
- break;
4124
- }
4125
- }
4126
- }
4127
- fxPushNodeList(parser, parser->nodeCount - nodeCount - 1);
4128
- fxPushNodeStruct(parser, 1, XS_TOKEN_PARAMS, line);
4129
- fxPushNodeStruct(parser, 2, XS_TOKEN_CALL, line);
4130
- }
4131
-
4132
- void fxJSXElementName(txParser* parser)
4133
- {
4134
- txInteger line = parser->line;
4135
- txSymbol* symbol = parser->symbol;
4136
- fxGetNextToken(parser);
4137
- if (parser->token == XS_TOKEN_COLON) {
4138
- fxGetNextToken(parser);
4139
- if (parser->token == XS_TOKEN_IDENTIFIER)
4140
- symbol = fxJSXNamespace(parser, symbol, parser->symbol);
4141
- else
4142
- fxReportParserError(parser, parser->line, "missing name");
4143
- fxPushSymbol(parser, symbol);
4144
- fxPushNodeStruct(parser, 1, XS_TOKEN_ACCESS, line);
4145
- fxGetNextToken(parser);
4146
- }
4147
- else {
4148
- fxPushSymbol(parser, symbol);
4149
- fxPushNodeStruct(parser, 1, XS_TOKEN_ACCESS, line);
4150
- while (parser->token == XS_TOKEN_DOT) {
4151
- fxGetNextToken(parser);
4152
- if (parser->token == XS_TOKEN_IDENTIFIER) {
4153
- fxPushSymbol(parser, parser->symbol);
4154
- fxPushNodeStruct(parser, 2, XS_TOKEN_MEMBER, parser->line);
4155
- fxGetNextToken(parser);
4156
- }
4157
- else
4158
- fxReportParserError(parser, parser->line, "missing property");
4159
- }
4160
- }
4161
- }
4162
-
4163
- txBoolean fxJSXMatch(txParser* parser, txNode* opening, txNode* closing)
4164
- {
4165
- if (opening && closing) {
4166
- while (opening->description->token == XS_TOKEN_MEMBER) {
4167
- if (closing->description->token != XS_TOKEN_MEMBER)
4168
- return 0;
4169
- if (((txMemberNode*)opening)->symbol != ((txMemberNode*)closing)->symbol)
4170
- return 0;
4171
- opening = ((txMemberNode*)opening)->reference;
4172
- closing = ((txMemberNode*)closing)->reference;
4173
- }
4174
- if (opening->description->token == XS_TOKEN_ACCESS) {
4175
- if (closing->description->token != XS_TOKEN_ACCESS)
4176
- return 0;
4177
- if (((txAccessNode*)opening)->symbol != ((txAccessNode*)closing)->symbol)
4178
- return 0;
4179
- return 1;
4180
- }
4181
- }
4182
- return 0;
4183
- }
4184
-
4185
- txSymbol* fxJSXNamespace(txParser* parser, txSymbol* namespace, txSymbol* name)
4186
- {
4187
- txSize namespaceLength = namespace->length;
4188
- txSize nameLength = name->length;
4189
- txSize length = namespaceLength + 1 + nameLength + 1;
4190
- txString string = fxNewParserChunk(parser, length);
4191
- snprintf(string, length, "%s:%s", namespace->string, name->string);
4192
- return fxNewParserSymbol(parser, string);
4193
- }