1 %pure_parser 2 3 %{ 4 5 /* 6 * Copyright (C) 1999-2000 Harri Porten (porten (at) kde.org) 7 * Copyright (C) 2006, 2007, 2008, 2009 Apple Inc. All rights reserved. 8 * Copyright (C) 2007 Eric Seidel <eric (at) 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 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 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 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 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 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 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 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->emptyIdentifier, 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->emptyIdentifier, $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->emptyIdentifier, $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 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 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 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 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 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 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->emptyIdentifier, body, source, params), type); 1985 } 1986 1987 static ExpressionNode* makeNegateNode(JSGlobalData* globalData, ExpressionNode* n) 1988 { 1989 if (n->isNumber()) { 1990 NumberNode* number = static_cast<NumberNode*>(n); 1991 1992 if (number->value() > 0.0) { 1993 number->setValue(-number->value()); 1994 return number; 1995 } 1996 } 1997 1998 return new (globalData) NegateNode(globalData, n); 1999 } 2000 2001 static NumberNode* makeNumberNode(JSGlobalData* globalData, double d) 2002 { 2003 return new (globalData) NumberNode(globalData, d); 2004 } 2005 2006 static ExpressionNode* makeBitwiseNotNode(JSGlobalData* globalData, ExpressionNode* expr) 2007 { 2008 if (expr->isNumber()) 2009 return makeNumberNode(globalData, ~toInt32(static_cast<NumberNode*>(expr)->value())); 2010 return new (globalData) BitwiseNotNode(globalData, expr); 2011 } 2012 2013 static ExpressionNode* makeMultNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) 2014 { 2015 expr1 = expr1->stripUnaryPlus(); 2016 expr2 = expr2->stripUnaryPlus(); 2017 2018 if (expr1->isNumber() && expr2->isNumber()) 2019 return makeNumberNode(globalData, static_cast<NumberNode*>(expr1)->value() * static_cast<NumberNode*>(expr2)->value()); 2020 2021 if (expr1->isNumber() && static_cast<NumberNode*>(expr1)->value() == 1) 2022 return new (globalData) UnaryPlusNode(globalData, expr2); 2023 2024 if (expr2->isNumber() && static_cast<NumberNode*>(expr2)->value() == 1) 2025 return new (globalData) UnaryPlusNode(globalData, expr1); 2026 2027 return new (globalData) MultNode(globalData, expr1, expr2, rightHasAssignments); 2028 } 2029 2030 static ExpressionNode* makeDivNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) 2031 { 2032 expr1 = expr1->stripUnaryPlus(); 2033 expr2 = expr2->stripUnaryPlus(); 2034 2035 if (expr1->isNumber() && expr2->isNumber()) 2036 return makeNumberNode(globalData, static_cast<NumberNode*>(expr1)->value() / static_cast<NumberNode*>(expr2)->value()); 2037 return new (globalData) DivNode(globalData, expr1, expr2, rightHasAssignments); 2038 } 2039 2040 static ExpressionNode* makeAddNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) 2041 { 2042 if (expr1->isNumber() && expr2->isNumber()) 2043 return makeNumberNode(globalData, static_cast<NumberNode*>(expr1)->value() + static_cast<NumberNode*>(expr2)->value()); 2044 return new (globalData) AddNode(globalData, expr1, expr2, rightHasAssignments); 2045 } 2046 2047 static ExpressionNode* makeSubNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) 2048 { 2049 expr1 = expr1->stripUnaryPlus(); 2050 expr2 = expr2->stripUnaryPlus(); 2051 2052 if (expr1->isNumber() && expr2->isNumber()) 2053 return makeNumberNode(globalData, static_cast<NumberNode*>(expr1)->value() - static_cast<NumberNode*>(expr2)->value()); 2054 return new (globalData) SubNode(globalData, expr1, expr2, rightHasAssignments); 2055 } 2056 2057 static ExpressionNode* makeLeftShiftNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) 2058 { 2059 if (expr1->isNumber() && expr2->isNumber()) 2060 return makeNumberNode(globalData, toInt32(static_cast<NumberNode*>(expr1)->value()) << (toUInt32(static_cast<NumberNode*>(expr2)->value()) & 0x1f)); 2061 return new (globalData) LeftShiftNode(globalData, expr1, expr2, rightHasAssignments); 2062 } 2063 2064 static ExpressionNode* makeRightShiftNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) 2065 { 2066 if (expr1->isNumber() && expr2->isNumber()) 2067 return makeNumberNode(globalData, toInt32(static_cast<NumberNode*>(expr1)->value()) >> (toUInt32(static_cast<NumberNode*>(expr2)->value()) & 0x1f)); 2068 return new (globalData) RightShiftNode(globalData, expr1, expr2, rightHasAssignments); 2069 } 2070 2071 // Called by yyparse on error. 2072 int yyerror(const char*) 2073 { 2074 return 1; 2075 } 2076 2077 // May we automatically insert a semicolon? 2078 static bool allowAutomaticSemicolon(Lexer& lexer, int yychar) 2079 { 2080 return yychar == CLOSEBRACE || yychar == 0 || lexer.prevTerminator(); 2081 } 2082 2083 static ExpressionNode* combineCommaNodes(JSGlobalData* globalData, ExpressionNode* list, ExpressionNode* init) 2084 { 2085 if (!list) 2086 return init; 2087 if (list->isCommaNode()) { 2088 static_cast<CommaNode*>(list)->append(init); 2089 return list; 2090 } 2091 return new (globalData) CommaNode(globalData, list, init); 2092 } 2093 2094 // We turn variable declarations into either assignments or empty 2095 // statements (which later get stripped out), because the actual 2096 // declaration work is hoisted up to the start of the function body 2097 static StatementNode* makeVarStatementNode(JSGlobalData* globalData, ExpressionNode* expr) 2098 { 2099 if (!expr) 2100 return new (globalData) EmptyStatementNode(globalData); 2101 return new (globalData) VarStatementNode(globalData, expr); 2102 } 2103