@agoric/xsnap 0.14.3-u14.0 → 0.14.3-u16.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 (137) hide show
  1. package/README.md +3 -3
  2. package/api.js +4 -2
  3. package/build.env +1 -1
  4. package/moddable/modules/data/base64/base64.js +28 -0
  5. package/moddable/modules/data/base64/manifest.json +11 -0
  6. package/moddable/modules/data/base64/modBase64.c +188 -0
  7. package/moddable/modules/data/binaryMessage/BinaryMessage.js +106 -0
  8. package/moddable/modules/data/crc/crc.c +205 -0
  9. package/moddable/modules/data/crc/crc.js +36 -0
  10. package/moddable/modules/data/crc/manifest.json +8 -0
  11. package/moddable/modules/data/hex/hex.js +28 -0
  12. package/moddable/modules/data/hex/manifest.json +11 -0
  13. package/moddable/modules/data/hex/modHex.c +139 -0
  14. package/moddable/modules/data/logical/logical.js +32 -0
  15. package/moddable/modules/data/logical/modLogical.c +98 -0
  16. package/moddable/modules/data/qrcode/manifest.json +9 -0
  17. package/moddable/modules/data/qrcode/qrcode.c +93 -0
  18. package/moddable/modules/data/qrcode/qrcode.js +23 -0
  19. package/moddable/modules/data/qrcode/qrcodegen.c +1025 -0
  20. package/moddable/modules/data/qrcode/qrcodegen.h +267 -0
  21. package/moddable/modules/data/text/decoder/manifest.json +8 -0
  22. package/moddable/modules/data/text/decoder/textdecoder.c +480 -0
  23. package/moddable/modules/data/text/decoder/textdecoder.js +27 -0
  24. package/moddable/modules/data/text/encoder/manifest.json +8 -0
  25. package/moddable/modules/data/text/encoder/textencoder.c +232 -0
  26. package/moddable/modules/data/text/encoder/textencoder.js +24 -0
  27. package/moddable/modules/data/tinyint/tinyint.c +150 -0
  28. package/moddable/modules/data/tinyint/tinyint.js +53 -0
  29. package/moddable/modules/data/url/manifest.json +17 -0
  30. package/moddable/modules/data/url/url.c +1959 -0
  31. package/moddable/modules/data/url/url.js +210 -0
  32. package/moddable/modules/data/wavreader/manifest.json +8 -0
  33. package/moddable/modules/data/wavreader/wavreader.js +128 -0
  34. package/moddable/modules/data/zlib/deflate.c +161 -0
  35. package/moddable/modules/data/zlib/deflate.js +63 -0
  36. package/moddable/modules/data/zlib/inflate.c +145 -0
  37. package/moddable/modules/data/zlib/inflate.js +66 -0
  38. package/moddable/modules/data/zlib/manifest_deflate.json +9 -0
  39. package/moddable/modules/data/zlib/manifest_inflate.json +9 -0
  40. package/moddable/modules/data/zlib/miniz.c +4924 -0
  41. package/moddable/xs/includes/xs.d.ts +73 -0
  42. package/moddable/xs/includes/xs.h +1533 -0
  43. package/moddable/xs/includes/xsmc.h +206 -0
  44. package/moddable/xs/makefiles/lin/makefile +33 -0
  45. package/moddable/xs/makefiles/lin/xsc.mk +118 -0
  46. package/moddable/xs/makefiles/lin/xsid.mk +90 -0
  47. package/moddable/xs/makefiles/lin/xsl.mk +168 -0
  48. package/moddable/xs/makefiles/lin/xst.mk +201 -0
  49. package/moddable/xs/makefiles/mac/makefile +33 -0
  50. package/moddable/xs/makefiles/mac/xsc.mk +130 -0
  51. package/moddable/xs/makefiles/mac/xsid.mk +102 -0
  52. package/moddable/xs/makefiles/mac/xsl.mk +177 -0
  53. package/moddable/xs/makefiles/mac/xst.mk +203 -0
  54. package/moddable/xs/makefiles/mac/xst_no_asan.txt +52 -0
  55. package/moddable/xs/makefiles/win/build.bat +26 -0
  56. package/moddable/xs/makefiles/win/xsc.mak +142 -0
  57. package/moddable/xs/makefiles/win/xsid.mak +113 -0
  58. package/moddable/xs/makefiles/win/xsl.mak +186 -0
  59. package/moddable/xs/makefiles/win/xst.mak +195 -0
  60. package/moddable/xs/platforms/lin_xs.h +99 -0
  61. package/moddable/xs/platforms/mac_xs.h +97 -0
  62. package/moddable/xs/platforms/wasm_xs.h +79 -0
  63. package/moddable/xs/platforms/win_xs.h +104 -0
  64. package/moddable/xs/platforms/xsHost.h +63 -0
  65. package/moddable/xs/platforms/xsPlatform.h +618 -0
  66. package/moddable/xs/sources/xsAPI.c +2555 -0
  67. package/moddable/xs/sources/xsAll.c +294 -0
  68. package/moddable/xs/sources/xsAll.h +2741 -0
  69. package/moddable/xs/sources/xsArguments.c +222 -0
  70. package/moddable/xs/sources/xsArray.c +2657 -0
  71. package/moddable/xs/sources/xsAtomics.c +844 -0
  72. package/moddable/xs/sources/xsBigInt.c +1859 -0
  73. package/moddable/xs/sources/xsBoolean.c +109 -0
  74. package/moddable/xs/sources/xsCode.c +4493 -0
  75. package/moddable/xs/sources/xsCommon.c +1710 -0
  76. package/moddable/xs/sources/xsCommon.h +1142 -0
  77. package/moddable/xs/sources/xsDataView.c +2890 -0
  78. package/moddable/xs/sources/xsDate.c +1541 -0
  79. package/moddable/xs/sources/xsDebug.c +2710 -0
  80. package/moddable/xs/sources/xsDefaults.c +134 -0
  81. package/moddable/xs/sources/xsError.c +353 -0
  82. package/moddable/xs/sources/xsFunction.c +776 -0
  83. package/moddable/xs/sources/xsGenerator.c +865 -0
  84. package/moddable/xs/sources/xsGlobal.c +839 -0
  85. package/moddable/xs/sources/xsJSON.c +1091 -0
  86. package/moddable/xs/sources/xsLexical.c +1969 -0
  87. package/moddable/xs/sources/xsLockdown.c +933 -0
  88. package/moddable/xs/sources/xsMapSet.c +1649 -0
  89. package/moddable/xs/sources/xsMarshall.c +1020 -0
  90. package/moddable/xs/sources/xsMath.c +624 -0
  91. package/moddable/xs/sources/xsMemory.c +1941 -0
  92. package/moddable/xs/sources/xsModule.c +3101 -0
  93. package/moddable/xs/sources/xsNumber.c +560 -0
  94. package/moddable/xs/sources/xsObject.c +1102 -0
  95. package/moddable/xs/sources/xsPlatforms.c +480 -0
  96. package/moddable/xs/sources/xsProfile.c +577 -0
  97. package/moddable/xs/sources/xsPromise.c +1199 -0
  98. package/moddable/xs/sources/xsProperty.c +636 -0
  99. package/moddable/xs/sources/xsProxy.c +1014 -0
  100. package/moddable/xs/sources/xsRegExp.c +1168 -0
  101. package/moddable/xs/sources/xsRun.c +4889 -0
  102. package/moddable/xs/sources/xsScope.c +1293 -0
  103. package/moddable/xs/sources/xsScript.c +288 -0
  104. package/moddable/xs/sources/xsScript.h +1186 -0
  105. package/moddable/xs/sources/xsSnapshot.c +2161 -0
  106. package/moddable/xs/sources/xsSnapshot.h +51 -0
  107. package/moddable/xs/sources/xsSourceMap.c +218 -0
  108. package/moddable/xs/sources/xsString.c +3332 -0
  109. package/moddable/xs/sources/xsSymbol.c +503 -0
  110. package/moddable/xs/sources/xsSyntaxical.c +4193 -0
  111. package/moddable/xs/sources/xsTree.c +1893 -0
  112. package/moddable/xs/sources/xsType.c +1488 -0
  113. package/moddable/xs/sources/xsdtoa.c +6672 -0
  114. package/moddable/xs/sources/xsmc.c +340 -0
  115. package/moddable/xs/sources/xsre.c +7578 -0
  116. package/package.json +37 -20
  117. package/scripts/get_xsnap_version.sh +14 -0
  118. package/scripts/test-package.sh +21 -0
  119. package/src/avaAssertXS.js +6 -2
  120. package/src/avaHandler.cjs +2 -5
  121. package/src/avaXS.js +7 -8
  122. package/src/build.js +161 -28
  123. package/src/replay.js +0 -3
  124. package/src/xsnap.js +105 -91
  125. package/src/xsrepl.js +2 -3
  126. package/xsnap-native/xsnap/makefiles/lin/makefile +10 -0
  127. package/xsnap-native/xsnap/makefiles/lin/xsnap-worker.mk +156 -0
  128. package/xsnap-native/xsnap/makefiles/lin/xsnap.mk +144 -0
  129. package/xsnap-native/xsnap/makefiles/mac/makefile +10 -0
  130. package/xsnap-native/xsnap/makefiles/mac/xsnap-worker.mk +165 -0
  131. package/xsnap-native/xsnap/makefiles/mac/xsnap.mk +153 -0
  132. package/xsnap-native/xsnap/sources/xsnap-worker.c +1008 -0
  133. package/xsnap-native/xsnap/sources/xsnap.c +717 -0
  134. package/xsnap-native/xsnap/sources/xsnap.h +142 -0
  135. package/xsnap-native/xsnap/sources/xsnapPlatform.c +1501 -0
  136. package/xsnap-native/xsnap/sources/xsnapPlatform.h +105 -0
  137. package/CHANGELOG.md +0 -654
@@ -0,0 +1,4193 @@
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
+ }