1 %pure_parser
2 
3 %{
4 
5 /*
6  *  Copyright (C) 1999-2000 Harri Porten (porten@kde.org)
7  *  Copyright (C) 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
8  *  Copyright (C) 2007 Eric Seidel <eric@webkit.org>
9  *
10  *  This library is free software; you can redistribute it and/or
11  *  modify it under the terms of the GNU Lesser General Public
12  *  License as published by the Free Software Foundation; either
13  *  version 2 of the License, or (at your option) any later version.
14  *
15  *  This library is distributed in the hope that it will be useful,
16  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
17  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
18  *  Lesser General Public License for more details.
19  *
20  *  You should have received a copy of the GNU Lesser General Public
21  *  License along with this library; if not, write to the Free Software
22  *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
23  *
24  */
25 
26 #include "config.h"
27 
28 #include "JSObject.h"
29 #include "JSString.h"
30 #include "Lexer.h"
31 #include "NodeConstructors.h"
32 #include "NodeInfo.h"
33 #include <stdlib.h>
34 #include <string.h>
35 #include <wtf/MathExtras.h>
36 
37 #define YYMALLOC fastMalloc
38 #define YYFREE fastFree
39 
40 #define YYMAXDEPTH 10000
41 #define YYENABLE_NLS 0
42 
43 // Default values for bison.
44 #define YYDEBUG 0 // Set to 1 to debug a parse error.
45 #define jscyydebug 0 // Set to 1 to debug a parse error.
46 #if !OS(DARWIN)
47 // Avoid triggering warnings in older bison by not setting this on the Darwin platform.
48 // FIXME: Is this still needed?
49 #define YYERROR_VERBOSE
50 #endif
51 
52 int jscyyerror(const char*);
53 
54 static inline bool allowAutomaticSemicolon(JSC::Lexer&, int);
55 
56 #define GLOBAL_DATA static_cast<JSGlobalData*>(globalPtr)
57 #define AUTO_SEMICOLON do { if (!allowAutomaticSemicolon(*GLOBAL_DATA->lexer, yychar)) YYABORT; } while (0)
58 
59 using namespace JSC;
60 using namespace std;
61 
62 static ExpressionNode* makeAssignNode(JSGlobalData*, ExpressionNode* left, Operator, ExpressionNode* right, bool leftHasAssignments, bool rightHasAssignments, int start, int divot, int end);
63 static ExpressionNode* makePrefixNode(JSGlobalData*, ExpressionNode*, Operator, int start, int divot, int end);
64 static ExpressionNode* makePostfixNode(JSGlobalData*, ExpressionNode*, Operator, int start, int divot, int end);
65 static PropertyNode* makeGetterOrSetterPropertyNode(JSGlobalData*, const Identifier& getOrSet, const Identifier& name, ParameterNode*, FunctionBodyNode*, const SourceCode&);
66 static ExpressionNodeInfo makeFunctionCallNode(JSGlobalData*, ExpressionNodeInfo function, ArgumentsNodeInfo, int start, int divot, int end);
67 static ExpressionNode* makeTypeOfNode(JSGlobalData*, ExpressionNode*);
68 static ExpressionNode* makeDeleteNode(JSGlobalData*, ExpressionNode*, int start, int divot, int end);
69 static ExpressionNode* makeNegateNode(JSGlobalData*, ExpressionNode*);
70 static NumberNode* makeNumberNode(JSGlobalData*, double);
71 static ExpressionNode* makeBitwiseNotNode(JSGlobalData*, ExpressionNode*);
72 static ExpressionNode* makeMultNode(JSGlobalData*, ExpressionNode* left, ExpressionNode* right, bool rightHasAssignments);
73 static ExpressionNode* makeDivNode(JSGlobalData*, ExpressionNode* left, ExpressionNode* right, bool rightHasAssignments);
74 static ExpressionNode* makeAddNode(JSGlobalData*, ExpressionNode* left, ExpressionNode* right, bool rightHasAssignments);
75 static ExpressionNode* makeSubNode(JSGlobalData*, ExpressionNode* left, ExpressionNode* right, bool rightHasAssignments);
76 static ExpressionNode* makeLeftShiftNode(JSGlobalData*, ExpressionNode* left, ExpressionNode* right, bool rightHasAssignments);
77 static ExpressionNode* makeRightShiftNode(JSGlobalData*, ExpressionNode* left, ExpressionNode* right, bool rightHasAssignments);
78 static StatementNode* makeVarStatementNode(JSGlobalData*, ExpressionNode*);
79 static ExpressionNode* combineCommaNodes(JSGlobalData*, ExpressionNode* list, ExpressionNode* init);
80 
81 #if COMPILER(MSVC)
82 
83 #pragma warning(disable: 4065)
84 #pragma warning(disable: 4244)
85 #pragma warning(disable: 4702)
86 
87 #endif
88 
89 #define YYPARSE_PARAM globalPtr
90 #define YYLEX_PARAM globalPtr
91 
createNodeDeclarationInfo(T node,ParserArenaData<DeclarationStacks::VarStack> * varDecls,ParserArenaData<DeclarationStacks::FunctionStack> * funcDecls,CodeFeatures info,int numConstants)92 template <typename T> inline NodeDeclarationInfo<T> createNodeDeclarationInfo(T node,
93     ParserArenaData<DeclarationStacks::VarStack>* varDecls,
94     ParserArenaData<DeclarationStacks::FunctionStack>* funcDecls,
95     CodeFeatures info, int numConstants)
96 {
97     ASSERT((info & ~AllFeatures) == 0);
98     NodeDeclarationInfo<T> result = { node, varDecls, funcDecls, info, numConstants };
99     return result;
100 }
101 
createNodeInfo(T node,CodeFeatures info,int numConstants)102 template <typename T> inline NodeInfo<T> createNodeInfo(T node, CodeFeatures info, int numConstants)
103 {
104     ASSERT((info & ~AllFeatures) == 0);
105     NodeInfo<T> result = { node, info, numConstants };
106     return result;
107 }
108 
mergeDeclarationLists(T decls1,T decls2)109 template <typename T> inline T mergeDeclarationLists(T decls1, T decls2)
110 {
111     // decls1 or both are null
112     if (!decls1)
113         return decls2;
114     // only decls1 is non-null
115     if (!decls2)
116         return decls1;
117 
118     // Both are non-null
119     decls1->data.append(decls2->data);
120 
121     // Manually release as much as possible from the now-defunct declaration lists
122     // to avoid accumulating so many unused heap allocated vectors.
123     decls2->data.clear();
124 
125     return decls1;
126 }
127 
appendToVarDeclarationList(JSGlobalData * globalData,ParserArenaData<DeclarationStacks::VarStack> * & varDecls,const Identifier & ident,unsigned attrs)128 static inline void appendToVarDeclarationList(JSGlobalData* globalData, ParserArenaData<DeclarationStacks::VarStack>*& varDecls, const Identifier& ident, unsigned attrs)
129 {
130     if (!varDecls)
131         varDecls = new (globalData) ParserArenaData<DeclarationStacks::VarStack>;
132 
133     varDecls->data.append(make_pair(&ident, attrs));
134 }
135 
appendToVarDeclarationList(JSGlobalData * globalData,ParserArenaData<DeclarationStacks::VarStack> * & varDecls,ConstDeclNode * decl)136 static inline void appendToVarDeclarationList(JSGlobalData* globalData, ParserArenaData<DeclarationStacks::VarStack>*& varDecls, ConstDeclNode* decl)
137 {
138     unsigned attrs = DeclarationStacks::IsConstant;
139     if (decl->hasInitializer())
140         attrs |= DeclarationStacks::HasInitializer;
141     appendToVarDeclarationList(globalData, varDecls, decl->ident(), attrs);
142 }
143 
144 %}
145 
146 %union {
147     int                 intValue;
148     double              doubleValue;
149     const Identifier*   ident;
150 
151     // expression subtrees
152     ExpressionNodeInfo  expressionNode;
153     FuncDeclNodeInfo    funcDeclNode;
154     PropertyNodeInfo    propertyNode;
155     ArgumentsNodeInfo   argumentsNode;
156     ConstDeclNodeInfo   constDeclNode;
157     CaseBlockNodeInfo   caseBlockNode;
158     CaseClauseNodeInfo  caseClauseNode;
159     FuncExprNodeInfo    funcExprNode;
160 
161     // statement nodes
162     StatementNodeInfo   statementNode;
163     FunctionBodyNode*   functionBodyNode;
164     ProgramNode*        programNode;
165 
166     SourceElementsInfo  sourceElements;
167     PropertyListInfo    propertyList;
168     ArgumentListInfo    argumentList;
169     VarDeclListInfo     varDeclList;
170     ConstDeclListInfo   constDeclList;
171     ClauseListInfo      clauseList;
172     ElementListInfo     elementList;
173     ParameterListInfo   parameterList;
174 
175     Operator            op;
176 }
177 
178 %{
179 
setStatementLocation(StatementNode * statement,const T & start,const T & end)180 template <typename T> inline void setStatementLocation(StatementNode* statement, const T& start, const T& end)
181 {
182     statement->setLoc(start.first_line, end.last_line);
183 }
184 
setExceptionLocation(ThrowableExpressionData * node,unsigned start,unsigned divot,unsigned end)185 static inline void setExceptionLocation(ThrowableExpressionData* node, unsigned start, unsigned divot, unsigned end)
186 {
187     node->setExceptionSourceCode(divot, divot - start, end - divot);
188 }
189 
190 %}
191 
192 %start Program
193 
194 /* literals */
195 %token NULLTOKEN TRUETOKEN FALSETOKEN
196 
197 /* keywords */
198 %token BREAK CASE DEFAULT FOR NEW VAR CONSTTOKEN CONTINUE
199 %token FUNCTION RETURN VOIDTOKEN DELETETOKEN
200 %token IF THISTOKEN DO WHILE INTOKEN INSTANCEOF TYPEOF
201 %token SWITCH WITH RESERVED
202 %token THROW TRY CATCH FINALLY
203 %token DEBUGGER
204 
205 /* give an if without an else higher precedence than an else to resolve the ambiguity */
206 %nonassoc IF_WITHOUT_ELSE
207 %nonassoc ELSE
208 
209 /* punctuators */
210 %token EQEQ NE                     /* == and != */
211 %token STREQ STRNEQ                /* === and !== */
212 %token LE GE                       /* < and > */
213 %token OR AND                      /* || and && */
214 %token PLUSPLUS MINUSMINUS         /* ++ and --  */
215 %token LSHIFT                      /* << */
216 %token RSHIFT URSHIFT              /* >> and >>> */
217 %token PLUSEQUAL MINUSEQUAL        /* += and -= */
218 %token MULTEQUAL DIVEQUAL          /* *= and /= */
219 %token LSHIFTEQUAL                 /* <<= */
220 %token RSHIFTEQUAL URSHIFTEQUAL    /* >>= and >>>= */
221 %token ANDEQUAL MODEQUAL           /* &= and %= */
222 %token XOREQUAL OREQUAL            /* ^= and |= */
223 %token <intValue> OPENBRACE        /* { (with char offset) */
224 %token <intValue> CLOSEBRACE       /* } (with char offset) */
225 
226 /* terminal types */
227 %token <doubleValue> NUMBER
228 %token <ident> IDENT STRING
229 
230 /* automatically inserted semicolon */
231 %token AUTOPLUSPLUS AUTOMINUSMINUS
232 
233 /* non-terminal types */
234 %type <expressionNode>  Literal ArrayLiteral
235 
236 %type <expressionNode>  PrimaryExpr PrimaryExprNoBrace
237 %type <expressionNode>  MemberExpr MemberExprNoBF /* BF => brace or function */
238 %type <expressionNode>  NewExpr NewExprNoBF
239 %type <expressionNode>  CallExpr CallExprNoBF
240 %type <expressionNode>  LeftHandSideExpr LeftHandSideExprNoBF
241 %type <expressionNode>  PostfixExpr PostfixExprNoBF
242 %type <expressionNode>  UnaryExpr UnaryExprNoBF UnaryExprCommon
243 %type <expressionNode>  MultiplicativeExpr MultiplicativeExprNoBF
244 %type <expressionNode>  AdditiveExpr AdditiveExprNoBF
245 %type <expressionNode>  ShiftExpr ShiftExprNoBF
246 %type <expressionNode>  RelationalExpr RelationalExprNoIn RelationalExprNoBF
247 %type <expressionNode>  EqualityExpr EqualityExprNoIn EqualityExprNoBF
248 %type <expressionNode>  BitwiseANDExpr BitwiseANDExprNoIn BitwiseANDExprNoBF
249 %type <expressionNode>  BitwiseXORExpr BitwiseXORExprNoIn BitwiseXORExprNoBF
250 %type <expressionNode>  BitwiseORExpr BitwiseORExprNoIn BitwiseORExprNoBF
251 %type <expressionNode>  LogicalANDExpr LogicalANDExprNoIn LogicalANDExprNoBF
252 %type <expressionNode>  LogicalORExpr LogicalORExprNoIn LogicalORExprNoBF
253 %type <expressionNode>  ConditionalExpr ConditionalExprNoIn ConditionalExprNoBF
254 %type <expressionNode>  AssignmentExpr AssignmentExprNoIn AssignmentExprNoBF
255 %type <expressionNode>  Expr ExprNoIn ExprNoBF
256 
257 %type <expressionNode>  ExprOpt ExprNoInOpt
258 
259 %type <statementNode>   Statement Block
260 %type <statementNode>   VariableStatement ConstStatement EmptyStatement ExprStatement
261 %type <statementNode>   IfStatement IterationStatement ContinueStatement
262 %type <statementNode>   BreakStatement ReturnStatement WithStatement
263 %type <statementNode>   SwitchStatement LabelledStatement
264 %type <statementNode>   ThrowStatement TryStatement
265 %type <statementNode>   DebuggerStatement
266 
267 %type <expressionNode>  Initializer InitializerNoIn
268 %type <statementNode>   FunctionDeclaration
269 %type <funcExprNode>    FunctionExpr
270 %type <functionBodyNode> FunctionBody
271 %type <sourceElements>  SourceElements
272 %type <parameterList>   FormalParameterList
273 %type <op>              AssignmentOperator
274 %type <argumentsNode>   Arguments
275 %type <argumentList>    ArgumentList
276 %type <varDeclList>     VariableDeclarationList VariableDeclarationListNoIn
277 %type <constDeclList>   ConstDeclarationList
278 %type <constDeclNode>   ConstDeclaration
279 %type <caseBlockNode>   CaseBlock
280 %type <caseClauseNode>  CaseClause DefaultClause
281 %type <clauseList>      CaseClauses CaseClausesOpt
282 %type <intValue>        Elision ElisionOpt
283 %type <elementList>     ElementList
284 %type <propertyNode>    Property
285 %type <propertyList>    PropertyList
286 %%
287 
288 // FIXME: There are currently two versions of the grammar in this file, the normal one, and the NoNodes version used for
289 // lazy recompilation of FunctionBodyNodes.  We should move to generating the two versions from a script to avoid bugs.
290 // In the mean time, make sure to make any changes to the grammar in both versions.
291 
292 Literal:
293     NULLTOKEN                           { $$ = createNodeInfo<ExpressionNode*>(new (GLOBAL_DATA) NullNode(GLOBAL_DATA), 0, 1); }
294   | TRUETOKEN                           { $$ = createNodeInfo<ExpressionNode*>(new (GLOBAL_DATA) BooleanNode(GLOBAL_DATA, true), 0, 1); }
295   | FALSETOKEN                          { $$ = createNodeInfo<ExpressionNode*>(new (GLOBAL_DATA) BooleanNode(GLOBAL_DATA, false), 0, 1); }
296   | NUMBER                              { $$ = createNodeInfo<ExpressionNode*>(makeNumberNode(GLOBAL_DATA, $1), 0, 1); }
297   | STRING                              { $$ = createNodeInfo<ExpressionNode*>(new (GLOBAL_DATA) StringNode(GLOBAL_DATA, *$1), 0, 1); }
298   | '/' /* regexp */                    {
299                                             Lexer& l = *GLOBAL_DATA->lexer;
300                                             const Identifier* pattern;
301                                             const Identifier* flags;
302                                             if (!l.scanRegExp(pattern, flags))
303                                                 YYABORT;
304                                             RegExpNode* node = new (GLOBAL_DATA) RegExpNode(GLOBAL_DATA, *pattern, *flags);
305                                             int size = pattern->size() + 2; // + 2 for the two /'s
306                                             setExceptionLocation(node, @1.first_column, @1.first_column + size, @1.first_column + size);
307                                             $$ = createNodeInfo<ExpressionNode*>(node, 0, 0);
308                                         }
309   | DIVEQUAL /* regexp with /= */       {
310                                             Lexer& l = *GLOBAL_DATA->lexer;
311                                             const Identifier* pattern;
312                                             const Identifier* flags;
313                                             if (!l.scanRegExp(pattern, flags, '='))
314                                                 YYABORT;
315                                             RegExpNode* node = new (GLOBAL_DATA) RegExpNode(GLOBAL_DATA, *pattern, *flags);
316                                             int size = pattern->size() + 2; // + 2 for the two /'s
317                                             setExceptionLocation(node, @1.first_column, @1.first_column + size, @1.first_column + size);
318                                             $$ = createNodeInfo<ExpressionNode*>(node, 0, 0);
319                                         }
320 ;
321 
322 Property:
323     IDENT ':' AssignmentExpr            { $$ = createNodeInfo<PropertyNode*>(new (GLOBAL_DATA) PropertyNode(GLOBAL_DATA, *$1, $3.m_node, PropertyNode::Constant), $3.m_features, $3.m_numConstants); }
324   | STRING ':' AssignmentExpr           { $$ = createNodeInfo<PropertyNode*>(new (GLOBAL_DATA) PropertyNode(GLOBAL_DATA, *$1, $3.m_node, PropertyNode::Constant), $3.m_features, $3.m_numConstants); }
325   | NUMBER ':' AssignmentExpr           { $$ = createNodeInfo<PropertyNode*>(new (GLOBAL_DATA) PropertyNode(GLOBAL_DATA, $1, $3.m_node, PropertyNode::Constant), $3.m_features, $3.m_numConstants); }
326   | IDENT IDENT '(' ')' OPENBRACE FunctionBody CLOSEBRACE    { $$ = createNodeInfo<PropertyNode*>(makeGetterOrSetterPropertyNode(GLOBAL_DATA, *$1, *$2, 0, $6, GLOBAL_DATA->lexer->sourceCode($5, $7, @5.first_line)), ClosureFeature, 0); setStatementLocation($6, @5, @7); if (!$$.m_node) YYABORT; }
327   | IDENT IDENT '(' FormalParameterList ')' OPENBRACE FunctionBody CLOSEBRACE
328                                                              {
329                                                                  $$ = createNodeInfo<PropertyNode*>(makeGetterOrSetterPropertyNode(GLOBAL_DATA, *$1, *$2, $4.m_node.head, $7, GLOBAL_DATA->lexer->sourceCode($6, $8, @6.first_line)), $4.m_features | ClosureFeature, 0);
330                                                                  if ($4.m_features & ArgumentsFeature)
331                                                                      $7->setUsesArguments();
332                                                                  setStatementLocation($7, @6, @8);
333                                                                  if (!$$.m_node)
334                                                                      YYABORT;
335                                                              }
336 ;
337 
338 PropertyList:
339     Property                            { $$.m_node.head = new (GLOBAL_DATA) PropertyListNode(GLOBAL_DATA, $1.m_node);
340                                           $$.m_node.tail = $$.m_node.head;
341                                           $$.m_features = $1.m_features;
342                                           $$.m_numConstants = $1.m_numConstants; }
343   | PropertyList ',' Property           { $$.m_node.head = $1.m_node.head;
344                                           $$.m_node.tail = new (GLOBAL_DATA) PropertyListNode(GLOBAL_DATA, $3.m_node, $1.m_node.tail);
345                                           $$.m_features = $1.m_features | $3.m_features;
346                                           $$.m_numConstants = $1.m_numConstants + $3.m_numConstants; }
347 ;
348 
349 PrimaryExpr:
350     PrimaryExprNoBrace
351   | OPENBRACE CLOSEBRACE                             { $$ = createNodeInfo<ExpressionNode*>(new (GLOBAL_DATA) ObjectLiteralNode(GLOBAL_DATA), 0, 0); }
352   | OPENBRACE PropertyList CLOSEBRACE                { $$ = createNodeInfo<ExpressionNode*>(new (GLOBAL_DATA) ObjectLiteralNode(GLOBAL_DATA, $2.m_node.head), $2.m_features, $2.m_numConstants); }
353   /* allow extra comma, see http://bugs.webkit.org/show_bug.cgi?id=5939 */
354   | OPENBRACE PropertyList ',' CLOSEBRACE            { $$ = createNodeInfo<ExpressionNode*>(new (GLOBAL_DATA) ObjectLiteralNode(GLOBAL_DATA, $2.m_node.head), $2.m_features, $2.m_numConstants); }
355 ;
356 
357 PrimaryExprNoBrace:
358     THISTOKEN                           { $$ = createNodeInfo<ExpressionNode*>(new (GLOBAL_DATA) ThisNode(GLOBAL_DATA), ThisFeature, 0); }
359   | Literal
360   | ArrayLiteral
361   | IDENT                               { $$ = createNodeInfo<ExpressionNode*>(new (GLOBAL_DATA) ResolveNode(GLOBAL_DATA, *$1, @1.first_column), (*$1 == GLOBAL_DATA->propertyNames->arguments) ? ArgumentsFeature : 0, 0); }
362   | '(' Expr ')'                        { $$ = $2; }
363 ;
364 
365 ArrayLiteral:
366     '[' ElisionOpt ']'                  { $$ = createNodeInfo<ExpressionNode*>(new (GLOBAL_DATA) ArrayNode(GLOBAL_DATA, $2), 0, $2 ? 1 : 0); }
367   | '[' ElementList ']'                 { $$ = createNodeInfo<ExpressionNode*>(new (GLOBAL_DATA) ArrayNode(GLOBAL_DATA, $2.m_node.head), $2.m_features, $2.m_numConstants); }
368   | '[' ElementList ',' ElisionOpt ']'  { $$ = createNodeInfo<ExpressionNode*>(new (GLOBAL_DATA) ArrayNode(GLOBAL_DATA, $4, $2.m_node.head), $2.m_features, $4 ? $2.m_numConstants + 1 : $2.m_numConstants); }
369 ;
370 
371 ElementList:
372     ElisionOpt AssignmentExpr           { $$.m_node.head = new (GLOBAL_DATA) ElementNode(GLOBAL_DATA, $1, $2.m_node);
373                                           $$.m_node.tail = $$.m_node.head;
374                                           $$.m_features = $2.m_features;
375                                           $$.m_numConstants = $2.m_numConstants; }
376   | ElementList ',' ElisionOpt AssignmentExpr
377                                         { $$.m_node.head = $1.m_node.head;
378                                           $$.m_node.tail = new (GLOBAL_DATA) ElementNode(GLOBAL_DATA, $1.m_node.tail, $3, $4.m_node);
379                                           $$.m_features = $1.m_features | $4.m_features;
380                                           $$.m_numConstants = $1.m_numConstants + $4.m_numConstants; }
381 ;
382 
383 ElisionOpt:
384     /* nothing */                       { $$ = 0; }
385   | Elision
386 ;
387 
388 Elision:
389     ','                                 { $$ = 1; }
390   | Elision ','                         { $$ = $1 + 1; }
391 ;
392 
393 MemberExpr:
394     PrimaryExpr
395   | FunctionExpr                        { $$ = createNodeInfo<ExpressionNode*>($1.m_node, $1.m_features, $1.m_numConstants); }
396   | MemberExpr '[' Expr ']'             { BracketAccessorNode* node = new (GLOBAL_DATA) BracketAccessorNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features & AssignFeature);
397                                           setExceptionLocation(node, @1.first_column, @1.last_column, @4.last_column);
398                                           $$ = createNodeInfo<ExpressionNode*>(node, $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants);
399                                         }
400   | MemberExpr '.' IDENT                { DotAccessorNode* node = new (GLOBAL_DATA) DotAccessorNode(GLOBAL_DATA, $1.m_node, *$3);
401                                           setExceptionLocation(node, @1.first_column, @1.last_column, @3.last_column);
402                                           $$ = createNodeInfo<ExpressionNode*>(node, $1.m_features, $1.m_numConstants);
403                                         }
404   | NEW MemberExpr Arguments            { NewExprNode* node = new (GLOBAL_DATA) NewExprNode(GLOBAL_DATA, $2.m_node, $3.m_node);
405                                           setExceptionLocation(node, @1.first_column, @2.last_column, @3.last_column);
406                                           $$ = createNodeInfo<ExpressionNode*>(node, $2.m_features | $3.m_features, $2.m_numConstants + $3.m_numConstants);
407                                         }
408 ;
409 
410 MemberExprNoBF:
411     PrimaryExprNoBrace
412   | MemberExprNoBF '[' Expr ']'         { BracketAccessorNode* node = new (GLOBAL_DATA) BracketAccessorNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features & AssignFeature);
413                                           setExceptionLocation(node, @1.first_column, @1.last_column, @4.last_column);
414                                           $$ = createNodeInfo<ExpressionNode*>(node, $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants);
415                                         }
416   | MemberExprNoBF '.' IDENT            { DotAccessorNode* node = new (GLOBAL_DATA) DotAccessorNode(GLOBAL_DATA, $1.m_node, *$3);
417                                           setExceptionLocation(node, @1.first_column, @1.last_column, @3.last_column);
418                                           $$ = createNodeInfo<ExpressionNode*>(node, $1.m_features, $1.m_numConstants);
419                                         }
420   | NEW MemberExpr Arguments            { NewExprNode* node = new (GLOBAL_DATA) NewExprNode(GLOBAL_DATA, $2.m_node, $3.m_node);
421                                           setExceptionLocation(node, @1.first_column, @2.last_column, @3.last_column);
422                                           $$ = createNodeInfo<ExpressionNode*>(node, $2.m_features | $3.m_features, $2.m_numConstants + $3.m_numConstants);
423                                         }
424 ;
425 
426 NewExpr:
427     MemberExpr
428   | NEW NewExpr                         { NewExprNode* node = new (GLOBAL_DATA) NewExprNode(GLOBAL_DATA, $2.m_node);
429                                           setExceptionLocation(node, @1.first_column, @2.last_column, @2.last_column);
430                                           $$ = createNodeInfo<ExpressionNode*>(node, $2.m_features, $2.m_numConstants);
431                                         }
432 ;
433 
434 NewExprNoBF:
435     MemberExprNoBF
436   | NEW NewExpr                         { NewExprNode* node = new (GLOBAL_DATA) NewExprNode(GLOBAL_DATA, $2.m_node);
437                                           setExceptionLocation(node, @1.first_column, @2.last_column, @2.last_column);
438                                           $$ = createNodeInfo<ExpressionNode*>(node, $2.m_features, $2.m_numConstants);
439                                         }
440 ;
441 
442 CallExpr:
443     MemberExpr Arguments                { $$ = makeFunctionCallNode(GLOBAL_DATA, $1, $2, @1.first_column, @1.last_column, @2.last_column); }
444   | CallExpr Arguments                  { $$ = makeFunctionCallNode(GLOBAL_DATA, $1, $2, @1.first_column, @1.last_column, @2.last_column); }
445   | CallExpr '[' Expr ']'               { BracketAccessorNode* node = new (GLOBAL_DATA) BracketAccessorNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features & AssignFeature);
446                                           setExceptionLocation(node, @1.first_column, @1.last_column, @4.last_column);
447                                           $$ = createNodeInfo<ExpressionNode*>(node, $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants);
448                                         }
449   | CallExpr '.' IDENT                  { DotAccessorNode* node = new (GLOBAL_DATA) DotAccessorNode(GLOBAL_DATA, $1.m_node, *$3);
450                                           setExceptionLocation(node, @1.first_column, @1.last_column, @3.last_column);
451                                           $$ = createNodeInfo<ExpressionNode*>(node, $1.m_features, $1.m_numConstants); }
452 ;
453 
454 CallExprNoBF:
455     MemberExprNoBF Arguments            { $$ = makeFunctionCallNode(GLOBAL_DATA, $1, $2, @1.first_column, @1.last_column, @2.last_column); }
456   | CallExprNoBF Arguments              { $$ = makeFunctionCallNode(GLOBAL_DATA, $1, $2, @1.first_column, @1.last_column, @2.last_column); }
457   | CallExprNoBF '[' Expr ']'           { BracketAccessorNode* node = new (GLOBAL_DATA) BracketAccessorNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features & AssignFeature);
458                                           setExceptionLocation(node, @1.first_column, @1.last_column, @4.last_column);
459                                           $$ = createNodeInfo<ExpressionNode*>(node, $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants);
460                                         }
461   | CallExprNoBF '.' IDENT              { DotAccessorNode* node = new (GLOBAL_DATA) DotAccessorNode(GLOBAL_DATA, $1.m_node, *$3);
462                                           setExceptionLocation(node, @1.first_column, @1.last_column, @3.last_column);
463                                           $$ = createNodeInfo<ExpressionNode*>(node, $1.m_features, $1.m_numConstants);
464                                         }
465 ;
466 
467 Arguments:
468     '(' ')'                             { $$ = createNodeInfo<ArgumentsNode*>(new (GLOBAL_DATA) ArgumentsNode(GLOBAL_DATA), 0, 0); }
469   | '(' ArgumentList ')'                { $$ = createNodeInfo<ArgumentsNode*>(new (GLOBAL_DATA) ArgumentsNode(GLOBAL_DATA, $2.m_node.head), $2.m_features, $2.m_numConstants); }
470 ;
471 
472 ArgumentList:
473     AssignmentExpr                      { $$.m_node.head = new (GLOBAL_DATA) ArgumentListNode(GLOBAL_DATA, $1.m_node);
474                                           $$.m_node.tail = $$.m_node.head;
475                                           $$.m_features = $1.m_features;
476                                           $$.m_numConstants = $1.m_numConstants; }
477   | ArgumentList ',' AssignmentExpr     { $$.m_node.head = $1.m_node.head;
478                                           $$.m_node.tail = new (GLOBAL_DATA) ArgumentListNode(GLOBAL_DATA, $1.m_node.tail, $3.m_node);
479                                           $$.m_features = $1.m_features | $3.m_features;
480                                           $$.m_numConstants = $1.m_numConstants + $3.m_numConstants; }
481 ;
482 
483 LeftHandSideExpr:
484     NewExpr
485   | CallExpr
486 ;
487 
488 LeftHandSideExprNoBF:
489     NewExprNoBF
490   | CallExprNoBF
491 ;
492 
493 PostfixExpr:
494     LeftHandSideExpr
495   | LeftHandSideExpr PLUSPLUS           { $$ = createNodeInfo<ExpressionNode*>(makePostfixNode(GLOBAL_DATA, $1.m_node, OpPlusPlus, @1.first_column, @1.last_column, @2.last_column), $1.m_features | AssignFeature, $1.m_numConstants); }
496   | LeftHandSideExpr MINUSMINUS         { $$ = createNodeInfo<ExpressionNode*>(makePostfixNode(GLOBAL_DATA, $1.m_node, OpMinusMinus, @1.first_column, @1.last_column, @2.last_column), $1.m_features | AssignFeature, $1.m_numConstants); }
497 ;
498 
499 PostfixExprNoBF:
500     LeftHandSideExprNoBF
501   | LeftHandSideExprNoBF PLUSPLUS       { $$ = createNodeInfo<ExpressionNode*>(makePostfixNode(GLOBAL_DATA, $1.m_node, OpPlusPlus, @1.first_column, @1.last_column, @2.last_column), $1.m_features | AssignFeature, $1.m_numConstants); }
502   | LeftHandSideExprNoBF MINUSMINUS     { $$ = createNodeInfo<ExpressionNode*>(makePostfixNode(GLOBAL_DATA, $1.m_node, OpMinusMinus, @1.first_column, @1.last_column, @2.last_column), $1.m_features | AssignFeature, $1.m_numConstants); }
503 ;
504 
505 UnaryExprCommon:
506     DELETETOKEN UnaryExpr               { $$ = createNodeInfo<ExpressionNode*>(makeDeleteNode(GLOBAL_DATA, $2.m_node, @1.first_column, @2.last_column, @2.last_column), $2.m_features, $2.m_numConstants); }
507   | VOIDTOKEN UnaryExpr                 { $$ = createNodeInfo<ExpressionNode*>(new (GLOBAL_DATA) VoidNode(GLOBAL_DATA, $2.m_node), $2.m_features, $2.m_numConstants + 1); }
508   | TYPEOF UnaryExpr                    { $$ = createNodeInfo<ExpressionNode*>(makeTypeOfNode(GLOBAL_DATA, $2.m_node), $2.m_features, $2.m_numConstants); }
509   | PLUSPLUS UnaryExpr                  { $$ = createNodeInfo<ExpressionNode*>(makePrefixNode(GLOBAL_DATA, $2.m_node, OpPlusPlus, @1.first_column, @2.first_column + 1, @2.last_column), $2.m_features | AssignFeature, $2.m_numConstants); }
510   | AUTOPLUSPLUS UnaryExpr              { $$ = createNodeInfo<ExpressionNode*>(makePrefixNode(GLOBAL_DATA, $2.m_node, OpPlusPlus, @1.first_column, @2.first_column + 1, @2.last_column), $2.m_features | AssignFeature, $2.m_numConstants); }
511   | MINUSMINUS UnaryExpr                { $$ = createNodeInfo<ExpressionNode*>(makePrefixNode(GLOBAL_DATA, $2.m_node, OpMinusMinus, @1.first_column, @2.first_column + 1, @2.last_column), $2.m_features | AssignFeature, $2.m_numConstants); }
512   | AUTOMINUSMINUS UnaryExpr            { $$ = createNodeInfo<ExpressionNode*>(makePrefixNode(GLOBAL_DATA, $2.m_node, OpMinusMinus, @1.first_column, @2.first_column + 1, @2.last_column), $2.m_features | AssignFeature, $2.m_numConstants); }
513   | '+' UnaryExpr                       { $$ = createNodeInfo<ExpressionNode*>(new (GLOBAL_DATA) UnaryPlusNode(GLOBAL_DATA, $2.m_node), $2.m_features, $2.m_numConstants); }
514   | '-' UnaryExpr                       { $$ = createNodeInfo<ExpressionNode*>(makeNegateNode(GLOBAL_DATA, $2.m_node), $2.m_features, $2.m_numConstants); }
515   | '~' UnaryExpr                       { $$ = createNodeInfo<ExpressionNode*>(makeBitwiseNotNode(GLOBAL_DATA, $2.m_node), $2.m_features, $2.m_numConstants); }
516   | '!' UnaryExpr                       { $$ = createNodeInfo<ExpressionNode*>(new (GLOBAL_DATA) LogicalNotNode(GLOBAL_DATA, $2.m_node), $2.m_features, $2.m_numConstants); }
517 
518 UnaryExpr:
519     PostfixExpr
520   | UnaryExprCommon
521 ;
522 
523 UnaryExprNoBF:
524     PostfixExprNoBF
525   | UnaryExprCommon
526 ;
527 
528 MultiplicativeExpr:
529     UnaryExpr
530   | MultiplicativeExpr '*' UnaryExpr    { $$ = createNodeInfo<ExpressionNode*>(makeMultNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features & AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
531   | MultiplicativeExpr '/' UnaryExpr    { $$ = createNodeInfo<ExpressionNode*>(makeDivNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features & AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
532   | MultiplicativeExpr '%' UnaryExpr    { $$ = createNodeInfo<ExpressionNode*>(new (GLOBAL_DATA) ModNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features & AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
533 ;
534 
535 MultiplicativeExprNoBF:
536     UnaryExprNoBF
537   | MultiplicativeExprNoBF '*' UnaryExpr
538                                         { $$ = createNodeInfo<ExpressionNode*>(makeMultNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features & AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
539   | MultiplicativeExprNoBF '/' UnaryExpr
540                                         { $$ = createNodeInfo<ExpressionNode*>(makeDivNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features & AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
541   | MultiplicativeExprNoBF '%' UnaryExpr
542                                         { $$ = createNodeInfo<ExpressionNode*>(new (GLOBAL_DATA) ModNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features & AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
543 ;
544 
545 AdditiveExpr:
546     MultiplicativeExpr
547   | AdditiveExpr '+' MultiplicativeExpr { $$ = createNodeInfo<ExpressionNode*>(makeAddNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features & AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
548   | AdditiveExpr '-' MultiplicativeExpr { $$ = createNodeInfo<ExpressionNode*>(makeSubNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features & AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
549 ;
550 
551 AdditiveExprNoBF:
552     MultiplicativeExprNoBF
553   | AdditiveExprNoBF '+' MultiplicativeExpr
554                                         { $$ = createNodeInfo<ExpressionNode*>(makeAddNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features & AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
555   | AdditiveExprNoBF '-' MultiplicativeExpr
556                                         { $$ = createNodeInfo<ExpressionNode*>(makeSubNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features & AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
557 ;
558 
559 ShiftExpr:
560     AdditiveExpr
561   | ShiftExpr LSHIFT AdditiveExpr       { $$ = createNodeInfo<ExpressionNode*>(makeLeftShiftNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features & AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
562   | ShiftExpr RSHIFT AdditiveExpr       { $$ = createNodeInfo<ExpressionNode*>(makeRightShiftNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features & AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
563   | ShiftExpr URSHIFT AdditiveExpr      { $$ = createNodeInfo<ExpressionNode*>(new (GLOBAL_DATA) UnsignedRightShiftNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features & AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
564 ;
565 
566 ShiftExprNoBF:
567     AdditiveExprNoBF
568   | ShiftExprNoBF LSHIFT AdditiveExpr   { $$ = createNodeInfo<ExpressionNode*>(makeLeftShiftNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features & AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
569   | ShiftExprNoBF RSHIFT AdditiveExpr   { $$ = createNodeInfo<ExpressionNode*>(makeRightShiftNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features & AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
570   | ShiftExprNoBF URSHIFT AdditiveExpr  { $$ = createNodeInfo<ExpressionNode*>(new (GLOBAL_DATA) UnsignedRightShiftNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features & AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
571 ;
572 
573 RelationalExpr:
574     ShiftExpr
575   | RelationalExpr '<' ShiftExpr        { $$ = createNodeInfo<ExpressionNode*>(new (GLOBAL_DATA) LessNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features & AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
576   | RelationalExpr '>' ShiftExpr        { $$ = createNodeInfo<ExpressionNode*>(new (GLOBAL_DATA) GreaterNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features & AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
577   | RelationalExpr LE ShiftExpr         { $$ = createNodeInfo<ExpressionNode*>(new (GLOBAL_DATA) LessEqNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features & AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
578   | RelationalExpr GE ShiftExpr         { $$ = createNodeInfo<ExpressionNode*>(new (GLOBAL_DATA) GreaterEqNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features & AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
579   | RelationalExpr INSTANCEOF ShiftExpr { InstanceOfNode* node = new (GLOBAL_DATA) InstanceOfNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features & AssignFeature);
580                                           setExceptionLocation(node, @1.first_column, @3.first_column, @3.last_column);
581                                           $$ = createNodeInfo<ExpressionNode*>(node, $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
582   | RelationalExpr INTOKEN ShiftExpr    { InNode* node = new (GLOBAL_DATA) InNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features & AssignFeature);
583                                           setExceptionLocation(node, @1.first_column, @3.first_column, @3.last_column);
584                                           $$ = createNodeInfo<ExpressionNode*>(node, $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
585 ;
586 
587 RelationalExprNoIn:
588     ShiftExpr
589   | RelationalExprNoIn '<' ShiftExpr    { $$ = createNodeInfo<ExpressionNode*>(new (GLOBAL_DATA) LessNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features & AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
590   | RelationalExprNoIn '>' ShiftExpr    { $$ = createNodeInfo<ExpressionNode*>(new (GLOBAL_DATA) GreaterNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features & AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
591   | RelationalExprNoIn LE ShiftExpr     { $$ = createNodeInfo<ExpressionNode*>(new (GLOBAL_DATA) LessEqNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features & AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
592   | RelationalExprNoIn GE ShiftExpr     { $$ = createNodeInfo<ExpressionNode*>(new (GLOBAL_DATA) GreaterEqNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features & AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
593   | RelationalExprNoIn INSTANCEOF ShiftExpr
594                                         { InstanceOfNode* node = new (GLOBAL_DATA) InstanceOfNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features & AssignFeature);
595                                           setExceptionLocation(node, @1.first_column, @3.first_column, @3.last_column);
596                                           $$ = createNodeInfo<ExpressionNode*>(node, $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
597 ;
598 
599 RelationalExprNoBF:
600     ShiftExprNoBF
601   | RelationalExprNoBF '<' ShiftExpr    { $$ = createNodeInfo<ExpressionNode*>(new (GLOBAL_DATA) LessNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features & AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
602   | RelationalExprNoBF '>' ShiftExpr    { $$ = createNodeInfo<ExpressionNode*>(new (GLOBAL_DATA) GreaterNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features & AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
603   | RelationalExprNoBF LE ShiftExpr     { $$ = createNodeInfo<ExpressionNode*>(new (GLOBAL_DATA) LessEqNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features & AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
604   | RelationalExprNoBF GE ShiftExpr     { $$ = createNodeInfo<ExpressionNode*>(new (GLOBAL_DATA) GreaterEqNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features & AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
605   | RelationalExprNoBF INSTANCEOF ShiftExpr
606                                         { InstanceOfNode* node = new (GLOBAL_DATA) InstanceOfNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features & AssignFeature);
607                                           setExceptionLocation(node, @1.first_column, @3.first_column, @3.last_column);
608                                           $$ = createNodeInfo<ExpressionNode*>(node, $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
609   | RelationalExprNoBF INTOKEN ShiftExpr
610                                         { InNode* node = new (GLOBAL_DATA) InNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features & AssignFeature);
611                                           setExceptionLocation(node, @1.first_column, @3.first_column, @3.last_column);
612                                           $$ = createNodeInfo<ExpressionNode*>(node, $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
613 ;
614 
615 EqualityExpr:
616     RelationalExpr
617   | EqualityExpr EQEQ RelationalExpr    { $$ = createNodeInfo<ExpressionNode*>(new (GLOBAL_DATA) EqualNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features & AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
618   | EqualityExpr NE RelationalExpr      { $$ = createNodeInfo<ExpressionNode*>(new (GLOBAL_DATA) NotEqualNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features & AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
619   | EqualityExpr STREQ RelationalExpr   { $$ = createNodeInfo<ExpressionNode*>(new (GLOBAL_DATA) StrictEqualNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features & AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
620   | EqualityExpr STRNEQ RelationalExpr  { $$ = createNodeInfo<ExpressionNode*>(new (GLOBAL_DATA) NotStrictEqualNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features & AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
621 ;
622 
623 EqualityExprNoIn:
624     RelationalExprNoIn
625   | EqualityExprNoIn EQEQ RelationalExprNoIn
626                                         { $$ = createNodeInfo<ExpressionNode*>(new (GLOBAL_DATA) EqualNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features & AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
627   | EqualityExprNoIn NE RelationalExprNoIn
628                                         { $$ = createNodeInfo<ExpressionNode*>(new (GLOBAL_DATA) NotEqualNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features & AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
629   | EqualityExprNoIn STREQ RelationalExprNoIn
630                                         { $$ = createNodeInfo<ExpressionNode*>(new (GLOBAL_DATA) StrictEqualNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features & AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
631   | EqualityExprNoIn STRNEQ RelationalExprNoIn
632                                         { $$ = createNodeInfo<ExpressionNode*>(new (GLOBAL_DATA) NotStrictEqualNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features & AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
633 ;
634 
635 EqualityExprNoBF:
636     RelationalExprNoBF
637   | EqualityExprNoBF EQEQ RelationalExpr
638                                         { $$ = createNodeInfo<ExpressionNode*>(new (GLOBAL_DATA) EqualNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features & AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
639   | EqualityExprNoBF NE RelationalExpr  { $$ = createNodeInfo<ExpressionNode*>(new (GLOBAL_DATA) NotEqualNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features & AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
640   | EqualityExprNoBF STREQ RelationalExpr
641                                         { $$ = createNodeInfo<ExpressionNode*>(new (GLOBAL_DATA) StrictEqualNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features & AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
642   | EqualityExprNoBF STRNEQ RelationalExpr
643                                         { $$ = createNodeInfo<ExpressionNode*>(new (GLOBAL_DATA) NotStrictEqualNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features & AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
644 ;
645 
646 BitwiseANDExpr:
647     EqualityExpr
648   | BitwiseANDExpr '&' EqualityExpr     { $$ = createNodeInfo<ExpressionNode*>(new (GLOBAL_DATA) BitAndNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features & AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
649 ;
650 
651 BitwiseANDExprNoIn:
652     EqualityExprNoIn
653   | BitwiseANDExprNoIn '&' EqualityExprNoIn
654                                         { $$ = createNodeInfo<ExpressionNode*>(new (GLOBAL_DATA) BitAndNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features & AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
655 ;
656 
657 BitwiseANDExprNoBF:
658     EqualityExprNoBF
659   | BitwiseANDExprNoBF '&' EqualityExpr { $$ = createNodeInfo<ExpressionNode*>(new (GLOBAL_DATA) BitAndNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features & AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
660 ;
661 
662 BitwiseXORExpr:
663     BitwiseANDExpr
664   | BitwiseXORExpr '^' BitwiseANDExpr   { $$ = createNodeInfo<ExpressionNode*>(new (GLOBAL_DATA) BitXOrNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features & AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
665 ;
666 
667 BitwiseXORExprNoIn:
668     BitwiseANDExprNoIn
669   | BitwiseXORExprNoIn '^' BitwiseANDExprNoIn
670                                         { $$ = createNodeInfo<ExpressionNode*>(new (GLOBAL_DATA) BitXOrNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features & AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
671 ;
672 
673 BitwiseXORExprNoBF:
674     BitwiseANDExprNoBF
675   | BitwiseXORExprNoBF '^' BitwiseANDExpr
676                                         { $$ = createNodeInfo<ExpressionNode*>(new (GLOBAL_DATA) BitXOrNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features & AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
677 ;
678 
679 BitwiseORExpr:
680     BitwiseXORExpr
681   | BitwiseORExpr '|' BitwiseXORExpr    { $$ = createNodeInfo<ExpressionNode*>(new (GLOBAL_DATA) BitOrNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features & AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
682 ;
683 
684 BitwiseORExprNoIn:
685     BitwiseXORExprNoIn
686   | BitwiseORExprNoIn '|' BitwiseXORExprNoIn
687                                         { $$ = createNodeInfo<ExpressionNode*>(new (GLOBAL_DATA) BitOrNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features & AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
688 ;
689 
690 BitwiseORExprNoBF:
691     BitwiseXORExprNoBF
692   | BitwiseORExprNoBF '|' BitwiseXORExpr
693                                         { $$ = createNodeInfo<ExpressionNode*>(new (GLOBAL_DATA) BitOrNode(GLOBAL_DATA, $1.m_node, $3.m_node, $3.m_features & AssignFeature), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
694 ;
695 
696 LogicalANDExpr:
697     BitwiseORExpr
698   | LogicalANDExpr AND BitwiseORExpr    { $$ = createNodeInfo<ExpressionNode*>(new (GLOBAL_DATA) LogicalOpNode(GLOBAL_DATA, $1.m_node, $3.m_node, OpLogicalAnd), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
699 ;
700 
701 LogicalANDExprNoIn:
702     BitwiseORExprNoIn
703   | LogicalANDExprNoIn AND BitwiseORExprNoIn
704                                         { $$ = createNodeInfo<ExpressionNode*>(new (GLOBAL_DATA) LogicalOpNode(GLOBAL_DATA, $1.m_node, $3.m_node, OpLogicalAnd), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
705 ;
706 
707 LogicalANDExprNoBF:
708     BitwiseORExprNoBF
709   | LogicalANDExprNoBF AND BitwiseORExpr
710                                         { $$ = createNodeInfo<ExpressionNode*>(new (GLOBAL_DATA) LogicalOpNode(GLOBAL_DATA, $1.m_node, $3.m_node, OpLogicalAnd), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
711 ;
712 
713 LogicalORExpr:
714     LogicalANDExpr
715   | LogicalORExpr OR LogicalANDExpr     { $$ = createNodeInfo<ExpressionNode*>(new (GLOBAL_DATA) LogicalOpNode(GLOBAL_DATA, $1.m_node, $3.m_node, OpLogicalOr), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
716 ;
717 
718 LogicalORExprNoIn:
719     LogicalANDExprNoIn
720   | LogicalORExprNoIn OR LogicalANDExprNoIn
721                                         { $$ = createNodeInfo<ExpressionNode*>(new (GLOBAL_DATA) LogicalOpNode(GLOBAL_DATA, $1.m_node, $3.m_node, OpLogicalOr), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
722 ;
723 
724 LogicalORExprNoBF:
725     LogicalANDExprNoBF
726   | LogicalORExprNoBF OR LogicalANDExpr { $$ = createNodeInfo<ExpressionNode*>(new (GLOBAL_DATA) LogicalOpNode(GLOBAL_DATA, $1.m_node, $3.m_node, OpLogicalOr), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
727 ;
728 
729 ConditionalExpr:
730     LogicalORExpr
731   | LogicalORExpr '?' AssignmentExpr ':' AssignmentExpr
732                                         { $$ = createNodeInfo<ExpressionNode*>(new (GLOBAL_DATA) ConditionalNode(GLOBAL_DATA, $1.m_node, $3.m_node, $5.m_node), $1.m_features | $3.m_features | $5.m_features, $1.m_numConstants + $3.m_numConstants + $5.m_numConstants); }
733 ;
734 
735 ConditionalExprNoIn:
736     LogicalORExprNoIn
737   | LogicalORExprNoIn '?' AssignmentExprNoIn ':' AssignmentExprNoIn
738                                         { $$ = createNodeInfo<ExpressionNode*>(new (GLOBAL_DATA) ConditionalNode(GLOBAL_DATA, $1.m_node, $3.m_node, $5.m_node), $1.m_features | $3.m_features | $5.m_features, $1.m_numConstants + $3.m_numConstants + $5.m_numConstants); }
739 ;
740 
741 ConditionalExprNoBF:
742     LogicalORExprNoBF
743   | LogicalORExprNoBF '?' AssignmentExpr ':' AssignmentExpr
744                                         { $$ = createNodeInfo<ExpressionNode*>(new (GLOBAL_DATA) ConditionalNode(GLOBAL_DATA, $1.m_node, $3.m_node, $5.m_node), $1.m_features | $3.m_features | $5.m_features, $1.m_numConstants + $3.m_numConstants + $5.m_numConstants); }
745 ;
746 
747 AssignmentExpr:
748     ConditionalExpr
749   | LeftHandSideExpr AssignmentOperator AssignmentExpr
750                                         { $$ = createNodeInfo<ExpressionNode*>(makeAssignNode(GLOBAL_DATA, $1.m_node, $2, $3.m_node, $1.m_features & AssignFeature, $3.m_features & AssignFeature,
751                                                                                                      @1.first_column, @2.first_column + 1, @3.last_column), $1.m_features | $3.m_features | AssignFeature, $1.m_numConstants + $3.m_numConstants);
752                                         }
753 ;
754 
755 AssignmentExprNoIn:
756     ConditionalExprNoIn
757   | LeftHandSideExpr AssignmentOperator AssignmentExprNoIn
758                                         { $$ = createNodeInfo<ExpressionNode*>(makeAssignNode(GLOBAL_DATA, $1.m_node, $2, $3.m_node, $1.m_features & AssignFeature, $3.m_features & AssignFeature,
759                                                                                                      @1.first_column, @2.first_column + 1, @3.last_column), $1.m_features | $3.m_features | AssignFeature, $1.m_numConstants + $3.m_numConstants);
760                                         }
761 ;
762 
763 AssignmentExprNoBF:
764     ConditionalExprNoBF
765   | LeftHandSideExprNoBF AssignmentOperator AssignmentExpr
766                                         { $$ = createNodeInfo<ExpressionNode*>(makeAssignNode(GLOBAL_DATA, $1.m_node, $2, $3.m_node, $1.m_features & AssignFeature, $3.m_features & AssignFeature,
767                                                                                                      @1.first_column, @2.first_column + 1, @3.last_column), $1.m_features | $3.m_features | AssignFeature, $1.m_numConstants + $3.m_numConstants);
768                                         }
769 ;
770 
771 AssignmentOperator:
772     '='                                 { $$ = OpEqual; }
773   | PLUSEQUAL                           { $$ = OpPlusEq; }
774   | MINUSEQUAL                          { $$ = OpMinusEq; }
775   | MULTEQUAL                           { $$ = OpMultEq; }
776   | DIVEQUAL                            { $$ = OpDivEq; }
777   | LSHIFTEQUAL                         { $$ = OpLShift; }
778   | RSHIFTEQUAL                         { $$ = OpRShift; }
779   | URSHIFTEQUAL                        { $$ = OpURShift; }
780   | ANDEQUAL                            { $$ = OpAndEq; }
781   | XOREQUAL                            { $$ = OpXOrEq; }
782   | OREQUAL                             { $$ = OpOrEq; }
783   | MODEQUAL                            { $$ = OpModEq; }
784 ;
785 
786 Expr:
787     AssignmentExpr
788   | Expr ',' AssignmentExpr             { $$ = createNodeInfo<ExpressionNode*>(combineCommaNodes(GLOBAL_DATA, $1.m_node, $3.m_node), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
789 ;
790 
791 ExprNoIn:
792     AssignmentExprNoIn
793   | ExprNoIn ',' AssignmentExprNoIn     { $$ = createNodeInfo<ExpressionNode*>(combineCommaNodes(GLOBAL_DATA, $1.m_node, $3.m_node), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
794 ;
795 
796 ExprNoBF:
797     AssignmentExprNoBF
798   | ExprNoBF ',' AssignmentExpr         { $$ = createNodeInfo<ExpressionNode*>(combineCommaNodes(GLOBAL_DATA, $1.m_node, $3.m_node), $1.m_features | $3.m_features, $1.m_numConstants + $3.m_numConstants); }
799 ;
800 
801 Statement:
802     Block
803   | VariableStatement
804   | ConstStatement
805   | FunctionDeclaration
806   | EmptyStatement
807   | ExprStatement
808   | IfStatement
809   | IterationStatement
810   | ContinueStatement
811   | BreakStatement
812   | ReturnStatement
813   | WithStatement
814   | SwitchStatement
815   | LabelledStatement
816   | ThrowStatement
817   | TryStatement
818   | DebuggerStatement
819 ;
820 
821 Block:
822     OPENBRACE CLOSEBRACE                { $$ = createNodeDeclarationInfo<StatementNode*>(new (GLOBAL_DATA) BlockNode(GLOBAL_DATA, 0), 0, 0, 0, 0);
823                                           setStatementLocation($$.m_node, @1, @2); }
824   | OPENBRACE SourceElements CLOSEBRACE { $$ = createNodeDeclarationInfo<StatementNode*>(new (GLOBAL_DATA) BlockNode(GLOBAL_DATA, $2.m_node), $2.m_varDeclarations, $2.m_funcDeclarations, $2.m_features, $2.m_numConstants);
825                                           setStatementLocation($$.m_node, @1, @3); }
826 ;
827 
828 VariableStatement:
829     VAR VariableDeclarationList ';'     { $$ = createNodeDeclarationInfo<StatementNode*>(makeVarStatementNode(GLOBAL_DATA, $2.m_node), $2.m_varDeclarations, $2.m_funcDeclarations, $2.m_features, $2.m_numConstants);
830                                           setStatementLocation($$.m_node, @1, @3); }
831   | VAR VariableDeclarationList error   { $$ = createNodeDeclarationInfo<StatementNode*>(makeVarStatementNode(GLOBAL_DATA, $2.m_node), $2.m_varDeclarations, $2.m_funcDeclarations, $2.m_features, $2.m_numConstants);
832                                           setStatementLocation($$.m_node, @1, @2);
833                                           AUTO_SEMICOLON; }
834 ;
835 
836 VariableDeclarationList:
837     IDENT                               { $$.m_node = 0;
838                                           $$.m_varDeclarations = new (GLOBAL_DATA) ParserArenaData<DeclarationStacks::VarStack>;
839                                           appendToVarDeclarationList(GLOBAL_DATA, $$.m_varDeclarations, *$1, 0);
840                                           $$.m_funcDeclarations = 0;
841                                           $$.m_features = (*$1 == GLOBAL_DATA->propertyNames->arguments) ? ArgumentsFeature : 0;
842                                           $$.m_numConstants = 0;
843                                         }
844   | IDENT Initializer                   { AssignResolveNode* node = new (GLOBAL_DATA) AssignResolveNode(GLOBAL_DATA, *$1, $2.m_node, $2.m_features & AssignFeature);
845                                           setExceptionLocation(node, @1.first_column, @2.first_column + 1, @2.last_column);
846                                           $$.m_node = node;
847                                           $$.m_varDeclarations = new (GLOBAL_DATA) ParserArenaData<DeclarationStacks::VarStack>;
848                                           appendToVarDeclarationList(GLOBAL_DATA, $$.m_varDeclarations, *$1, DeclarationStacks::HasInitializer);
849                                           $$.m_funcDeclarations = 0;
850                                           $$.m_features = ((*$1 == GLOBAL_DATA->propertyNames->arguments) ? ArgumentsFeature : 0) | $2.m_features;
851                                           $$.m_numConstants = $2.m_numConstants;
852                                         }
853   | VariableDeclarationList ',' IDENT
854                                         { $$.m_node = $1.m_node;
855                                           $$.m_varDeclarations = $1.m_varDeclarations;
856                                           appendToVarDeclarationList(GLOBAL_DATA, $$.m_varDeclarations, *$3, 0);
857                                           $$.m_funcDeclarations = 0;
858                                           $$.m_features = $1.m_features | ((*$3 == GLOBAL_DATA->propertyNames->arguments) ? ArgumentsFeature : 0);
859                                           $$.m_numConstants = $1.m_numConstants;
860                                         }
861   | VariableDeclarationList ',' IDENT Initializer
862                                         { AssignResolveNode* node = new (GLOBAL_DATA) AssignResolveNode(GLOBAL_DATA, *$3, $4.m_node, $4.m_features & AssignFeature);
863                                           setExceptionLocation(node, @3.first_column, @4.first_column + 1, @4.last_column);
864                                           $$.m_node = combineCommaNodes(GLOBAL_DATA, $1.m_node, node);
865                                           $$.m_varDeclarations = $1.m_varDeclarations;
866                                           appendToVarDeclarationList(GLOBAL_DATA, $$.m_varDeclarations, *$3, DeclarationStacks::HasInitializer);
867                                           $$.m_funcDeclarations = 0;
868                                           $$.m_features = $1.m_features | ((*$3 == GLOBAL_DATA->propertyNames->arguments) ? ArgumentsFeature : 0) | $4.m_features;
869                                           $$.m_numConstants = $1.m_numConstants + $4.m_numConstants;
870                                         }
871 ;
872 
873 VariableDeclarationListNoIn:
874     IDENT                               { $$.m_node = 0;
875                                           $$.m_varDeclarations = new (GLOBAL_DATA) ParserArenaData<DeclarationStacks::VarStack>;
876                                           appendToVarDeclarationList(GLOBAL_DATA, $$.m_varDeclarations, *$1, 0);
877                                           $$.m_funcDeclarations = 0;
878                                           $$.m_features = (*$1 == GLOBAL_DATA->propertyNames->arguments) ? ArgumentsFeature : 0;
879                                           $$.m_numConstants = 0;
880                                         }
881   | IDENT InitializerNoIn               { AssignResolveNode* node = new (GLOBAL_DATA) AssignResolveNode(GLOBAL_DATA, *$1, $2.m_node, $2.m_features & AssignFeature);
882                                           setExceptionLocation(node, @1.first_column, @2.first_column + 1, @2.last_column);
883                                           $$.m_node = node;
884                                           $$.m_varDeclarations = new (GLOBAL_DATA) ParserArenaData<DeclarationStacks::VarStack>;
885                                           appendToVarDeclarationList(GLOBAL_DATA, $$.m_varDeclarations, *$1, DeclarationStacks::HasInitializer);
886                                           $$.m_funcDeclarations = 0;
887                                           $$.m_features = ((*$1 == GLOBAL_DATA->propertyNames->arguments) ? ArgumentsFeature : 0) | $2.m_features;
888                                           $$.m_numConstants = $2.m_numConstants;
889                                         }
890   | VariableDeclarationListNoIn ',' IDENT
891                                         { $$.m_node = $1.m_node;
892                                           $$.m_varDeclarations = $1.m_varDeclarations;
893                                           appendToVarDeclarationList(GLOBAL_DATA, $$.m_varDeclarations, *$3, 0);
894                                           $$.m_funcDeclarations = 0;
895                                           $$.m_features = $1.m_features | ((*$3 == GLOBAL_DATA->propertyNames->arguments) ? ArgumentsFeature : 0);
896                                           $$.m_numConstants = $1.m_numConstants;
897                                         }
898   | VariableDeclarationListNoIn ',' IDENT InitializerNoIn
899                                         { AssignResolveNode* node = new (GLOBAL_DATA) AssignResolveNode(GLOBAL_DATA, *$3, $4.m_node, $4.m_features & AssignFeature);
900                                           setExceptionLocation(node, @3.first_column, @4.first_column + 1, @4.last_column);
901                                           $$.m_node = combineCommaNodes(GLOBAL_DATA, $1.m_node, node);
902                                           $$.m_varDeclarations = $1.m_varDeclarations;
903                                           appendToVarDeclarationList(GLOBAL_DATA, $$.m_varDeclarations, *$3, DeclarationStacks::HasInitializer);
904                                           $$.m_funcDeclarations = 0;
905                                           $$.m_features = $1.m_features | ((*$3 == GLOBAL_DATA->propertyNames->arguments) ? ArgumentsFeature : 0) | $4.m_features;
906                                           $$.m_numConstants = $1.m_numConstants + $4.m_numConstants;
907                                         }
908 ;
909 
910 ConstStatement:
911     CONSTTOKEN ConstDeclarationList ';' { $$ = createNodeDeclarationInfo<StatementNode*>(new (GLOBAL_DATA) ConstStatementNode(GLOBAL_DATA, $2.m_node.head), $2.m_varDeclarations, $2.m_funcDeclarations, $2.m_features, $2.m_numConstants);
912                                           setStatementLocation($$.m_node, @1, @3); }
913   | CONSTTOKEN ConstDeclarationList error
914                                         { $$ = createNodeDeclarationInfo<StatementNode*>(new (GLOBAL_DATA) ConstStatementNode(GLOBAL_DATA, $2.m_node.head), $2.m_varDeclarations, $2.m_funcDeclarations, $2.m_features, $2.m_numConstants);
915                                           setStatementLocation($$.m_node, @1, @2); AUTO_SEMICOLON; }
916 ;
917 
918 ConstDeclarationList:
919     ConstDeclaration                    { $$.m_node.head = $1.m_node;
920                                           $$.m_node.tail = $$.m_node.head;
921                                           $$.m_varDeclarations = new (GLOBAL_DATA) ParserArenaData<DeclarationStacks::VarStack>;
922                                           appendToVarDeclarationList(GLOBAL_DATA, $$.m_varDeclarations, $1.m_node);
923                                           $$.m_funcDeclarations = 0;
924                                           $$.m_features = $1.m_features;
925                                           $$.m_numConstants = $1.m_numConstants;
926     }
927   | ConstDeclarationList ',' ConstDeclaration
928                                         { $$.m_node.head = $1.m_node.head;
929                                           $1.m_node.tail->m_next = $3.m_node;
930                                           $$.m_node.tail = $3.m_node;
931                                           $$.m_varDeclarations = $1.m_varDeclarations;
932                                           appendToVarDeclarationList(GLOBAL_DATA, $$.m_varDeclarations, $3.m_node);
933                                           $$.m_funcDeclarations = 0;
934                                           $$.m_features = $1.m_features | $3.m_features;
935                                           $$.m_numConstants = $1.m_numConstants + $3.m_numConstants; }
936 ;
937 
938 ConstDeclaration:
939     IDENT                               { $$ = createNodeInfo<ConstDeclNode*>(new (GLOBAL_DATA) ConstDeclNode(GLOBAL_DATA, *$1, 0), (*$1 == GLOBAL_DATA->propertyNames->arguments) ? ArgumentsFeature : 0, 0); }
940   | IDENT Initializer                   { $$ = createNodeInfo<ConstDeclNode*>(new (GLOBAL_DATA) ConstDeclNode(GLOBAL_DATA, *$1, $2.m_node), ((*$1 == GLOBAL_DATA->propertyNames->arguments) ? ArgumentsFeature : 0) | $2.m_features, $2.m_numConstants); }
941 ;
942 
943 Initializer:
944     '=' AssignmentExpr                  { $$ = $2; }
945 ;
946 
947 InitializerNoIn:
948     '=' AssignmentExprNoIn              { $$ = $2; }
949 ;
950 
951 EmptyStatement:
952     ';'                                 { $$ = createNodeDeclarationInfo<StatementNode*>(new (GLOBAL_DATA) EmptyStatementNode(GLOBAL_DATA), 0, 0, 0, 0); }
953 ;
954 
955 ExprStatement:
956     ExprNoBF ';'                        { $$ = createNodeDeclarationInfo<StatementNode*>(new (GLOBAL_DATA) ExprStatementNode(GLOBAL_DATA, $1.m_node), 0, 0, $1.m_features, $1.m_numConstants);
957                                           setStatementLocation($$.m_node, @1, @2); }
958   | ExprNoBF error                      { $$ = createNodeDeclarationInfo<StatementNode*>(new (GLOBAL_DATA) ExprStatementNode(GLOBAL_DATA, $1.m_node), 0, 0, $1.m_features, $1.m_numConstants);
959                                           setStatementLocation($$.m_node, @1, @1); AUTO_SEMICOLON; }
960 ;
961 
962 IfStatement:
963     IF '(' Expr ')' Statement %prec IF_WITHOUT_ELSE
964                                         { $$ = createNodeDeclarationInfo<StatementNode*>(new (GLOBAL_DATA) IfNode(GLOBAL_DATA, $3.m_node, $5.m_node), $5.m_varDeclarations, $5.m_funcDeclarations, $3.m_features | $5.m_features, $3.m_numConstants + $5.m_numConstants);
965                                           setStatementLocation($$.m_node, @1, @4); }
966   | IF '(' Expr ')' Statement ELSE Statement
967                                         { $$ = createNodeDeclarationInfo<StatementNode*>(new (GLOBAL_DATA) IfElseNode(GLOBAL_DATA, $3.m_node, $5.m_node, $7.m_node),
968                                                                                          mergeDeclarationLists($5.m_varDeclarations, $7.m_varDeclarations),
969                                                                                          mergeDeclarationLists($5.m_funcDeclarations, $7.m_funcDeclarations),
970                                                                                          $3.m_features | $5.m_features | $7.m_features,
971                                                                                          $3.m_numConstants + $5.m_numConstants + $7.m_numConstants);
972                                           setStatementLocation($$.m_node, @1, @4); }
973 ;
974 
975 IterationStatement:
976     DO Statement WHILE '(' Expr ')' ';'    { $$ = createNodeDeclarationInfo<StatementNode*>(new (GLOBAL_DATA) DoWhileNode(GLOBAL_DATA, $2.m_node, $5.m_node), $2.m_varDeclarations, $2.m_funcDeclarations, $2.m_features | $5.m_features, $2.m_numConstants + $5.m_numConstants);
977                                              setStatementLocation($$.m_node, @1, @3); }
978   | DO Statement WHILE '(' Expr ')' error  { $$ = createNodeDeclarationInfo<StatementNode*>(new (GLOBAL_DATA) DoWhileNode(GLOBAL_DATA, $2.m_node, $5.m_node), $2.m_varDeclarations, $2.m_funcDeclarations, $2.m_features | $5.m_features, $2.m_numConstants + $5.m_numConstants);
979                                              setStatementLocation($$.m_node, @1, @3); } // Always performs automatic semicolon insertion.
980   | WHILE '(' Expr ')' Statement        { $$ = createNodeDeclarationInfo<StatementNode*>(new (GLOBAL_DATA) WhileNode(GLOBAL_DATA, $3.m_node, $5.m_node), $5.m_varDeclarations, $5.m_funcDeclarations, $3.m_features | $5.m_features, $3.m_numConstants + $5.m_numConstants);
981                                           setStatementLocation($$.m_node, @1, @4); }
982   | FOR '(' ExprNoInOpt ';' ExprOpt ';' ExprOpt ')' Statement
983                                         { $$ = createNodeDeclarationInfo<StatementNode*>(new (GLOBAL_DATA) ForNode(GLOBAL_DATA, $3.m_node, $5.m_node, $7.m_node, $9.m_node, false), $9.m_varDeclarations, $9.m_funcDeclarations,
984                                                                                          $3.m_features | $5.m_features | $7.m_features | $9.m_features,
985                                                                                          $3.m_numConstants + $5.m_numConstants + $7.m_numConstants + $9.m_numConstants);
986                                           setStatementLocation($$.m_node, @1, @8);
987                                         }
988   | FOR '(' VAR VariableDeclarationListNoIn ';' ExprOpt ';' ExprOpt ')' Statement
989                                         { $$ = createNodeDeclarationInfo<StatementNode*>(new (GLOBAL_DATA) ForNode(GLOBAL_DATA, $4.m_node, $6.m_node, $8.m_node, $10.m_node, true),
990                                                                                          mergeDeclarationLists($4.m_varDeclarations, $10.m_varDeclarations),
991                                                                                          mergeDeclarationLists($4.m_funcDeclarations, $10.m_funcDeclarations),
992                                                                                          $4.m_features | $6.m_features | $8.m_features | $10.m_features,
993                                                                                          $4.m_numConstants + $6.m_numConstants + $8.m_numConstants + $10.m_numConstants);
994                                           setStatementLocation($$.m_node, @1, @9); }
995   | FOR '(' LeftHandSideExpr INTOKEN Expr ')' Statement
996                                         {
997                                             ForInNode* node = new (GLOBAL_DATA) ForInNode(GLOBAL_DATA, $3.m_node, $5.m_node, $7.m_node);
998                                             setExceptionLocation(node, @3.first_column, @3.last_column, @5.last_column);
999                                             $$ = createNodeDeclarationInfo<StatementNode*>(node, $7.m_varDeclarations, $7.m_funcDeclarations,
1000                                                                                            $3.m_features | $5.m_features | $7.m_features,
1001                                                                                            $3.m_numConstants + $5.m_numConstants + $7.m_numConstants);
1002                                             setStatementLocation($$.m_node, @1, @6);
1003                                         }
1004   | FOR '(' VAR IDENT INTOKEN Expr ')' Statement
1005                                         { ForInNode *forIn = new (GLOBAL_DATA) ForInNode(GLOBAL_DATA, *$4, 0, $6.m_node, $8.m_node, @5.first_column, @5.first_column - @4.first_column, @6.last_column - @5.first_column);
1006                                           setExceptionLocation(forIn, @4.first_column, @5.first_column + 1, @6.last_column);
1007                                           appendToVarDeclarationList(GLOBAL_DATA, $8.m_varDeclarations, *$4, DeclarationStacks::HasInitializer);
1008                                           $$ = createNodeDeclarationInfo<StatementNode*>(forIn, $8.m_varDeclarations, $8.m_funcDeclarations, ((*$4 == GLOBAL_DATA->propertyNames->arguments) ? ArgumentsFeature : 0) | $6.m_features | $8.m_features, $6.m_numConstants + $8.m_numConstants);
1009                                           setStatementLocation($$.m_node, @1, @7); }
1010   | FOR '(' VAR IDENT InitializerNoIn INTOKEN Expr ')' Statement
1011                                         { ForInNode *forIn = new (GLOBAL_DATA) ForInNode(GLOBAL_DATA, *$4, $5.m_node, $7.m_node, $9.m_node, @5.first_column, @5.first_column - @4.first_column, @5.last_column - @5.first_column);
1012                                           setExceptionLocation(forIn, @4.first_column, @6.first_column + 1, @7.last_column);
1013                                           appendToVarDeclarationList(GLOBAL_DATA, $9.m_varDeclarations, *$4, DeclarationStacks::HasInitializer);
1014                                           $$ = createNodeDeclarationInfo<StatementNode*>(forIn, $9.m_varDeclarations, $9.m_funcDeclarations,
1015                                                                                          ((*$4 == GLOBAL_DATA->propertyNames->arguments) ? ArgumentsFeature : 0) | $5.m_features | $7.m_features | $9.m_features,
1016                                                                                          $5.m_numConstants + $7.m_numConstants + $9.m_numConstants);
1017                                           setStatementLocation($$.m_node, @1, @8); }
1018 ;
1019 
1020 ExprOpt:
1021     /* nothing */                       { $$ = createNodeInfo<ExpressionNode*>(0, 0, 0); }
1022   | Expr
1023 ;
1024 
1025 ExprNoInOpt:
1026     /* nothing */                       { $$ = createNodeInfo<ExpressionNode*>(0, 0, 0); }
1027   | ExprNoIn
1028 ;
1029 
1030 ContinueStatement:
1031     CONTINUE ';'                        { ContinueNode* node = new (GLOBAL_DATA) ContinueNode(GLOBAL_DATA);
1032                                           setExceptionLocation(node, @1.first_column, @1.last_column, @1.last_column);
1033                                           $$ = createNodeDeclarationInfo<StatementNode*>(node, 0, 0, 0, 0);
1034                                           setStatementLocation($$.m_node, @1, @2); }
1035   | CONTINUE error                      { ContinueNode* node = new (GLOBAL_DATA) ContinueNode(GLOBAL_DATA);
1036                                           setExceptionLocation(node, @1.first_column, @1.last_column, @1.last_column);
1037                                           $$ = createNodeDeclarationInfo<StatementNode*>(node, 0, 0, 0, 0);
1038                                           setStatementLocation($$.m_node, @1, @1); AUTO_SEMICOLON; }
1039   | CONTINUE IDENT ';'                  { ContinueNode* node = new (GLOBAL_DATA) ContinueNode(GLOBAL_DATA, *$2);
1040                                           setExceptionLocation(node, @1.first_column, @2.last_column, @2.last_column);
1041                                           $$ = createNodeDeclarationInfo<StatementNode*>(node, 0, 0, 0, 0);
1042                                           setStatementLocation($$.m_node, @1, @3); }
1043   | CONTINUE IDENT error                { ContinueNode* node = new (GLOBAL_DATA) ContinueNode(GLOBAL_DATA, *$2);
1044                                           setExceptionLocation(node, @1.first_column, @2.last_column, @2.last_column);
1045                                           $$ = createNodeDeclarationInfo<StatementNode*>(node, 0, 0, 0, 0);
1046                                           setStatementLocation($$.m_node, @1, @2); AUTO_SEMICOLON; }
1047 ;
1048 
1049 BreakStatement:
1050     BREAK ';'                           { BreakNode* node = new (GLOBAL_DATA) BreakNode(GLOBAL_DATA);
1051                                           setExceptionLocation(node, @1.first_column, @1.last_column, @1.last_column);
1052                                           $$ = createNodeDeclarationInfo<StatementNode*>(node, 0, 0, 0, 0); setStatementLocation($$.m_node, @1, @2); }
1053   | BREAK error                         { BreakNode* node = new (GLOBAL_DATA) BreakNode(GLOBAL_DATA);
1054                                           setExceptionLocation(node, @1.first_column, @1.last_column, @1.last_column);
1055                                           $$ = createNodeDeclarationInfo<StatementNode*>(new (GLOBAL_DATA) BreakNode(GLOBAL_DATA), 0, 0, 0, 0); setStatementLocation($$.m_node, @1, @1); AUTO_SEMICOLON; }
1056   | BREAK IDENT ';'                     { BreakNode* node = new (GLOBAL_DATA) BreakNode(GLOBAL_DATA, *$2);
1057                                           setExceptionLocation(node, @1.first_column, @2.last_column, @2.last_column);
1058                                           $$ = createNodeDeclarationInfo<StatementNode*>(node, 0, 0, 0, 0); setStatementLocation($$.m_node, @1, @3); }
1059   | BREAK IDENT error                   { BreakNode* node = new (GLOBAL_DATA) BreakNode(GLOBAL_DATA, *$2);
1060                                           setExceptionLocation(node, @1.first_column, @2.last_column, @2.last_column);
1061                                           $$ = createNodeDeclarationInfo<StatementNode*>(new (GLOBAL_DATA) BreakNode(GLOBAL_DATA, *$2), 0, 0, 0, 0); setStatementLocation($$.m_node, @1, @2); AUTO_SEMICOLON; }
1062 ;
1063 
1064 ReturnStatement:
1065     RETURN ';'                          { ReturnNode* node = new (GLOBAL_DATA) ReturnNode(GLOBAL_DATA, 0);
1066                                           setExceptionLocation(node, @1.first_column, @1.last_column, @1.last_column);
1067                                           $$ = createNodeDeclarationInfo<StatementNode*>(node, 0, 0, 0, 0); setStatementLocation($$.m_node, @1, @2); }
1068   | RETURN error                        { ReturnNode* node = new (GLOBAL_DATA) ReturnNode(GLOBAL_DATA, 0);
1069                                           setExceptionLocation(node, @1.first_column, @1.last_column, @1.last_column);
1070                                           $$ = createNodeDeclarationInfo<StatementNode*>(node, 0, 0, 0, 0); setStatementLocation($$.m_node, @1, @1); AUTO_SEMICOLON; }
1071   | RETURN Expr ';'                     { ReturnNode* node = new (GLOBAL_DATA) ReturnNode(GLOBAL_DATA, $2.m_node);
1072                                           setExceptionLocation(node, @1.first_column, @2.last_column, @2.last_column);
1073                                           $$ = createNodeDeclarationInfo<StatementNode*>(node, 0, 0, $2.m_features, $2.m_numConstants); setStatementLocation($$.m_node, @1, @3); }
1074   | RETURN Expr error                   { ReturnNode* node = new (GLOBAL_DATA) ReturnNode(GLOBAL_DATA, $2.m_node);
1075                                           setExceptionLocation(node, @1.first_column, @2.last_column, @2.last_column);
1076                                           $$ = createNodeDeclarationInfo<StatementNode*>(node, 0, 0, $2.m_features, $2.m_numConstants); setStatementLocation($$.m_node, @1, @2); AUTO_SEMICOLON; }
1077 ;
1078 
1079 WithStatement:
1080     WITH '(' Expr ')' Statement         { $$ = createNodeDeclarationInfo<StatementNode*>(new (GLOBAL_DATA) WithNode(GLOBAL_DATA, $3.m_node, $5.m_node, @3.last_column, @3.last_column - @3.first_column),
1081                                                                                          $5.m_varDeclarations, $5.m_funcDeclarations, $3.m_features | $5.m_features | WithFeature, $3.m_numConstants + $5.m_numConstants);
1082                                           setStatementLocation($$.m_node, @1, @4); }
1083 ;
1084 
1085 SwitchStatement:
1086     SWITCH '(' Expr ')' CaseBlock       { $$ = createNodeDeclarationInfo<StatementNode*>(new (GLOBAL_DATA) SwitchNode(GLOBAL_DATA, $3.m_node, $5.m_node), $5.m_varDeclarations, $5.m_funcDeclarations,
1087                                                                                          $3.m_features | $5.m_features, $3.m_numConstants + $5.m_numConstants);
1088                                           setStatementLocation($$.m_node, @1, @4); }
1089 ;
1090 
1091 CaseBlock:
1092     OPENBRACE CaseClausesOpt CLOSEBRACE              { $$ = createNodeDeclarationInfo<CaseBlockNode*>(new (GLOBAL_DATA) CaseBlockNode(GLOBAL_DATA, $2.m_node.head, 0, 0), $2.m_varDeclarations, $2.m_funcDeclarations, $2.m_features, $2.m_numConstants); }
1093   | OPENBRACE CaseClausesOpt DefaultClause CaseClausesOpt CLOSEBRACE
1094                                         { $$ = createNodeDeclarationInfo<CaseBlockNode*>(new (GLOBAL_DATA) CaseBlockNode(GLOBAL_DATA, $2.m_node.head, $3.m_node, $4.m_node.head),
1095                                                                                          mergeDeclarationLists(mergeDeclarationLists($2.m_varDeclarations, $3.m_varDeclarations), $4.m_varDeclarations),
1096                                                                                          mergeDeclarationLists(mergeDeclarationLists($2.m_funcDeclarations, $3.m_funcDeclarations), $4.m_funcDeclarations),
1097                                                                                          $2.m_features | $3.m_features | $4.m_features,
1098                                                                                          $2.m_numConstants + $3.m_numConstants + $4.m_numConstants); }
1099 ;
1100 
1101 CaseClausesOpt:
1102   /* nothing */                         { $$.m_node.head = 0; $$.m_node.tail = 0; $$.m_varDeclarations = 0; $$.m_funcDeclarations = 0; $$.m_features = 0; $$.m_numConstants = 0; }
1103   | CaseClauses
1104 ;
1105 
1106 CaseClauses:
1107     CaseClause                          { $$.m_node.head = new (GLOBAL_DATA) ClauseListNode(GLOBAL_DATA, $1.m_node);
1108                                           $$.m_node.tail = $$.m_node.head;
1109                                           $$.m_varDeclarations = $1.m_varDeclarations;
1110                                           $$.m_funcDeclarations = $1.m_funcDeclarations;
1111                                           $$.m_features = $1.m_features;
1112                                           $$.m_numConstants = $1.m_numConstants; }
1113   | CaseClauses CaseClause              { $$.m_node.head = $1.m_node.head;
1114                                           $$.m_node.tail = new (GLOBAL_DATA) ClauseListNode(GLOBAL_DATA, $1.m_node.tail, $2.m_node);
1115                                           $$.m_varDeclarations = mergeDeclarationLists($1.m_varDeclarations, $2.m_varDeclarations);
1116                                           $$.m_funcDeclarations = mergeDeclarationLists($1.m_funcDeclarations, $2.m_funcDeclarations);
1117                                           $$.m_features = $1.m_features | $2.m_features;
1118                                           $$.m_numConstants = $1.m_numConstants + $2.m_numConstants;
1119                                         }
1120 ;
1121 
1122 CaseClause:
1123     CASE Expr ':'                       { $$ = createNodeDeclarationInfo<CaseClauseNode*>(new (GLOBAL_DATA) CaseClauseNode(GLOBAL_DATA, $2.m_node), 0, 0, $2.m_features, $2.m_numConstants); }
1124   | CASE Expr ':' SourceElements        { $$ = createNodeDeclarationInfo<CaseClauseNode*>(new (GLOBAL_DATA) CaseClauseNode(GLOBAL_DATA, $2.m_node, $4.m_node), $4.m_varDeclarations, $4.m_funcDeclarations, $2.m_features | $4.m_features, $2.m_numConstants + $4.m_numConstants); }
1125 ;
1126 
1127 DefaultClause:
1128     DEFAULT ':'                         { $$ = createNodeDeclarationInfo<CaseClauseNode*>(new (GLOBAL_DATA) CaseClauseNode(GLOBAL_DATA, 0), 0, 0, 0, 0); }
1129   | DEFAULT ':' SourceElements          { $$ = createNodeDeclarationInfo<CaseClauseNode*>(new (GLOBAL_DATA) CaseClauseNode(GLOBAL_DATA, 0, $3.m_node), $3.m_varDeclarations, $3.m_funcDeclarations, $3.m_features, $3.m_numConstants); }
1130 ;
1131 
1132 LabelledStatement:
1133     IDENT ':' Statement                 { LabelNode* node = new (GLOBAL_DATA) LabelNode(GLOBAL_DATA, *$1, $3.m_node);
1134                                           setExceptionLocation(node, @1.first_column, @2.last_column, @2.last_column);
1135                                           $$ = createNodeDeclarationInfo<StatementNode*>(node, $3.m_varDeclarations, $3.m_funcDeclarations, $3.m_features, $3.m_numConstants); }
1136 ;
1137 
1138 ThrowStatement:
1139     THROW Expr ';'                      { ThrowNode* node = new (GLOBAL_DATA) ThrowNode(GLOBAL_DATA, $2.m_node);
1140                                           setExceptionLocation(node, @1.first_column, @2.last_column, @2.last_column);
1141                                           $$ = createNodeDeclarationInfo<StatementNode*>(node, 0, 0, $2.m_features, $2.m_numConstants); setStatementLocation($$.m_node, @1, @2);
1142                                         }
1143   | THROW Expr error                    { ThrowNode* node = new (GLOBAL_DATA) ThrowNode(GLOBAL_DATA, $2.m_node);
1144                                           setExceptionLocation(node, @1.first_column, @2.last_column, @2.last_column);
1145                                           $$ = createNodeDeclarationInfo<StatementNode*>(node, 0, 0, $2.m_features, $2.m_numConstants); setStatementLocation($$.m_node, @1, @2); AUTO_SEMICOLON;
1146                                         }
1147 ;
1148 
1149 TryStatement:
1150     TRY Block FINALLY Block             { $$ = createNodeDeclarationInfo<StatementNode*>(new (GLOBAL_DATA) TryNode(GLOBAL_DATA, $2.m_node, GLOBAL_DATA->propertyNames->nullIdentifier, false, 0, $4.m_node),
1151                                                                                          mergeDeclarationLists($2.m_varDeclarations, $4.m_varDeclarations),
1152                                                                                          mergeDeclarationLists($2.m_funcDeclarations, $4.m_funcDeclarations),
1153                                                                                          $2.m_features | $4.m_features,
1154                                                                                          $2.m_numConstants + $4.m_numConstants);
1155                                           setStatementLocation($$.m_node, @1, @2); }
1156   | TRY Block CATCH '(' IDENT ')' Block { $$ = createNodeDeclarationInfo<StatementNode*>(new (GLOBAL_DATA) TryNode(GLOBAL_DATA, $2.m_node, *$5, ($7.m_features & EvalFeature) != 0, $7.m_node, 0),
1157                                                                                          mergeDeclarationLists($2.m_varDeclarations, $7.m_varDeclarations),
1158                                                                                          mergeDeclarationLists($2.m_funcDeclarations, $7.m_funcDeclarations),
1159                                                                                          $2.m_features | $7.m_features | CatchFeature,
1160                                                                                          $2.m_numConstants + $7.m_numConstants);
1161                                           setStatementLocation($$.m_node, @1, @2); }
1162   | TRY Block CATCH '(' IDENT ')' Block FINALLY Block
1163                                         { $$ = createNodeDeclarationInfo<StatementNode*>(new (GLOBAL_DATA) TryNode(GLOBAL_DATA, $2.m_node, *$5, ($7.m_features & EvalFeature) != 0, $7.m_node, $9.m_node),
1164                                                                                          mergeDeclarationLists(mergeDeclarationLists($2.m_varDeclarations, $7.m_varDeclarations), $9.m_varDeclarations),
1165                                                                                          mergeDeclarationLists(mergeDeclarationLists($2.m_funcDeclarations, $7.m_funcDeclarations), $9.m_funcDeclarations),
1166                                                                                          $2.m_features | $7.m_features | $9.m_features | CatchFeature,
1167                                                                                          $2.m_numConstants + $7.m_numConstants + $9.m_numConstants);
1168                                           setStatementLocation($$.m_node, @1, @2); }
1169 ;
1170 
1171 DebuggerStatement:
1172     DEBUGGER ';'                        { $$ = createNodeDeclarationInfo<StatementNode*>(new (GLOBAL_DATA) DebuggerStatementNode(GLOBAL_DATA), 0, 0, 0, 0);
1173                                           setStatementLocation($$.m_node, @1, @2); }
1174   | DEBUGGER error                      { $$ = createNodeDeclarationInfo<StatementNode*>(new (GLOBAL_DATA) DebuggerStatementNode(GLOBAL_DATA), 0, 0, 0, 0);
1175                                           setStatementLocation($$.m_node, @1, @1); AUTO_SEMICOLON; }
1176 ;
1177 
1178 FunctionDeclaration:
1179     FUNCTION IDENT '(' ')' OPENBRACE FunctionBody CLOSEBRACE { $$ = createNodeDeclarationInfo<StatementNode*>(new (GLOBAL_DATA) FuncDeclNode(GLOBAL_DATA, *$2, $6, GLOBAL_DATA->lexer->sourceCode($5, $7, @5.first_line)), 0, new (GLOBAL_DATA) ParserArenaData<DeclarationStacks::FunctionStack>, ((*$2 == GLOBAL_DATA->propertyNames->arguments) ? ArgumentsFeature : 0) | ClosureFeature, 0); setStatementLocation($6, @5, @7); $$.m_funcDeclarations->data.append(static_cast<FuncDeclNode*>($$.m_node)->body()); }
1180   | FUNCTION IDENT '(' FormalParameterList ')' OPENBRACE FunctionBody CLOSEBRACE
1181       {
1182           $$ = createNodeDeclarationInfo<StatementNode*>(new (GLOBAL_DATA) FuncDeclNode(GLOBAL_DATA, *$2, $7, GLOBAL_DATA->lexer->sourceCode($6, $8, @6.first_line), $4.m_node.head), 0, new (GLOBAL_DATA) ParserArenaData<DeclarationStacks::FunctionStack>, ((*$2 == GLOBAL_DATA->propertyNames->arguments) ? ArgumentsFeature : 0) | $4.m_features | ClosureFeature, 0);
1183           if ($4.m_features & ArgumentsFeature)
1184               $7->setUsesArguments();
1185           setStatementLocation($7, @6, @8);
1186           $$.m_funcDeclarations->data.append(static_cast<FuncDeclNode*>($$.m_node)->body());
1187       }
1188 ;
1189 
1190 FunctionExpr:
1191     FUNCTION '(' ')' OPENBRACE FunctionBody CLOSEBRACE { $$ = createNodeInfo(new (GLOBAL_DATA) FuncExprNode(GLOBAL_DATA, GLOBAL_DATA->propertyNames->nullIdentifier, $5, GLOBAL_DATA->lexer->sourceCode($4, $6, @4.first_line)), ClosureFeature, 0); setStatementLocation($5, @4, @6); }
1192     | FUNCTION '(' FormalParameterList ')' OPENBRACE FunctionBody CLOSEBRACE
1193       {
1194           $$ = createNodeInfo(new (GLOBAL_DATA) FuncExprNode(GLOBAL_DATA, GLOBAL_DATA->propertyNames->nullIdentifier, $6, GLOBAL_DATA->lexer->sourceCode($5, $7, @5.first_line), $3.m_node.head), $3.m_features | ClosureFeature, 0);
1195           if ($3.m_features & ArgumentsFeature)
1196               $6->setUsesArguments();
1197           setStatementLocation($6, @5, @7);
1198       }
1199   | FUNCTION IDENT '(' ')' OPENBRACE FunctionBody CLOSEBRACE { $$ = createNodeInfo(new (GLOBAL_DATA) FuncExprNode(GLOBAL_DATA, *$2, $6, GLOBAL_DATA->lexer->sourceCode($5, $7, @5.first_line)), ClosureFeature, 0); setStatementLocation($6, @5, @7); }
1200   | FUNCTION IDENT '(' FormalParameterList ')' OPENBRACE FunctionBody CLOSEBRACE
1201       {
1202           $$ = createNodeInfo(new (GLOBAL_DATA) FuncExprNode(GLOBAL_DATA, *$2, $7, GLOBAL_DATA->lexer->sourceCode($6, $8, @6.first_line), $4.m_node.head), $4.m_features | ClosureFeature, 0);
1203           if ($4.m_features & ArgumentsFeature)
1204               $7->setUsesArguments();
1205           setStatementLocation($7, @6, @8);
1206       }
1207 ;
1208 
1209 FormalParameterList:
1210     IDENT                               { $$.m_node.head = new (GLOBAL_DATA) ParameterNode(GLOBAL_DATA, *$1);
1211                                           $$.m_features = (*$1 == GLOBAL_DATA->propertyNames->arguments) ? ArgumentsFeature : 0;
1212                                           $$.m_node.tail = $$.m_node.head; }
1213   | FormalParameterList ',' IDENT       { $$.m_node.head = $1.m_node.head;
1214                                           $$.m_features = $1.m_features | ((*$3 == GLOBAL_DATA->propertyNames->arguments) ? ArgumentsFeature : 0);
1215                                           $$.m_node.tail = new (GLOBAL_DATA) ParameterNode(GLOBAL_DATA, $1.m_node.tail, *$3);  }
1216 ;
1217 
1218 FunctionBody:
1219     /* not in spec */                   { $$ = FunctionBodyNode::create(GLOBAL_DATA); }
1220   | SourceElements_NoNode               { $$ = FunctionBodyNode::create(GLOBAL_DATA); }
1221 ;
1222 
1223 Program:
1224     /* not in spec */                   { GLOBAL_DATA->parser->didFinishParsing(new (GLOBAL_DATA) SourceElements(GLOBAL_DATA), 0, 0, NoFeatures, @0.last_line, 0); }
1225     | SourceElements                    { GLOBAL_DATA->parser->didFinishParsing($1.m_node, $1.m_varDeclarations, $1.m_funcDeclarations, $1.m_features,
1226                                                                                 @1.last_line, $1.m_numConstants); }
1227 ;
1228 
1229 SourceElements:
1230     Statement                           { $$.m_node = new (GLOBAL_DATA) SourceElements(GLOBAL_DATA);
1231                                           $$.m_node->append($1.m_node);
1232                                           $$.m_varDeclarations = $1.m_varDeclarations;
1233                                           $$.m_funcDeclarations = $1.m_funcDeclarations;
1234                                           $$.m_features = $1.m_features;
1235                                           $$.m_numConstants = $1.m_numConstants;
1236                                         }
1237   | SourceElements Statement            { $$.m_node->append($2.m_node);
1238                                           $$.m_varDeclarations = mergeDeclarationLists($1.m_varDeclarations, $2.m_varDeclarations);
1239                                           $$.m_funcDeclarations = mergeDeclarationLists($1.m_funcDeclarations, $2.m_funcDeclarations);
1240                                           $$.m_features = $1.m_features | $2.m_features;
1241                                           $$.m_numConstants = $1.m_numConstants + $2.m_numConstants;
1242                                         }
1243 ;
1244 
1245 // Start NoNodes
1246 
1247 Literal_NoNode:
1248     NULLTOKEN
1249   | TRUETOKEN
1250   | FALSETOKEN
1251   | NUMBER { }
1252   | STRING { }
1253   | '/' /* regexp */ { if (!GLOBAL_DATA->lexer->skipRegExp()) YYABORT; }
1254   | DIVEQUAL /* regexp with /= */ { if (!GLOBAL_DATA->lexer->skipRegExp()) YYABORT; }
1255 ;
1256 
1257 Property_NoNode:
1258     IDENT ':' AssignmentExpr_NoNode { }
1259   | STRING ':' AssignmentExpr_NoNode { }
1260   | NUMBER ':' AssignmentExpr_NoNode { }
1261   | IDENT IDENT '(' ')' OPENBRACE FunctionBody_NoNode CLOSEBRACE { if (*$1 != "get" && *$1 != "set") YYABORT; }
1262   | IDENT IDENT '(' FormalParameterList_NoNode ')' OPENBRACE FunctionBody_NoNode CLOSEBRACE { if (*$1 != "get" && *$1 != "set") YYABORT; }
1263 ;
1264 
1265 PropertyList_NoNode:
1266     Property_NoNode
1267   | PropertyList_NoNode ',' Property_NoNode
1268 ;
1269 
1270 PrimaryExpr_NoNode:
1271     PrimaryExprNoBrace_NoNode
1272   | OPENBRACE CLOSEBRACE { }
1273   | OPENBRACE PropertyList_NoNode CLOSEBRACE { }
1274   /* allow extra comma, see http://bugs.webkit.org/show_bug.cgi?id=5939 */
1275   | OPENBRACE PropertyList_NoNode ',' CLOSEBRACE { }
1276 ;
1277 
1278 PrimaryExprNoBrace_NoNode:
1279     THISTOKEN
1280   | Literal_NoNode
1281   | ArrayLiteral_NoNode
1282   | IDENT { }
1283   | '(' Expr_NoNode ')'
1284 ;
1285 
1286 ArrayLiteral_NoNode:
1287     '[' ElisionOpt_NoNode ']'
1288   | '[' ElementList_NoNode ']'
1289   | '[' ElementList_NoNode ',' ElisionOpt_NoNode ']'
1290 ;
1291 
1292 ElementList_NoNode:
1293     ElisionOpt_NoNode AssignmentExpr_NoNode
1294   | ElementList_NoNode ',' ElisionOpt_NoNode AssignmentExpr_NoNode
1295 ;
1296 
1297 ElisionOpt_NoNode:
1298     /* nothing */
1299   | Elision_NoNode
1300 ;
1301 
1302 Elision_NoNode:
1303     ','
1304   | Elision_NoNode ','
1305 ;
1306 
1307 MemberExpr_NoNode:
1308     PrimaryExpr_NoNode
1309   | FunctionExpr_NoNode
1310   | MemberExpr_NoNode '[' Expr_NoNode ']'
1311   | MemberExpr_NoNode '.' IDENT
1312   | NEW MemberExpr_NoNode Arguments_NoNode
1313 ;
1314 
1315 MemberExprNoBF_NoNode:
1316     PrimaryExprNoBrace_NoNode
1317   | MemberExprNoBF_NoNode '[' Expr_NoNode ']'
1318   | MemberExprNoBF_NoNode '.' IDENT
1319   | NEW MemberExpr_NoNode Arguments_NoNode
1320 ;
1321 
1322 NewExpr_NoNode:
1323     MemberExpr_NoNode
1324   | NEW NewExpr_NoNode
1325 ;
1326 
1327 NewExprNoBF_NoNode:
1328     MemberExprNoBF_NoNode
1329   | NEW NewExpr_NoNode
1330 ;
1331 
1332 CallExpr_NoNode:
1333     MemberExpr_NoNode Arguments_NoNode
1334   | CallExpr_NoNode Arguments_NoNode
1335   | CallExpr_NoNode '[' Expr_NoNode ']'
1336   | CallExpr_NoNode '.' IDENT
1337 ;
1338 
1339 CallExprNoBF_NoNode:
1340     MemberExprNoBF_NoNode Arguments_NoNode
1341   | CallExprNoBF_NoNode Arguments_NoNode
1342   | CallExprNoBF_NoNode '[' Expr_NoNode ']'
1343   | CallExprNoBF_NoNode '.' IDENT
1344 ;
1345 
1346 Arguments_NoNode:
1347     '(' ')'
1348   | '(' ArgumentList_NoNode ')'
1349 ;
1350 
1351 ArgumentList_NoNode:
1352     AssignmentExpr_NoNode
1353   | ArgumentList_NoNode ',' AssignmentExpr_NoNode
1354 ;
1355 
1356 LeftHandSideExpr_NoNode:
1357     NewExpr_NoNode
1358   | CallExpr_NoNode
1359 ;
1360 
1361 LeftHandSideExprNoBF_NoNode:
1362     NewExprNoBF_NoNode
1363   | CallExprNoBF_NoNode
1364 ;
1365 
1366 PostfixExpr_NoNode:
1367     LeftHandSideExpr_NoNode
1368   | LeftHandSideExpr_NoNode PLUSPLUS
1369   | LeftHandSideExpr_NoNode MINUSMINUS
1370 ;
1371 
1372 PostfixExprNoBF_NoNode:
1373     LeftHandSideExprNoBF_NoNode
1374   | LeftHandSideExprNoBF_NoNode PLUSPLUS
1375   | LeftHandSideExprNoBF_NoNode MINUSMINUS
1376 ;
1377 
1378 UnaryExprCommon_NoNode:
1379     DELETETOKEN UnaryExpr_NoNode
1380   | VOIDTOKEN UnaryExpr_NoNode
1381   | TYPEOF UnaryExpr_NoNode
1382   | PLUSPLUS UnaryExpr_NoNode
1383   | AUTOPLUSPLUS UnaryExpr_NoNode
1384   | MINUSMINUS UnaryExpr_NoNode
1385   | AUTOMINUSMINUS UnaryExpr_NoNode
1386   | '+' UnaryExpr_NoNode
1387   | '-' UnaryExpr_NoNode
1388   | '~' UnaryExpr_NoNode
1389   | '!' UnaryExpr_NoNode
1390 
1391 UnaryExpr_NoNode:
1392     PostfixExpr_NoNode
1393   | UnaryExprCommon_NoNode
1394 ;
1395 
1396 UnaryExprNoBF_NoNode:
1397     PostfixExprNoBF_NoNode
1398   | UnaryExprCommon_NoNode
1399 ;
1400 
1401 MultiplicativeExpr_NoNode:
1402     UnaryExpr_NoNode
1403   | MultiplicativeExpr_NoNode '*' UnaryExpr_NoNode
1404   | MultiplicativeExpr_NoNode '/' UnaryExpr_NoNode
1405   | MultiplicativeExpr_NoNode '%' UnaryExpr_NoNode
1406 ;
1407 
1408 MultiplicativeExprNoBF_NoNode:
1409     UnaryExprNoBF_NoNode
1410   | MultiplicativeExprNoBF_NoNode '*' UnaryExpr_NoNode
1411   | MultiplicativeExprNoBF_NoNode '/' UnaryExpr_NoNode
1412   | MultiplicativeExprNoBF_NoNode '%' UnaryExpr_NoNode
1413 ;
1414 
1415 AdditiveExpr_NoNode:
1416     MultiplicativeExpr_NoNode
1417   | AdditiveExpr_NoNode '+' MultiplicativeExpr_NoNode
1418   | AdditiveExpr_NoNode '-' MultiplicativeExpr_NoNode
1419 ;
1420 
1421 AdditiveExprNoBF_NoNode:
1422     MultiplicativeExprNoBF_NoNode
1423   | AdditiveExprNoBF_NoNode '+' MultiplicativeExpr_NoNode
1424   | AdditiveExprNoBF_NoNode '-' MultiplicativeExpr_NoNode
1425 ;
1426 
1427 ShiftExpr_NoNode:
1428     AdditiveExpr_NoNode
1429   | ShiftExpr_NoNode LSHIFT AdditiveExpr_NoNode
1430   | ShiftExpr_NoNode RSHIFT AdditiveExpr_NoNode
1431   | ShiftExpr_NoNode URSHIFT AdditiveExpr_NoNode
1432 ;
1433 
1434 ShiftExprNoBF_NoNode:
1435     AdditiveExprNoBF_NoNode
1436   | ShiftExprNoBF_NoNode LSHIFT AdditiveExpr_NoNode
1437   | ShiftExprNoBF_NoNode RSHIFT AdditiveExpr_NoNode
1438   | ShiftExprNoBF_NoNode URSHIFT AdditiveExpr_NoNode
1439 ;
1440 
1441 RelationalExpr_NoNode:
1442     ShiftExpr_NoNode
1443   | RelationalExpr_NoNode '<' ShiftExpr_NoNode
1444   | RelationalExpr_NoNode '>' ShiftExpr_NoNode
1445   | RelationalExpr_NoNode LE ShiftExpr_NoNode
1446   | RelationalExpr_NoNode GE ShiftExpr_NoNode
1447   | RelationalExpr_NoNode INSTANCEOF ShiftExpr_NoNode
1448   | RelationalExpr_NoNode INTOKEN ShiftExpr_NoNode
1449 ;
1450 
1451 RelationalExprNoIn_NoNode:
1452     ShiftExpr_NoNode
1453   | RelationalExprNoIn_NoNode '<' ShiftExpr_NoNode
1454   | RelationalExprNoIn_NoNode '>' ShiftExpr_NoNode
1455   | RelationalExprNoIn_NoNode LE ShiftExpr_NoNode
1456   | RelationalExprNoIn_NoNode GE ShiftExpr_NoNode
1457   | RelationalExprNoIn_NoNode INSTANCEOF ShiftExpr_NoNode
1458 ;
1459 
1460 RelationalExprNoBF_NoNode:
1461     ShiftExprNoBF_NoNode
1462   | RelationalExprNoBF_NoNode '<' ShiftExpr_NoNode
1463   | RelationalExprNoBF_NoNode '>' ShiftExpr_NoNode
1464   | RelationalExprNoBF_NoNode LE ShiftExpr_NoNode
1465   | RelationalExprNoBF_NoNode GE ShiftExpr_NoNode
1466   | RelationalExprNoBF_NoNode INSTANCEOF ShiftExpr_NoNode
1467   | RelationalExprNoBF_NoNode INTOKEN ShiftExpr_NoNode
1468 ;
1469 
1470 EqualityExpr_NoNode:
1471     RelationalExpr_NoNode
1472   | EqualityExpr_NoNode EQEQ RelationalExpr_NoNode
1473   | EqualityExpr_NoNode NE RelationalExpr_NoNode
1474   | EqualityExpr_NoNode STREQ RelationalExpr_NoNode
1475   | EqualityExpr_NoNode STRNEQ RelationalExpr_NoNode
1476 ;
1477 
1478 EqualityExprNoIn_NoNode:
1479     RelationalExprNoIn_NoNode
1480   | EqualityExprNoIn_NoNode EQEQ RelationalExprNoIn_NoNode
1481   | EqualityExprNoIn_NoNode NE RelationalExprNoIn_NoNode
1482   | EqualityExprNoIn_NoNode STREQ RelationalExprNoIn_NoNode
1483   | EqualityExprNoIn_NoNode STRNEQ RelationalExprNoIn_NoNode
1484 ;
1485 
1486 EqualityExprNoBF_NoNode:
1487     RelationalExprNoBF_NoNode
1488   | EqualityExprNoBF_NoNode EQEQ RelationalExpr_NoNode
1489   | EqualityExprNoBF_NoNode NE RelationalExpr_NoNode
1490   | EqualityExprNoBF_NoNode STREQ RelationalExpr_NoNode
1491   | EqualityExprNoBF_NoNode STRNEQ RelationalExpr_NoNode
1492 ;
1493 
1494 BitwiseANDExpr_NoNode:
1495     EqualityExpr_NoNode
1496   | BitwiseANDExpr_NoNode '&' EqualityExpr_NoNode
1497 ;
1498 
1499 BitwiseANDExprNoIn_NoNode:
1500     EqualityExprNoIn_NoNode
1501   | BitwiseANDExprNoIn_NoNode '&' EqualityExprNoIn_NoNode
1502 ;
1503 
1504 BitwiseANDExprNoBF_NoNode:
1505     EqualityExprNoBF_NoNode
1506   | BitwiseANDExprNoBF_NoNode '&' EqualityExpr_NoNode
1507 ;
1508 
1509 BitwiseXORExpr_NoNode:
1510     BitwiseANDExpr_NoNode
1511   | BitwiseXORExpr_NoNode '^' BitwiseANDExpr_NoNode
1512 ;
1513 
1514 BitwiseXORExprNoIn_NoNode:
1515     BitwiseANDExprNoIn_NoNode
1516   | BitwiseXORExprNoIn_NoNode '^' BitwiseANDExprNoIn_NoNode
1517 ;
1518 
1519 BitwiseXORExprNoBF_NoNode:
1520     BitwiseANDExprNoBF_NoNode
1521   | BitwiseXORExprNoBF_NoNode '^' BitwiseANDExpr_NoNode
1522 ;
1523 
1524 BitwiseORExpr_NoNode:
1525     BitwiseXORExpr_NoNode
1526   | BitwiseORExpr_NoNode '|' BitwiseXORExpr_NoNode
1527 ;
1528 
1529 BitwiseORExprNoIn_NoNode:
1530     BitwiseXORExprNoIn_NoNode
1531   | BitwiseORExprNoIn_NoNode '|' BitwiseXORExprNoIn_NoNode
1532 ;
1533 
1534 BitwiseORExprNoBF_NoNode:
1535     BitwiseXORExprNoBF_NoNode
1536   | BitwiseORExprNoBF_NoNode '|' BitwiseXORExpr_NoNode
1537 ;
1538 
1539 LogicalANDExpr_NoNode:
1540     BitwiseORExpr_NoNode
1541   | LogicalANDExpr_NoNode AND BitwiseORExpr_NoNode
1542 ;
1543 
1544 LogicalANDExprNoIn_NoNode:
1545     BitwiseORExprNoIn_NoNode
1546   | LogicalANDExprNoIn_NoNode AND BitwiseORExprNoIn_NoNode
1547 ;
1548 
1549 LogicalANDExprNoBF_NoNode:
1550     BitwiseORExprNoBF_NoNode
1551   | LogicalANDExprNoBF_NoNode AND BitwiseORExpr_NoNode
1552 ;
1553 
1554 LogicalORExpr_NoNode:
1555     LogicalANDExpr_NoNode
1556   | LogicalORExpr_NoNode OR LogicalANDExpr_NoNode
1557 ;
1558 
1559 LogicalORExprNoIn_NoNode:
1560     LogicalANDExprNoIn_NoNode
1561   | LogicalORExprNoIn_NoNode OR LogicalANDExprNoIn_NoNode
1562 ;
1563 
1564 LogicalORExprNoBF_NoNode:
1565     LogicalANDExprNoBF_NoNode
1566   | LogicalORExprNoBF_NoNode OR LogicalANDExpr_NoNode
1567 ;
1568 
1569 ConditionalExpr_NoNode:
1570     LogicalORExpr_NoNode
1571   | LogicalORExpr_NoNode '?' AssignmentExpr_NoNode ':' AssignmentExpr_NoNode
1572 ;
1573 
1574 ConditionalExprNoIn_NoNode:
1575     LogicalORExprNoIn_NoNode
1576   | LogicalORExprNoIn_NoNode '?' AssignmentExprNoIn_NoNode ':' AssignmentExprNoIn_NoNode
1577 ;
1578 
1579 ConditionalExprNoBF_NoNode:
1580     LogicalORExprNoBF_NoNode
1581   | LogicalORExprNoBF_NoNode '?' AssignmentExpr_NoNode ':' AssignmentExpr_NoNode
1582 ;
1583 
1584 AssignmentExpr_NoNode:
1585     ConditionalExpr_NoNode
1586   | LeftHandSideExpr_NoNode AssignmentOperator_NoNode AssignmentExpr_NoNode
1587 ;
1588 
1589 AssignmentExprNoIn_NoNode:
1590     ConditionalExprNoIn_NoNode
1591   | LeftHandSideExpr_NoNode AssignmentOperator_NoNode AssignmentExprNoIn_NoNode
1592 ;
1593 
1594 AssignmentExprNoBF_NoNode:
1595     ConditionalExprNoBF_NoNode
1596   | LeftHandSideExprNoBF_NoNode AssignmentOperator_NoNode AssignmentExpr_NoNode
1597 ;
1598 
1599 AssignmentOperator_NoNode:
1600     '='
1601   | PLUSEQUAL
1602   | MINUSEQUAL
1603   | MULTEQUAL
1604   | DIVEQUAL
1605   | LSHIFTEQUAL
1606   | RSHIFTEQUAL
1607   | URSHIFTEQUAL
1608   | ANDEQUAL
1609   | XOREQUAL
1610   | OREQUAL
1611   | MODEQUAL
1612 ;
1613 
1614 Expr_NoNode:
1615     AssignmentExpr_NoNode
1616   | Expr_NoNode ',' AssignmentExpr_NoNode
1617 ;
1618 
1619 ExprNoIn_NoNode:
1620     AssignmentExprNoIn_NoNode
1621   | ExprNoIn_NoNode ',' AssignmentExprNoIn_NoNode
1622 ;
1623 
1624 ExprNoBF_NoNode:
1625     AssignmentExprNoBF_NoNode
1626   | ExprNoBF_NoNode ',' AssignmentExpr_NoNode
1627 ;
1628 
1629 Statement_NoNode:
1630     Block_NoNode
1631   | VariableStatement_NoNode
1632   | ConstStatement_NoNode
1633   | FunctionDeclaration_NoNode
1634   | EmptyStatement_NoNode
1635   | ExprStatement_NoNode
1636   | IfStatement_NoNode
1637   | IterationStatement_NoNode
1638   | ContinueStatement_NoNode
1639   | BreakStatement_NoNode
1640   | ReturnStatement_NoNode
1641   | WithStatement_NoNode
1642   | SwitchStatement_NoNode
1643   | LabelledStatement_NoNode
1644   | ThrowStatement_NoNode
1645   | TryStatement_NoNode
1646   | DebuggerStatement_NoNode
1647 ;
1648 
1649 Block_NoNode:
1650     OPENBRACE CLOSEBRACE { }
1651   | OPENBRACE SourceElements_NoNode CLOSEBRACE { }
1652 ;
1653 
1654 VariableStatement_NoNode:
1655     VAR VariableDeclarationList_NoNode ';'
1656   | VAR VariableDeclarationList_NoNode error { AUTO_SEMICOLON; }
1657 ;
1658 
1659 VariableDeclarationList_NoNode:
1660     IDENT { }
1661   | IDENT Initializer_NoNode { }
1662   | VariableDeclarationList_NoNode ',' IDENT
1663   | VariableDeclarationList_NoNode ',' IDENT Initializer_NoNode
1664 ;
1665 
1666 VariableDeclarationListNoIn_NoNode:
1667     IDENT { }
1668   | IDENT InitializerNoIn_NoNode { }
1669   | VariableDeclarationListNoIn_NoNode ',' IDENT
1670   | VariableDeclarationListNoIn_NoNode ',' IDENT InitializerNoIn_NoNode
1671 ;
1672 
1673 ConstStatement_NoNode:
1674     CONSTTOKEN ConstDeclarationList_NoNode ';'
1675   | CONSTTOKEN ConstDeclarationList_NoNode error { AUTO_SEMICOLON; }
1676 ;
1677 
1678 ConstDeclarationList_NoNode:
1679     ConstDeclaration_NoNode
1680   | ConstDeclarationList_NoNode ',' ConstDeclaration_NoNode
1681 ;
1682 
1683 ConstDeclaration_NoNode:
1684     IDENT { }
1685   | IDENT Initializer_NoNode { }
1686 ;
1687 
1688 Initializer_NoNode:
1689     '=' AssignmentExpr_NoNode
1690 ;
1691 
1692 InitializerNoIn_NoNode:
1693     '=' AssignmentExprNoIn_NoNode
1694 ;
1695 
1696 EmptyStatement_NoNode:
1697     ';'
1698 ;
1699 
1700 ExprStatement_NoNode:
1701     ExprNoBF_NoNode ';'
1702   | ExprNoBF_NoNode error { AUTO_SEMICOLON; }
1703 ;
1704 
1705 IfStatement_NoNode:
1706     IF '(' Expr_NoNode ')' Statement_NoNode %prec IF_WITHOUT_ELSE
1707   | IF '(' Expr_NoNode ')' Statement_NoNode ELSE Statement_NoNode
1708 ;
1709 
1710 IterationStatement_NoNode:
1711     DO Statement_NoNode WHILE '(' Expr_NoNode ')' ';'
1712   | DO Statement_NoNode WHILE '(' Expr_NoNode ')' error // Always performs automatic semicolon insertion
1713   | WHILE '(' Expr_NoNode ')' Statement_NoNode
1714   | FOR '(' ExprNoInOpt_NoNode ';' ExprOpt_NoNode ';' ExprOpt_NoNode ')' Statement_NoNode
1715   | FOR '(' VAR VariableDeclarationListNoIn_NoNode ';' ExprOpt_NoNode ';' ExprOpt_NoNode ')' Statement_NoNode
1716   | FOR '(' LeftHandSideExpr_NoNode INTOKEN Expr_NoNode ')' Statement_NoNode
1717   | FOR '(' VAR IDENT INTOKEN Expr_NoNode ')' Statement_NoNode
1718   | FOR '(' VAR IDENT InitializerNoIn_NoNode INTOKEN Expr_NoNode ')' Statement_NoNode
1719 ;
1720 
1721 ExprOpt_NoNode:
1722     /* nothing */
1723   | Expr_NoNode
1724 ;
1725 
1726 ExprNoInOpt_NoNode:
1727     /* nothing */
1728   | ExprNoIn_NoNode
1729 ;
1730 
1731 ContinueStatement_NoNode:
1732     CONTINUE ';'
1733   | CONTINUE error { AUTO_SEMICOLON; }
1734   | CONTINUE IDENT ';'
1735   | CONTINUE IDENT error { AUTO_SEMICOLON; }
1736 ;
1737 
1738 BreakStatement_NoNode:
1739     BREAK ';'
1740   | BREAK error { AUTO_SEMICOLON; }
1741   | BREAK IDENT ';'
1742   | BREAK IDENT error { AUTO_SEMICOLON; }
1743 ;
1744 
1745 ReturnStatement_NoNode:
1746     RETURN ';'
1747   | RETURN error { AUTO_SEMICOLON; }
1748   | RETURN Expr_NoNode ';'
1749   | RETURN Expr_NoNode error { AUTO_SEMICOLON; }
1750 ;
1751 
1752 WithStatement_NoNode:
1753     WITH '(' Expr_NoNode ')' Statement_NoNode
1754 ;
1755 
1756 SwitchStatement_NoNode:
1757     SWITCH '(' Expr_NoNode ')' CaseBlock_NoNode
1758 ;
1759 
1760 CaseBlock_NoNode:
1761     OPENBRACE CaseClausesOpt_NoNode CLOSEBRACE { }
1762   | OPENBRACE CaseClausesOpt_NoNode DefaultClause_NoNode CaseClausesOpt_NoNode CLOSEBRACE { }
1763 ;
1764 
1765 CaseClausesOpt_NoNode:
1766     /* nothing */
1767   | CaseClauses_NoNode
1768 ;
1769 
1770 CaseClauses_NoNode:
1771     CaseClause_NoNode
1772   | CaseClauses_NoNode CaseClause_NoNode
1773 ;
1774 
1775 CaseClause_NoNode:
1776     CASE Expr_NoNode ':'
1777   | CASE Expr_NoNode ':' SourceElements_NoNode
1778 ;
1779 
1780 DefaultClause_NoNode:
1781     DEFAULT ':'
1782   | DEFAULT ':' SourceElements_NoNode
1783 ;
1784 
1785 LabelledStatement_NoNode:
1786     IDENT ':' Statement_NoNode { }
1787 ;
1788 
1789 ThrowStatement_NoNode:
1790     THROW Expr_NoNode ';'
1791   | THROW Expr_NoNode error { AUTO_SEMICOLON; }
1792 ;
1793 
1794 TryStatement_NoNode:
1795     TRY Block_NoNode FINALLY Block_NoNode
1796   | TRY Block_NoNode CATCH '(' IDENT ')' Block_NoNode
1797   | TRY Block_NoNode CATCH '(' IDENT ')' Block_NoNode FINALLY Block_NoNode
1798 ;
1799 
1800 DebuggerStatement_NoNode:
1801     DEBUGGER ';'
1802   | DEBUGGER error { AUTO_SEMICOLON; }
1803 ;
1804 
1805 FunctionDeclaration_NoNode:
1806     FUNCTION IDENT '(' ')' OPENBRACE FunctionBody_NoNode CLOSEBRACE
1807   | FUNCTION IDENT '(' FormalParameterList_NoNode ')' OPENBRACE FunctionBody_NoNode CLOSEBRACE
1808 ;
1809 
1810 FunctionExpr_NoNode:
1811     FUNCTION '(' ')' OPENBRACE FunctionBody_NoNode CLOSEBRACE
1812   | FUNCTION '(' FormalParameterList_NoNode ')' OPENBRACE FunctionBody_NoNode CLOSEBRACE
1813   | FUNCTION IDENT '(' ')' OPENBRACE FunctionBody_NoNode CLOSEBRACE
1814   | FUNCTION IDENT '(' FormalParameterList_NoNode ')' OPENBRACE FunctionBody_NoNode CLOSEBRACE
1815 ;
1816 
1817 FormalParameterList_NoNode:
1818     IDENT { }
1819   | FormalParameterList_NoNode ',' IDENT
1820 ;
1821 
1822 FunctionBody_NoNode:
1823     /* not in spec */
1824   | SourceElements_NoNode
1825 ;
1826 
1827 SourceElements_NoNode:
1828     Statement_NoNode
1829   | SourceElements_NoNode Statement_NoNode
1830 ;
1831 
1832 // End NoNodes
1833 
1834 %%
1835 
1836 #undef GLOBAL_DATA
1837 
1838 static ExpressionNode* makeAssignNode(JSGlobalData* globalData, ExpressionNode* loc, Operator op, ExpressionNode* expr, bool locHasAssignments, bool exprHasAssignments, int start, int divot, int end)
1839 {
1840     if (!loc->isLocation())
1841         return new (globalData) AssignErrorNode(globalData, loc, op, expr, divot, divot - start, end - divot);
1842 
1843     if (loc->isResolveNode()) {
1844         ResolveNode* resolve = static_cast<ResolveNode*>(loc);
1845         if (op == OpEqual) {
1846             AssignResolveNode* node = new (globalData) AssignResolveNode(globalData, resolve->identifier(), expr, exprHasAssignments);
1847             setExceptionLocation(node, start, divot, end);
1848             return node;
1849         } else
1850             return new (globalData) ReadModifyResolveNode(globalData, resolve->identifier(), op, expr, exprHasAssignments, divot, divot - start, end - divot);
1851     }
1852     if (loc->isBracketAccessorNode()) {
1853         BracketAccessorNode* bracket = static_cast<BracketAccessorNode*>(loc);
1854         if (op == OpEqual)
1855             return new (globalData) AssignBracketNode(globalData, bracket->base(), bracket->subscript(), expr, locHasAssignments, exprHasAssignments, bracket->divot(), bracket->divot() - start, end - bracket->divot());
1856         else {
1857             ReadModifyBracketNode* node = new (globalData) ReadModifyBracketNode(globalData, bracket->base(), bracket->subscript(), op, expr, locHasAssignments, exprHasAssignments, divot, divot - start, end - divot);
1858             node->setSubexpressionInfo(bracket->divot(), bracket->endOffset());
1859             return node;
1860         }
1861     }
1862     ASSERT(loc->isDotAccessorNode());
1863     DotAccessorNode* dot = static_cast<DotAccessorNode*>(loc);
1864     if (op == OpEqual)
1865         return new (globalData) AssignDotNode(globalData, dot->base(), dot->identifier(), expr, exprHasAssignments, dot->divot(), dot->divot() - start, end - dot->divot());
1866 
1867     ReadModifyDotNode* node = new (globalData) ReadModifyDotNode(globalData, dot->base(), dot->identifier(), op, expr, exprHasAssignments, divot, divot - start, end - divot);
1868     node->setSubexpressionInfo(dot->divot(), dot->endOffset());
1869     return node;
1870 }
1871 
makePrefixNode(JSGlobalData * globalData,ExpressionNode * expr,Operator op,int start,int divot,int end)1872 static ExpressionNode* makePrefixNode(JSGlobalData* globalData, ExpressionNode* expr, Operator op, int start, int divot, int end)
1873 {
1874     if (!expr->isLocation())
1875         return new (globalData) PrefixErrorNode(globalData, expr, op, divot, divot - start, end - divot);
1876 
1877     if (expr->isResolveNode()) {
1878         ResolveNode* resolve = static_cast<ResolveNode*>(expr);
1879         return new (globalData) PrefixResolveNode(globalData, resolve->identifier(), op, divot, divot - start, end - divot);
1880     }
1881     if (expr->isBracketAccessorNode()) {
1882         BracketAccessorNode* bracket = static_cast<BracketAccessorNode*>(expr);
1883         PrefixBracketNode* node = new (globalData) PrefixBracketNode(globalData, bracket->base(), bracket->subscript(), op, divot, divot - start, end - divot);
1884         node->setSubexpressionInfo(bracket->divot(), bracket->startOffset());
1885         return node;
1886     }
1887     ASSERT(expr->isDotAccessorNode());
1888     DotAccessorNode* dot = static_cast<DotAccessorNode*>(expr);
1889     PrefixDotNode* node = new (globalData) PrefixDotNode(globalData, dot->base(), dot->identifier(), op, divot, divot - start, end - divot);
1890     node->setSubexpressionInfo(dot->divot(), dot->startOffset());
1891     return node;
1892 }
1893 
makePostfixNode(JSGlobalData * globalData,ExpressionNode * expr,Operator op,int start,int divot,int end)1894 static ExpressionNode* makePostfixNode(JSGlobalData* globalData, ExpressionNode* expr, Operator op, int start, int divot, int end)
1895 {
1896     if (!expr->isLocation())
1897         return new (globalData) PostfixErrorNode(globalData, expr, op, divot, divot - start, end - divot);
1898 
1899     if (expr->isResolveNode()) {
1900         ResolveNode* resolve = static_cast<ResolveNode*>(expr);
1901         return new (globalData) PostfixResolveNode(globalData, resolve->identifier(), op, divot, divot - start, end - divot);
1902     }
1903     if (expr->isBracketAccessorNode()) {
1904         BracketAccessorNode* bracket = static_cast<BracketAccessorNode*>(expr);
1905         PostfixBracketNode* node = new (globalData) PostfixBracketNode(globalData, bracket->base(), bracket->subscript(), op, divot, divot - start, end - divot);
1906         node->setSubexpressionInfo(bracket->divot(), bracket->endOffset());
1907         return node;
1908 
1909     }
1910     ASSERT(expr->isDotAccessorNode());
1911     DotAccessorNode* dot = static_cast<DotAccessorNode*>(expr);
1912     PostfixDotNode* node = new (globalData) PostfixDotNode(globalData, dot->base(), dot->identifier(), op, divot, divot - start, end - divot);
1913     node->setSubexpressionInfo(dot->divot(), dot->endOffset());
1914     return node;
1915 }
1916 
makeFunctionCallNode(JSGlobalData * globalData,ExpressionNodeInfo func,ArgumentsNodeInfo args,int start,int divot,int end)1917 static ExpressionNodeInfo makeFunctionCallNode(JSGlobalData* globalData, ExpressionNodeInfo func, ArgumentsNodeInfo args, int start, int divot, int end)
1918 {
1919     CodeFeatures features = func.m_features | args.m_features;
1920     int numConstants = func.m_numConstants + args.m_numConstants;
1921     if (!func.m_node->isLocation())
1922         return createNodeInfo<ExpressionNode*>(new (globalData) FunctionCallValueNode(globalData, func.m_node, args.m_node, divot, divot - start, end - divot), features, numConstants);
1923     if (func.m_node->isResolveNode()) {
1924         ResolveNode* resolve = static_cast<ResolveNode*>(func.m_node);
1925         const Identifier& identifier = resolve->identifier();
1926         if (identifier == globalData->propertyNames->eval)
1927             return createNodeInfo<ExpressionNode*>(new (globalData) EvalFunctionCallNode(globalData, args.m_node, divot, divot - start, end - divot), EvalFeature | features, numConstants);
1928         return createNodeInfo<ExpressionNode*>(new (globalData) FunctionCallResolveNode(globalData, identifier, args.m_node, divot, divot - start, end - divot), features, numConstants);
1929     }
1930     if (func.m_node->isBracketAccessorNode()) {
1931         BracketAccessorNode* bracket = static_cast<BracketAccessorNode*>(func.m_node);
1932         FunctionCallBracketNode* node = new (globalData) FunctionCallBracketNode(globalData, bracket->base(), bracket->subscript(), args.m_node, divot, divot - start, end - divot);
1933         node->setSubexpressionInfo(bracket->divot(), bracket->endOffset());
1934         return createNodeInfo<ExpressionNode*>(node, features, numConstants);
1935     }
1936     ASSERT(func.m_node->isDotAccessorNode());
1937     DotAccessorNode* dot = static_cast<DotAccessorNode*>(func.m_node);
1938     FunctionCallDotNode* node;
1939     if (dot->identifier() == globalData->propertyNames->call)
1940         node = new (globalData) CallFunctionCallDotNode(globalData, dot->base(), dot->identifier(), args.m_node, divot, divot - start, end - divot);
1941     else if (dot->identifier() == globalData->propertyNames->apply)
1942         node = new (globalData) ApplyFunctionCallDotNode(globalData, dot->base(), dot->identifier(), args.m_node, divot, divot - start, end - divot);
1943     else
1944         node = new (globalData) FunctionCallDotNode(globalData, dot->base(), dot->identifier(), args.m_node, divot, divot - start, end - divot);
1945     node->setSubexpressionInfo(dot->divot(), dot->endOffset());
1946     return createNodeInfo<ExpressionNode*>(node, features, numConstants);
1947 }
1948 
makeTypeOfNode(JSGlobalData * globalData,ExpressionNode * expr)1949 static ExpressionNode* makeTypeOfNode(JSGlobalData* globalData, ExpressionNode* expr)
1950 {
1951     if (expr->isResolveNode()) {
1952         ResolveNode* resolve = static_cast<ResolveNode*>(expr);
1953         return new (globalData) TypeOfResolveNode(globalData, resolve->identifier());
1954     }
1955     return new (globalData) TypeOfValueNode(globalData, expr);
1956 }
1957 
makeDeleteNode(JSGlobalData * globalData,ExpressionNode * expr,int start,int divot,int end)1958 static ExpressionNode* makeDeleteNode(JSGlobalData* globalData, ExpressionNode* expr, int start, int divot, int end)
1959 {
1960     if (!expr->isLocation())
1961         return new (globalData) DeleteValueNode(globalData, expr);
1962     if (expr->isResolveNode()) {
1963         ResolveNode* resolve = static_cast<ResolveNode*>(expr);
1964         return new (globalData) DeleteResolveNode(globalData, resolve->identifier(), divot, divot - start, end - divot);
1965     }
1966     if (expr->isBracketAccessorNode()) {
1967         BracketAccessorNode* bracket = static_cast<BracketAccessorNode*>(expr);
1968         return new (globalData) DeleteBracketNode(globalData, bracket->base(), bracket->subscript(), divot, divot - start, end - divot);
1969     }
1970     ASSERT(expr->isDotAccessorNode());
1971     DotAccessorNode* dot = static_cast<DotAccessorNode*>(expr);
1972     return new (globalData) DeleteDotNode(globalData, dot->base(), dot->identifier(), divot, divot - start, end - divot);
1973 }
1974 
makeGetterOrSetterPropertyNode(JSGlobalData * globalData,const Identifier & getOrSet,const Identifier & name,ParameterNode * params,FunctionBodyNode * body,const SourceCode & source)1975 static PropertyNode* makeGetterOrSetterPropertyNode(JSGlobalData* globalData, const Identifier& getOrSet, const Identifier& name, ParameterNode* params, FunctionBodyNode* body, const SourceCode& source)
1976 {
1977     PropertyNode::Type type;
1978     if (getOrSet == "get")
1979         type = PropertyNode::Getter;
1980     else if (getOrSet == "set")
1981         type = PropertyNode::Setter;
1982     else
1983         return 0;
1984     return new (globalData) PropertyNode(globalData, name, new (globalData) FuncExprNode(globalData, globalData->propertyNames->nullIdentifier, body, source, params), type);
1985 }
1986 
makeNegateNode(JSGlobalData * globalData,ExpressionNode * n)1987 static ExpressionNode* makeNegateNode(JSGlobalData* globalData, ExpressionNode* n)
1988 {
1989     if (n->isNumber()) {
1990         NumberNode* numberNode = static_cast<NumberNode*>(n);
1991         numberNode->setValue(-numberNode->value());
1992         return numberNode;
1993     }
1994 
1995     return new (globalData) NegateNode(globalData, n);
1996 }
1997 
makeNumberNode(JSGlobalData * globalData,double d)1998 static NumberNode* makeNumberNode(JSGlobalData* globalData, double d)
1999 {
2000     return new (globalData) NumberNode(globalData, d);
2001 }
2002 
makeBitwiseNotNode(JSGlobalData * globalData,ExpressionNode * expr)2003 static ExpressionNode* makeBitwiseNotNode(JSGlobalData* globalData, ExpressionNode* expr)
2004 {
2005     if (expr->isNumber())
2006         return makeNumberNode(globalData, ~toInt32(static_cast<NumberNode*>(expr)->value()));
2007     return new (globalData) BitwiseNotNode(globalData, expr);
2008 }
2009 
makeMultNode(JSGlobalData * globalData,ExpressionNode * expr1,ExpressionNode * expr2,bool rightHasAssignments)2010 static ExpressionNode* makeMultNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
2011 {
2012     expr1 = expr1->stripUnaryPlus();
2013     expr2 = expr2->stripUnaryPlus();
2014 
2015     if (expr1->isNumber() && expr2->isNumber())
2016         return makeNumberNode(globalData, static_cast<NumberNode*>(expr1)->value() * static_cast<NumberNode*>(expr2)->value());
2017 
2018     if (expr1->isNumber() && static_cast<NumberNode*>(expr1)->value() == 1)
2019         return new (globalData) UnaryPlusNode(globalData, expr2);
2020 
2021     if (expr2->isNumber() && static_cast<NumberNode*>(expr2)->value() == 1)
2022         return new (globalData) UnaryPlusNode(globalData, expr1);
2023 
2024     return new (globalData) MultNode(globalData, expr1, expr2, rightHasAssignments);
2025 }
2026 
makeDivNode(JSGlobalData * globalData,ExpressionNode * expr1,ExpressionNode * expr2,bool rightHasAssignments)2027 static ExpressionNode* makeDivNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
2028 {
2029     expr1 = expr1->stripUnaryPlus();
2030     expr2 = expr2->stripUnaryPlus();
2031 
2032     if (expr1->isNumber() && expr2->isNumber())
2033         return makeNumberNode(globalData, static_cast<NumberNode*>(expr1)->value() / static_cast<NumberNode*>(expr2)->value());
2034     return new (globalData) DivNode(globalData, expr1, expr2, rightHasAssignments);
2035 }
2036 
makeAddNode(JSGlobalData * globalData,ExpressionNode * expr1,ExpressionNode * expr2,bool rightHasAssignments)2037 static ExpressionNode* makeAddNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
2038 {
2039     if (expr1->isNumber() && expr2->isNumber())
2040         return makeNumberNode(globalData, static_cast<NumberNode*>(expr1)->value() + static_cast<NumberNode*>(expr2)->value());
2041     return new (globalData) AddNode(globalData, expr1, expr2, rightHasAssignments);
2042 }
2043 
makeSubNode(JSGlobalData * globalData,ExpressionNode * expr1,ExpressionNode * expr2,bool rightHasAssignments)2044 static ExpressionNode* makeSubNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
2045 {
2046     expr1 = expr1->stripUnaryPlus();
2047     expr2 = expr2->stripUnaryPlus();
2048 
2049     if (expr1->isNumber() && expr2->isNumber())
2050         return makeNumberNode(globalData, static_cast<NumberNode*>(expr1)->value() - static_cast<NumberNode*>(expr2)->value());
2051     return new (globalData) SubNode(globalData, expr1, expr2, rightHasAssignments);
2052 }
2053 
makeLeftShiftNode(JSGlobalData * globalData,ExpressionNode * expr1,ExpressionNode * expr2,bool rightHasAssignments)2054 static ExpressionNode* makeLeftShiftNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
2055 {
2056     if (expr1->isNumber() && expr2->isNumber())
2057         return makeNumberNode(globalData, toInt32(static_cast<NumberNode*>(expr1)->value()) << (toUInt32(static_cast<NumberNode*>(expr2)->value()) & 0x1f));
2058     return new (globalData) LeftShiftNode(globalData, expr1, expr2, rightHasAssignments);
2059 }
2060 
makeRightShiftNode(JSGlobalData * globalData,ExpressionNode * expr1,ExpressionNode * expr2,bool rightHasAssignments)2061 static ExpressionNode* makeRightShiftNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
2062 {
2063     if (expr1->isNumber() && expr2->isNumber())
2064         return makeNumberNode(globalData, toInt32(static_cast<NumberNode*>(expr1)->value()) >> (toUInt32(static_cast<NumberNode*>(expr2)->value()) & 0x1f));
2065     return new (globalData) RightShiftNode(globalData, expr1, expr2, rightHasAssignments);
2066 }
2067 
2068 // Called by yyparse on error.
yyerror(const char *)2069 int yyerror(const char*)
2070 {
2071     return 1;
2072 }
2073 
2074 // May we automatically insert a semicolon?
allowAutomaticSemicolon(Lexer & lexer,int yychar)2075 static bool allowAutomaticSemicolon(Lexer& lexer, int yychar)
2076 {
2077     return yychar == CLOSEBRACE || yychar == 0 || lexer.prevTerminator();
2078 }
2079 
combineCommaNodes(JSGlobalData * globalData,ExpressionNode * list,ExpressionNode * init)2080 static ExpressionNode* combineCommaNodes(JSGlobalData* globalData, ExpressionNode* list, ExpressionNode* init)
2081 {
2082     if (!list)
2083         return init;
2084     if (list->isCommaNode()) {
2085         static_cast<CommaNode*>(list)->append(init);
2086         return list;
2087     }
2088     return new (globalData) CommaNode(globalData, list, init);
2089 }
2090 
2091 // We turn variable declarations into either assignments or empty
2092 // statements (which later get stripped out), because the actual
2093 // declaration work is hoisted up to the start of the function body
makeVarStatementNode(JSGlobalData * globalData,ExpressionNode * expr)2094 static StatementNode* makeVarStatementNode(JSGlobalData* globalData, ExpressionNode* expr)
2095 {
2096     if (!expr)
2097         return new (globalData) EmptyStatementNode(globalData);
2098     return new (globalData) VarStatementNode(globalData, expr);
2099 }
2100