/tools/qdoc3/declarativeparser/qdeclarativejsparser.cpp

https://bitbucket.org/ultra_iter/qt-vtl · C++ · 1904 lines · 1516 code · 339 blank · 49 comment · 65 complexity · 134836bbd3a10b6a577ec2143a36d1d9 MD5 · raw file

Large files are truncated click here to view the full file

  1. /****************************************************************************
  2. **
  3. ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
  4. ** All rights reserved.
  5. ** Contact: Nokia Corporation (qt-info@nokia.com)
  6. **
  7. ** This file is part of the QtDeclarative module of the Qt Toolkit.
  8. **
  9. ** $QT_BEGIN_LICENSE:LGPL$
  10. ** GNU Lesser General Public License Usage
  11. ** This file may be used under the terms of the GNU Lesser General Public
  12. ** License version 2.1 as published by the Free Software Foundation and
  13. ** appearing in the file LICENSE.LGPL included in the packaging of this
  14. ** file. Please review the following information to ensure the GNU Lesser
  15. ** General Public License version 2.1 requirements will be met:
  16. ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
  17. **
  18. ** In addition, as a special exception, Nokia gives you certain additional
  19. ** rights. These rights are described in the Nokia Qt LGPL Exception
  20. ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
  21. **
  22. ** GNU General Public License Usage
  23. ** Alternatively, this file may be used under the terms of the GNU General
  24. ** Public License version 3.0 as published by the Free Software Foundation
  25. ** and appearing in the file LICENSE.GPL included in the packaging of this
  26. ** file. Please review the following information to ensure the GNU General
  27. ** Public License version 3.0 requirements will be met:
  28. ** http://www.gnu.org/copyleft/gpl.html.
  29. **
  30. ** Other Usage
  31. ** Alternatively, this file may be used in accordance with the terms and
  32. ** conditions contained in a signed written agreement between you and Nokia.
  33. **
  34. **
  35. **
  36. **
  37. **
  38. ** $QT_END_LICENSE$
  39. **
  40. ****************************************************************************/
  41. #include <QtCore/QtDebug>
  42. #include <QtGui/QApplication>
  43. #include <string.h>
  44. #include "qdeclarativejsengine_p.h"
  45. #include "qdeclarativejslexer_p.h"
  46. #include "qdeclarativejsast_p.h"
  47. #include "qdeclarativejsnodepool_p.h"
  48. #include "qdeclarativejsparser_p.h"
  49. #include <QVarLengthArray>
  50. //
  51. // This file is automatically generated from qmljs.g.
  52. // Changes will be lost.
  53. //
  54. using namespace QDeclarativeJS;
  55. QT_QML_BEGIN_NAMESPACE
  56. void Parser::reallocateStack()
  57. {
  58. if (! stack_size)
  59. stack_size = 128;
  60. else
  61. stack_size <<= 1;
  62. sym_stack = reinterpret_cast<Value*> (qRealloc(sym_stack, stack_size * sizeof(Value)));
  63. state_stack = reinterpret_cast<int*> (qRealloc(state_stack, stack_size * sizeof(int)));
  64. location_stack = reinterpret_cast<AST::SourceLocation*> (qRealloc(location_stack, stack_size * sizeof(AST::SourceLocation)));
  65. }
  66. inline static bool automatic(Engine *driver, int token)
  67. {
  68. return token == QDeclarativeJSGrammar::T_RBRACE
  69. || token == 0
  70. || driver->lexer()->prevTerminator();
  71. }
  72. Parser::Parser(Engine *engine):
  73. driver(engine),
  74. tos(0),
  75. stack_size(0),
  76. sym_stack(0),
  77. state_stack(0),
  78. location_stack(0),
  79. first_token(0),
  80. last_token(0)
  81. {
  82. }
  83. Parser::~Parser()
  84. {
  85. if (stack_size) {
  86. qFree(sym_stack);
  87. qFree(state_stack);
  88. qFree(location_stack);
  89. }
  90. }
  91. static inline AST::SourceLocation location(Lexer *lexer)
  92. {
  93. AST::SourceLocation loc;
  94. loc.offset = lexer->tokenOffset();
  95. loc.length = lexer->tokenLength();
  96. loc.startLine = lexer->startLineNo();
  97. loc.startColumn = lexer->startColumnNo();
  98. return loc;
  99. }
  100. AST::UiQualifiedId *Parser::reparseAsQualifiedId(AST::ExpressionNode *expr)
  101. {
  102. QVarLengthArray<NameId *, 4> nameIds;
  103. QVarLengthArray<AST::SourceLocation, 4> locations;
  104. AST::ExpressionNode *it = expr;
  105. while (AST::FieldMemberExpression *m = AST::cast<AST::FieldMemberExpression *>(it)) {
  106. nameIds.append(m->name);
  107. locations.append(m->identifierToken);
  108. it = m->base;
  109. }
  110. if (AST::IdentifierExpression *idExpr = AST::cast<AST::IdentifierExpression *>(it)) {
  111. AST::UiQualifiedId *q = makeAstNode<AST::UiQualifiedId>(driver->nodePool(), idExpr->name);
  112. q->identifierToken = idExpr->identifierToken;
  113. AST::UiQualifiedId *currentId = q;
  114. for (int i = nameIds.size() - 1; i != -1; --i) {
  115. currentId = makeAstNode<AST::UiQualifiedId>(driver->nodePool(), currentId, nameIds[i]);
  116. currentId->identifierToken = locations[i];
  117. }
  118. return currentId->finish();
  119. }
  120. return 0;
  121. }
  122. bool Parser::parse(int startToken)
  123. {
  124. Lexer *lexer = driver->lexer();
  125. bool hadErrors = false;
  126. int yytoken = -1;
  127. int action = 0;
  128. token_buffer[0].token = startToken;
  129. first_token = &token_buffer[0];
  130. last_token = &token_buffer[1];
  131. tos = -1;
  132. program = 0;
  133. do {
  134. if (++tos == stack_size)
  135. reallocateStack();
  136. state_stack[tos] = action;
  137. _Lcheck_token:
  138. if (yytoken == -1 && -TERMINAL_COUNT != action_index[action]) {
  139. yyprevlloc = yylloc;
  140. if (first_token == last_token) {
  141. yytoken = lexer->lex();
  142. yylval = lexer->dval();
  143. yylloc = location(lexer);
  144. } else {
  145. yytoken = first_token->token;
  146. yylval = first_token->dval;
  147. yylloc = first_token->loc;
  148. ++first_token;
  149. }
  150. }
  151. action = t_action(action, yytoken);
  152. if (action > 0) {
  153. if (action != ACCEPT_STATE) {
  154. yytoken = -1;
  155. sym(1).dval = yylval;
  156. loc(1) = yylloc;
  157. } else {
  158. --tos;
  159. return ! hadErrors;
  160. }
  161. } else if (action < 0) {
  162. const int r = -action - 1;
  163. tos -= rhs[r];
  164. switch (r) {
  165. case 0: {
  166. sym(1).Node = sym(2).Node;
  167. program = sym(1).Node;
  168. } break;
  169. case 1: {
  170. sym(1).Node = sym(2).Node;
  171. program = sym(1).Node;
  172. } break;
  173. case 2: {
  174. sym(1).Node = sym(2).Node;
  175. program = sym(1).Node;
  176. } break;
  177. case 3: {
  178. sym(1).Node = sym(2).Node;
  179. program = sym(1).Node;
  180. } break;
  181. case 4: {
  182. sym(1).Node = sym(2).Node;
  183. program = sym(1).Node;
  184. } break;
  185. case 5: {
  186. sym(1).Node = sym(2).Node;
  187. program = sym(1).Node;
  188. } break;
  189. case 6: {
  190. sym(1).UiProgram = makeAstNode<AST::UiProgram> (driver->nodePool(), sym(1).UiImportList,
  191. sym(2).UiObjectMemberList->finish());
  192. } break;
  193. case 8: {
  194. sym(1).Node = sym(1).UiImportList->finish();
  195. } break;
  196. case 9: {
  197. sym(1).Node = makeAstNode<AST::UiImportList> (driver->nodePool(), sym(1).UiImport);
  198. } break;
  199. case 10: {
  200. sym(1).Node = makeAstNode<AST::UiImportList> (driver->nodePool(),
  201. sym(1).UiImportList, sym(2).UiImport);
  202. } break;
  203. case 13: {
  204. sym(1).UiImport->semicolonToken = loc(2);
  205. } break;
  206. case 15: {
  207. sym(1).UiImport->versionToken = loc(2);
  208. sym(1).UiImport->semicolonToken = loc(3);
  209. } break;
  210. case 17: {
  211. sym(1).UiImport->versionToken = loc(2);
  212. sym(1).UiImport->asToken = loc(3);
  213. sym(1).UiImport->importIdToken = loc(4);
  214. sym(1).UiImport->importId = sym(4).sval;
  215. sym(1).UiImport->semicolonToken = loc(5);
  216. } break;
  217. case 19: {
  218. sym(1).UiImport->asToken = loc(2);
  219. sym(1).UiImport->importIdToken = loc(3);
  220. sym(1).UiImport->importId = sym(3).sval;
  221. sym(1).UiImport->semicolonToken = loc(4);
  222. } break;
  223. case 20: {
  224. AST::UiImport *node = 0;
  225. if (AST::StringLiteral *importIdLiteral = AST::cast<AST::StringLiteral *>(sym(2).Expression)) {
  226. node = makeAstNode<AST::UiImport>(driver->nodePool(), importIdLiteral->value);
  227. node->fileNameToken = loc(2);
  228. } else if (AST::UiQualifiedId *qualifiedId = reparseAsQualifiedId(sym(2).Expression)) {
  229. node = makeAstNode<AST::UiImport>(driver->nodePool(), qualifiedId);
  230. node->fileNameToken = loc(2);
  231. }
  232. sym(1).Node = node;
  233. if (node) {
  234. node->importToken = loc(1);
  235. } else {
  236. diagnostic_messages.append(DiagnosticMessage(DiagnosticMessage::Error, loc(1),
  237. QLatin1String("Expected a qualified name id or a string literal")));
  238. return false; // ### remove me
  239. }
  240. } break;
  241. case 21: {
  242. sym(1).Node = 0;
  243. } break;
  244. case 22: {
  245. sym(1).Node = makeAstNode<AST::UiObjectMemberList> (driver->nodePool(), sym(1).UiObjectMember);
  246. } break;
  247. case 23: {
  248. sym(1).Node = makeAstNode<AST::UiObjectMemberList> (driver->nodePool(), sym(1).UiObjectMember);
  249. } break;
  250. case 24: {
  251. AST::UiObjectMemberList *node = makeAstNode<AST:: UiObjectMemberList> (driver->nodePool(),
  252. sym(1).UiObjectMemberList, sym(2).UiObjectMember);
  253. sym(1).Node = node;
  254. } break;
  255. case 25: {
  256. sym(1).Node = makeAstNode<AST::UiArrayMemberList> (driver->nodePool(), sym(1).UiObjectMember);
  257. } break;
  258. case 26: {
  259. AST::UiArrayMemberList *node = makeAstNode<AST::UiArrayMemberList> (driver->nodePool(),
  260. sym(1).UiArrayMemberList, sym(3).UiObjectMember);
  261. node->commaToken = loc(2);
  262. sym(1).Node = node;
  263. } break;
  264. case 27: {
  265. AST::UiObjectInitializer *node = makeAstNode<AST::UiObjectInitializer> (driver->nodePool(), (AST::UiObjectMemberList*)0);
  266. node->lbraceToken = loc(1);
  267. node->rbraceToken = loc(2);
  268. sym(1).Node = node;
  269. } break;
  270. case 28: {
  271. AST::UiObjectInitializer *node = makeAstNode<AST::UiObjectInitializer> (driver->nodePool(), sym(2).UiObjectMemberList->finish());
  272. node->lbraceToken = loc(1);
  273. node->rbraceToken = loc(3);
  274. sym(1).Node = node;
  275. } break;
  276. case 29: {
  277. AST::UiObjectDefinition *node = makeAstNode<AST::UiObjectDefinition> (driver->nodePool(), sym(1).UiQualifiedId,
  278. sym(2).UiObjectInitializer);
  279. sym(1).Node = node;
  280. } break;
  281. case 31: {
  282. AST::UiArrayBinding *node = makeAstNode<AST::UiArrayBinding> (driver->nodePool(),
  283. sym(1).UiQualifiedId, sym(4).UiArrayMemberList->finish());
  284. node->colonToken = loc(2);
  285. node->lbracketToken = loc(3);
  286. node->rbracketToken = loc(5);
  287. sym(1).Node = node;
  288. } break;
  289. case 32: {
  290. AST::UiObjectBinding *node = makeAstNode<AST::UiObjectBinding> (driver->nodePool(),
  291. sym(1).UiQualifiedId, sym(3).UiQualifiedId, sym(4).UiObjectInitializer);
  292. node->colonToken = loc(2);
  293. sym(1).Node = node;
  294. } break;
  295. case 33: {
  296. AST::UiObjectBinding *node = makeAstNode<AST::UiObjectBinding> (driver->nodePool(),
  297. sym(3).UiQualifiedId, sym(1).UiQualifiedId, sym(4).UiObjectInitializer);
  298. node->colonToken = loc(2);
  299. node->hasOnToken = true;
  300. sym(1).Node = node;
  301. } break;
  302. case 34:case 35:case 36:case 37:
  303. {
  304. AST::UiScriptBinding *node = makeAstNode<AST::UiScriptBinding> (driver->nodePool(),
  305. sym(1).UiQualifiedId, sym(3).Statement);
  306. node->colonToken = loc(2);
  307. sym(1).Node = node;
  308. } break;
  309. case 38:
  310. case 39: {
  311. sym(1).sval = driver->intern(lexer->characterBuffer(), lexer->characterCount());
  312. break;
  313. }
  314. case 41: {
  315. sym(1).Node = 0;
  316. } break;
  317. case 42: {
  318. sym(1).Node = sym(1).UiParameterList->finish ();
  319. } break;
  320. case 43: {
  321. AST::UiParameterList *node = makeAstNode<AST::UiParameterList> (driver->nodePool(), sym(1).sval, sym(2).sval);
  322. node->identifierToken = loc(2);
  323. sym(1).Node = node;
  324. } break;
  325. case 44: {
  326. AST::UiParameterList *node = makeAstNode<AST::UiParameterList> (driver->nodePool(), sym(1).UiParameterList, sym(3).sval, sym(4).sval);
  327. node->commaToken = loc(2);
  328. node->identifierToken = loc(4);
  329. sym(1).Node = node;
  330. } break;
  331. case 46: {
  332. AST::UiPublicMember *node = makeAstNode<AST::UiPublicMember> (driver->nodePool(), (NameId *)0, sym(2).sval);
  333. node->type = AST::UiPublicMember::Signal;
  334. node->propertyToken = loc(1);
  335. node->typeToken = loc(2);
  336. node->identifierToken = loc(2);
  337. node->parameters = sym(4).UiParameterList;
  338. node->semicolonToken = loc(6);
  339. sym(1).Node = node;
  340. } break;
  341. case 48: {
  342. AST::UiPublicMember *node = makeAstNode<AST::UiPublicMember> (driver->nodePool(), (NameId *)0, sym(2).sval);
  343. node->type = AST::UiPublicMember::Signal;
  344. node->propertyToken = loc(1);
  345. node->typeToken = loc(2);
  346. node->identifierToken = loc(2);
  347. node->semicolonToken = loc(3);
  348. sym(1).Node = node;
  349. } break;
  350. case 50: {
  351. AST::UiPublicMember *node = makeAstNode<AST::UiPublicMember> (driver->nodePool(), sym(4).sval, sym(6).sval);
  352. node->typeModifier = sym(2).sval;
  353. node->propertyToken = loc(1);
  354. node->typeModifierToken = loc(2);
  355. node->typeToken = loc(4);
  356. node->identifierToken = loc(6);
  357. node->semicolonToken = loc(7);
  358. sym(1).Node = node;
  359. } break;
  360. case 52: {
  361. AST::UiPublicMember *node = makeAstNode<AST::UiPublicMember> (driver->nodePool(), sym(2).sval, sym(3).sval);
  362. node->propertyToken = loc(1);
  363. node->typeToken = loc(2);
  364. node->identifierToken = loc(3);
  365. node->semicolonToken = loc(4);
  366. sym(1).Node = node;
  367. } break;
  368. case 54: {
  369. AST::UiPublicMember *node = makeAstNode<AST::UiPublicMember> (driver->nodePool(), sym(3).sval, sym(4).sval);
  370. node->isDefaultMember = true;
  371. node->defaultToken = loc(1);
  372. node->propertyToken = loc(2);
  373. node->typeToken = loc(3);
  374. node->identifierToken = loc(4);
  375. node->semicolonToken = loc(5);
  376. sym(1).Node = node;
  377. } break;
  378. case 56: {
  379. AST::UiPublicMember *node = makeAstNode<AST::UiPublicMember> (driver->nodePool(), sym(2).sval, sym(3).sval,
  380. sym(5).Expression);
  381. node->propertyToken = loc(1);
  382. node->typeToken = loc(2);
  383. node->identifierToken = loc(3);
  384. node->colonToken = loc(4);
  385. node->semicolonToken = loc(6);
  386. sym(1).Node = node;
  387. } break;
  388. case 58: {
  389. AST::UiPublicMember *node = makeAstNode<AST::UiPublicMember> (driver->nodePool(), sym(3).sval, sym(4).sval,
  390. sym(6).Expression);
  391. node->isReadonlyMember = true;
  392. node->readonlyToken = loc(1);
  393. node->propertyToken = loc(2);
  394. node->typeToken = loc(3);
  395. node->identifierToken = loc(4);
  396. node->colonToken = loc(5);
  397. node->semicolonToken = loc(7);
  398. sym(1).Node = node;
  399. } break;
  400. case 60: {
  401. AST::UiPublicMember *node = makeAstNode<AST::UiPublicMember> (driver->nodePool(), sym(3).sval, sym(4).sval,
  402. sym(6).Expression);
  403. node->isDefaultMember = true;
  404. node->defaultToken = loc(1);
  405. node->propertyToken = loc(2);
  406. node->typeToken = loc(3);
  407. node->identifierToken = loc(4);
  408. node->colonToken = loc(5);
  409. node->semicolonToken = loc(7);
  410. sym(1).Node = node;
  411. } break;
  412. case 61: {
  413. AST::UiPublicMember *node = makeAstNode<AST::UiPublicMember> (driver->nodePool(), sym(4).sval, sym(6).sval);
  414. node->typeModifier = sym(2).sval;
  415. node->propertyToken = loc(1);
  416. node->typeModifierToken = loc(2);
  417. node->typeToken = loc(4);
  418. node->identifierToken = loc(6);
  419. node->semicolonToken = loc(7); // insert a fake ';' before ':'
  420. AST::UiQualifiedId *propertyName = makeAstNode<AST::UiQualifiedId>(driver->nodePool(), sym(6).sval);
  421. propertyName->identifierToken = loc(6);
  422. propertyName->next = 0;
  423. AST::UiArrayBinding *binding = makeAstNode<AST::UiArrayBinding> (driver->nodePool(),
  424. propertyName, sym(9).UiArrayMemberList->finish());
  425. binding->colonToken = loc(7);
  426. binding->lbracketToken = loc(8);
  427. binding->rbracketToken = loc(10);
  428. node->binding = binding;
  429. sym(1).Node = node;
  430. } break;
  431. case 62: {
  432. AST::UiPublicMember *node = makeAstNode<AST::UiPublicMember> (driver->nodePool(), sym(2).sval, sym(3).sval);
  433. node->propertyToken = loc(1);
  434. node->typeToken = loc(2);
  435. node->identifierToken = loc(3);
  436. node->semicolonToken = loc(4); // insert a fake ';' before ':'
  437. AST::UiQualifiedId *propertyName = makeAstNode<AST::UiQualifiedId>(driver->nodePool(), sym(3).sval);
  438. propertyName->identifierToken = loc(3);
  439. propertyName->next = 0;
  440. AST::UiObjectBinding *binding = makeAstNode<AST::UiObjectBinding> (driver->nodePool(),
  441. propertyName, sym(5).UiQualifiedId, sym(6).UiObjectInitializer);
  442. binding->colonToken = loc(4);
  443. node->binding = binding;
  444. sym(1).Node = node;
  445. } break;
  446. case 63: {
  447. sym(1).Node = makeAstNode<AST::UiSourceElement>(driver->nodePool(), sym(1).Node);
  448. } break;
  449. case 64: {
  450. sym(1).Node = makeAstNode<AST::UiSourceElement>(driver->nodePool(), sym(1).Node);
  451. } break;
  452. case 66: {
  453. QString s = QLatin1String(QDeclarativeJSGrammar::spell[T_PROPERTY]);
  454. sym(1).sval = driver->intern(s.constData(), s.length());
  455. break;
  456. }
  457. case 67: {
  458. QString s = QLatin1String(QDeclarativeJSGrammar::spell[T_SIGNAL]);
  459. sym(1).sval = driver->intern(s.constData(), s.length());
  460. break;
  461. }
  462. case 68: {
  463. QString s = QLatin1String(QDeclarativeJSGrammar::spell[T_READONLY]);
  464. sym(1).sval = driver->intern(s.constData(), s.length());
  465. break;
  466. }
  467. case 69: {
  468. QString s = QLatin1String(QDeclarativeJSGrammar::spell[T_ON]);
  469. sym(1).sval = driver->intern(s.constData(), s.length());
  470. break;
  471. }
  472. case 70: {
  473. AST::ThisExpression *node = makeAstNode<AST::ThisExpression> (driver->nodePool());
  474. node->thisToken = loc(1);
  475. sym(1).Node = node;
  476. } break;
  477. case 71: {
  478. AST::IdentifierExpression *node = makeAstNode<AST::IdentifierExpression> (driver->nodePool(), sym(1).sval);
  479. node->identifierToken = loc(1);
  480. sym(1).Node = node;
  481. } break;
  482. case 72: {
  483. AST::NullExpression *node = makeAstNode<AST::NullExpression> (driver->nodePool());
  484. node->nullToken = loc(1);
  485. sym(1).Node = node;
  486. } break;
  487. case 73: {
  488. AST::TrueLiteral *node = makeAstNode<AST::TrueLiteral> (driver->nodePool());
  489. node->trueToken = loc(1);
  490. sym(1).Node = node;
  491. } break;
  492. case 74: {
  493. AST::FalseLiteral *node = makeAstNode<AST::FalseLiteral> (driver->nodePool());
  494. node->falseToken = loc(1);
  495. sym(1).Node = node;
  496. } break;
  497. case 75: {
  498. AST::NumericLiteral *node = makeAstNode<AST::NumericLiteral> (driver->nodePool(), sym(1).dval);
  499. node->literalToken = loc(1);
  500. sym(1).Node = node;
  501. } break;
  502. case 76:
  503. case 77: {
  504. AST::StringLiteral *node = makeAstNode<AST::StringLiteral> (driver->nodePool(), sym(1).sval);
  505. node->literalToken = loc(1);
  506. sym(1).Node = node;
  507. } break;
  508. case 78: {
  509. bool rx = lexer->scanRegExp(Lexer::NoPrefix);
  510. if (!rx) {
  511. diagnostic_messages.append(DiagnosticMessage(DiagnosticMessage::Error, location(lexer), lexer->errorMessage()));
  512. return false; // ### remove me
  513. }
  514. loc(1).length = lexer->tokenLength();
  515. AST::RegExpLiteral *node = makeAstNode<AST::RegExpLiteral> (driver->nodePool(), lexer->pattern, lexer->flags);
  516. node->literalToken = loc(1);
  517. sym(1).Node = node;
  518. } break;
  519. case 79: {
  520. bool rx = lexer->scanRegExp(Lexer::EqualPrefix);
  521. if (!rx) {
  522. diagnostic_messages.append(DiagnosticMessage(DiagnosticMessage::Error, location(lexer), lexer->errorMessage()));
  523. return false;
  524. }
  525. loc(1).length = lexer->tokenLength();
  526. AST::RegExpLiteral *node = makeAstNode<AST::RegExpLiteral> (driver->nodePool(), lexer->pattern, lexer->flags);
  527. node->literalToken = loc(1);
  528. sym(1).Node = node;
  529. } break;
  530. case 80: {
  531. AST::ArrayLiteral *node = makeAstNode<AST::ArrayLiteral> (driver->nodePool(), (AST::Elision *) 0);
  532. node->lbracketToken = loc(1);
  533. node->rbracketToken = loc(2);
  534. sym(1).Node = node;
  535. } break;
  536. case 81: {
  537. AST::ArrayLiteral *node = makeAstNode<AST::ArrayLiteral> (driver->nodePool(), sym(2).Elision->finish());
  538. node->lbracketToken = loc(1);
  539. node->rbracketToken = loc(3);
  540. sym(1).Node = node;
  541. } break;
  542. case 82: {
  543. AST::ArrayLiteral *node = makeAstNode<AST::ArrayLiteral> (driver->nodePool(), sym(2).ElementList->finish ());
  544. node->lbracketToken = loc(1);
  545. node->rbracketToken = loc(3);
  546. sym(1).Node = node;
  547. } break;
  548. case 83: {
  549. AST::ArrayLiteral *node = makeAstNode<AST::ArrayLiteral> (driver->nodePool(), sym(2).ElementList->finish (),
  550. (AST::Elision *) 0);
  551. node->lbracketToken = loc(1);
  552. node->commaToken = loc(3);
  553. node->rbracketToken = loc(4);
  554. sym(1).Node = node;
  555. } break;
  556. case 84: {
  557. AST::ArrayLiteral *node = makeAstNode<AST::ArrayLiteral> (driver->nodePool(), sym(2).ElementList->finish (),
  558. sym(4).Elision->finish());
  559. node->lbracketToken = loc(1);
  560. node->commaToken = loc(3);
  561. node->rbracketToken = loc(5);
  562. sym(1).Node = node;
  563. } break;
  564. case 85: {
  565. AST::ObjectLiteral *node = 0;
  566. if (sym(2).Node)
  567. node = makeAstNode<AST::ObjectLiteral> (driver->nodePool(),
  568. sym(2).PropertyNameAndValueList->finish ());
  569. else
  570. node = makeAstNode<AST::ObjectLiteral> (driver->nodePool());
  571. node->lbraceToken = loc(1);
  572. node->rbraceToken = loc(3);
  573. sym(1).Node = node;
  574. } break;
  575. case 86: {
  576. AST::ObjectLiteral *node = makeAstNode<AST::ObjectLiteral> (driver->nodePool(),
  577. sym(2).PropertyNameAndValueList->finish ());
  578. node->lbraceToken = loc(1);
  579. node->rbraceToken = loc(4);
  580. sym(1).Node = node;
  581. } break;
  582. case 87: {
  583. AST::NestedExpression *node = makeAstNode<AST::NestedExpression>(driver->nodePool(), sym(2).Expression);
  584. node->lparenToken = loc(1);
  585. node->rparenToken = loc(3);
  586. sym(1).Node = node;
  587. } break;
  588. case 88: {
  589. if (AST::ArrayMemberExpression *mem = AST::cast<AST::ArrayMemberExpression *>(sym(1).Expression)) {
  590. diagnostic_messages.append(DiagnosticMessage(DiagnosticMessage::Warning, mem->lbracketToken,
  591. QLatin1String("Ignored annotation")));
  592. sym(1).Expression = mem->base;
  593. }
  594. if (AST::UiQualifiedId *qualifiedId = reparseAsQualifiedId(sym(1).Expression)) {
  595. sym(1).UiQualifiedId = qualifiedId;
  596. } else {
  597. sym(1).UiQualifiedId = 0;
  598. diagnostic_messages.append(DiagnosticMessage(DiagnosticMessage::Error, loc(1),
  599. QLatin1String("Expected a qualified name id")));
  600. return false; // ### recover
  601. }
  602. } break;
  603. case 89: {
  604. sym(1).Node = makeAstNode<AST::ElementList> (driver->nodePool(), (AST::Elision *) 0, sym(1).Expression);
  605. } break;
  606. case 90: {
  607. sym(1).Node = makeAstNode<AST::ElementList> (driver->nodePool(), sym(1).Elision->finish(), sym(2).Expression);
  608. } break;
  609. case 91: {
  610. AST::ElementList *node = makeAstNode<AST::ElementList> (driver->nodePool(), sym(1).ElementList,
  611. (AST::Elision *) 0, sym(3).Expression);
  612. node->commaToken = loc(2);
  613. sym(1).Node = node;
  614. } break;
  615. case 92: {
  616. AST::ElementList *node = makeAstNode<AST::ElementList> (driver->nodePool(), sym(1).ElementList, sym(3).Elision->finish(),
  617. sym(4).Expression);
  618. node->commaToken = loc(2);
  619. sym(1).Node = node;
  620. } break;
  621. case 93: {
  622. AST::Elision *node = makeAstNode<AST::Elision> (driver->nodePool());
  623. node->commaToken = loc(1);
  624. sym(1).Node = node;
  625. } break;
  626. case 94: {
  627. AST::Elision *node = makeAstNode<AST::Elision> (driver->nodePool(), sym(1).Elision);
  628. node->commaToken = loc(2);
  629. sym(1).Node = node;
  630. } break;
  631. case 95: {
  632. AST::PropertyNameAndValueList *node = makeAstNode<AST::PropertyNameAndValueList> (driver->nodePool(),
  633. sym(1).PropertyName, sym(3).Expression);
  634. node->colonToken = loc(2);
  635. sym(1).Node = node;
  636. } break;
  637. case 96: {
  638. AST::PropertyNameAndValueList *node = makeAstNode<AST::PropertyNameAndValueList> (driver->nodePool(),
  639. sym(1).PropertyNameAndValueList, sym(3).PropertyName, sym(5).Expression);
  640. node->commaToken = loc(2);
  641. node->colonToken = loc(4);
  642. sym(1).Node = node;
  643. } break;
  644. case 97: {
  645. AST::IdentifierPropertyName *node = makeAstNode<AST::IdentifierPropertyName> (driver->nodePool(), sym(1).sval);
  646. node->propertyNameToken = loc(1);
  647. sym(1).Node = node;
  648. } break;
  649. case 98:
  650. case 99: {
  651. AST::IdentifierPropertyName *node = makeAstNode<AST::IdentifierPropertyName> (driver->nodePool(), driver->intern(lexer->characterBuffer(), lexer->characterCount()));
  652. node->propertyNameToken = loc(1);
  653. sym(1).Node = node;
  654. } break;
  655. case 100: {
  656. AST::StringLiteralPropertyName *node = makeAstNode<AST::StringLiteralPropertyName> (driver->nodePool(), sym(1).sval);
  657. node->propertyNameToken = loc(1);
  658. sym(1).Node = node;
  659. } break;
  660. case 101: {
  661. AST::NumericLiteralPropertyName *node = makeAstNode<AST::NumericLiteralPropertyName> (driver->nodePool(), sym(1).dval);
  662. node->propertyNameToken = loc(1);
  663. sym(1).Node = node;
  664. } break;
  665. case 102: {
  666. AST::IdentifierPropertyName *node = makeAstNode<AST::IdentifierPropertyName> (driver->nodePool(), sym(1).sval);
  667. node->propertyNameToken = loc(1);
  668. sym(1).Node = node;
  669. } break;
  670. case 103:
  671. case 104:
  672. case 105:
  673. case 106:
  674. case 107:
  675. case 108:
  676. case 109:
  677. case 110:
  678. case 111:
  679. case 112:
  680. case 113:
  681. case 114:
  682. case 115:
  683. case 116:
  684. case 117:
  685. case 118:
  686. case 119:
  687. case 120:
  688. case 121:
  689. case 122:
  690. case 123:
  691. case 124:
  692. case 125:
  693. case 126:
  694. case 127:
  695. case 128:
  696. case 129:
  697. case 130:
  698. case 131:
  699. case 132:
  700. case 133:
  701. {
  702. sym(1).sval = driver->intern(lexer->characterBuffer(), lexer->characterCount());
  703. } break;
  704. case 138: {
  705. AST::ArrayMemberExpression *node = makeAstNode<AST::ArrayMemberExpression> (driver->nodePool(), sym(1).Expression, sym(3).Expression);
  706. node->lbracketToken = loc(2);
  707. node->rbracketToken = loc(4);
  708. sym(1).Node = node;
  709. } break;
  710. case 139: {
  711. AST::FieldMemberExpression *node = makeAstNode<AST::FieldMemberExpression> (driver->nodePool(), sym(1).Expression, sym(3).sval);
  712. node->dotToken = loc(2);
  713. node->identifierToken = loc(3);
  714. sym(1).Node = node;
  715. } break;
  716. case 140: {
  717. AST::NewMemberExpression *node = makeAstNode<AST::NewMemberExpression> (driver->nodePool(), sym(2).Expression, sym(4).ArgumentList);
  718. node->newToken = loc(1);
  719. node->lparenToken = loc(3);
  720. node->rparenToken = loc(5);
  721. sym(1).Node = node;
  722. } break;
  723. case 142: {
  724. AST::NewExpression *node = makeAstNode<AST::NewExpression> (driver->nodePool(), sym(2).Expression);
  725. node->newToken = loc(1);
  726. sym(1).Node = node;
  727. } break;
  728. case 143: {
  729. AST::CallExpression *node = makeAstNode<AST::CallExpression> (driver->nodePool(), sym(1).Expression, sym(3).ArgumentList);
  730. node->lparenToken = loc(2);
  731. node->rparenToken = loc(4);
  732. sym(1).Node = node;
  733. } break;
  734. case 144: {
  735. AST::CallExpression *node = makeAstNode<AST::CallExpression> (driver->nodePool(), sym(1).Expression, sym(3).ArgumentList);
  736. node->lparenToken = loc(2);
  737. node->rparenToken = loc(4);
  738. sym(1).Node = node;
  739. } break;
  740. case 145: {
  741. AST::ArrayMemberExpression *node = makeAstNode<AST::ArrayMemberExpression> (driver->nodePool(), sym(1).Expression, sym(3).Expression);
  742. node->lbracketToken = loc(2);
  743. node->rbracketToken = loc(4);
  744. sym(1).Node = node;
  745. } break;
  746. case 146: {
  747. AST::FieldMemberExpression *node = makeAstNode<AST::FieldMemberExpression> (driver->nodePool(), sym(1).Expression, sym(3).sval);
  748. node->dotToken = loc(2);
  749. node->identifierToken = loc(3);
  750. sym(1).Node = node;
  751. } break;
  752. case 147: {
  753. sym(1).Node = 0;
  754. } break;
  755. case 148: {
  756. sym(1).Node = sym(1).ArgumentList->finish();
  757. } break;
  758. case 149: {
  759. sym(1).Node = makeAstNode<AST::ArgumentList> (driver->nodePool(), sym(1).Expression);
  760. } break;
  761. case 150: {
  762. AST::ArgumentList *node = makeAstNode<AST::ArgumentList> (driver->nodePool(), sym(1).ArgumentList, sym(3).Expression);
  763. node->commaToken = loc(2);
  764. sym(1).Node = node;
  765. } break;
  766. case 154: {
  767. AST::PostIncrementExpression *node = makeAstNode<AST::PostIncrementExpression> (driver->nodePool(), sym(1).Expression);
  768. node->incrementToken = loc(2);
  769. sym(1).Node = node;
  770. } break;
  771. case 155: {
  772. AST::PostDecrementExpression *node = makeAstNode<AST::PostDecrementExpression> (driver->nodePool(), sym(1).Expression);
  773. node->decrementToken = loc(2);
  774. sym(1).Node = node;
  775. } break;
  776. case 157: {
  777. AST::DeleteExpression *node = makeAstNode<AST::DeleteExpression> (driver->nodePool(), sym(2).Expression);
  778. node->deleteToken = loc(1);
  779. sym(1).Node = node;
  780. } break;
  781. case 158: {
  782. AST::VoidExpression *node = makeAstNode<AST::VoidExpression> (driver->nodePool(), sym(2).Expression);
  783. node->voidToken = loc(1);
  784. sym(1).Node = node;
  785. } break;
  786. case 159: {
  787. AST::TypeOfExpression *node = makeAstNode<AST::TypeOfExpression> (driver->nodePool(), sym(2).Expression);
  788. node->typeofToken = loc(1);
  789. sym(1).Node = node;
  790. } break;
  791. case 160: {
  792. AST::PreIncrementExpression *node = makeAstNode<AST::PreIncrementExpression> (driver->nodePool(), sym(2).Expression);
  793. node->incrementToken = loc(1);
  794. sym(1).Node = node;
  795. } break;
  796. case 161: {
  797. AST::PreDecrementExpression *node = makeAstNode<AST::PreDecrementExpression> (driver->nodePool(), sym(2).Expression);
  798. node->decrementToken = loc(1);
  799. sym(1).Node = node;
  800. } break;
  801. case 162: {
  802. AST::UnaryPlusExpression *node = makeAstNode<AST::UnaryPlusExpression> (driver->nodePool(), sym(2).Expression);
  803. node->plusToken = loc(1);
  804. sym(1).Node = node;
  805. } break;
  806. case 163: {
  807. AST::UnaryMinusExpression *node = makeAstNode<AST::UnaryMinusExpression> (driver->nodePool(), sym(2).Expression);
  808. node->minusToken = loc(1);
  809. sym(1).Node = node;
  810. } break;
  811. case 164: {
  812. AST::TildeExpression *node = makeAstNode<AST::TildeExpression> (driver->nodePool(), sym(2).Expression);
  813. node->tildeToken = loc(1);
  814. sym(1).Node = node;
  815. } break;
  816. case 165: {
  817. AST::NotExpression *node = makeAstNode<AST::NotExpression> (driver->nodePool(), sym(2).Expression);
  818. node->notToken = loc(1);
  819. sym(1).Node = node;
  820. } break;
  821. case 167: {
  822. AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
  823. QSOperator::Mul, sym(3).Expression);
  824. node->operatorToken = loc(2);
  825. sym(1).Node = node;
  826. } break;
  827. case 168: {
  828. AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
  829. QSOperator::Div, sym(3).Expression);
  830. node->operatorToken = loc(2);
  831. sym(1).Node = node;
  832. } break;
  833. case 169: {
  834. AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
  835. QSOperator::Mod, sym(3).Expression);
  836. node->operatorToken = loc(2);
  837. sym(1).Node = node;
  838. } break;
  839. case 171: {
  840. AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
  841. QSOperator::Add, sym(3).Expression);
  842. node->operatorToken = loc(2);
  843. sym(1).Node = node;
  844. } break;
  845. case 172: {
  846. AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
  847. QSOperator::Sub, sym(3).Expression);
  848. node->operatorToken = loc(2);
  849. sym(1).Node = node;
  850. } break;
  851. case 174: {
  852. AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
  853. QSOperator::LShift, sym(3).Expression);
  854. node->operatorToken = loc(2);
  855. sym(1).Node = node;
  856. } break;
  857. case 175: {
  858. AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
  859. QSOperator::RShift, sym(3).Expression);
  860. node->operatorToken = loc(2);
  861. sym(1).Node = node;
  862. } break;
  863. case 176: {
  864. AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
  865. QSOperator::URShift, sym(3).Expression);
  866. node->operatorToken = loc(2);
  867. sym(1).Node = node;
  868. } break;
  869. case 178: {
  870. AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
  871. QSOperator::Lt, sym(3).Expression);
  872. node->operatorToken = loc(2);
  873. sym(1).Node = node;
  874. } break;
  875. case 179: {
  876. AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
  877. QSOperator::Gt, sym(3).Expression);
  878. node->operatorToken = loc(2);
  879. sym(1).Node = node;
  880. } break;
  881. case 180: {
  882. AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
  883. QSOperator::Le, sym(3).Expression);
  884. node->operatorToken = loc(2);
  885. sym(1).Node = node;
  886. } break;
  887. case 181: {
  888. AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
  889. QSOperator::Ge, sym(3).Expression);
  890. node->operatorToken = loc(2);
  891. sym(1).Node = node;
  892. } break;
  893. case 182: {
  894. AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
  895. QSOperator::InstanceOf, sym(3).Expression);
  896. node->operatorToken = loc(2);
  897. sym(1).Node = node;
  898. } break;
  899. case 183: {
  900. AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
  901. QSOperator::In, sym(3).Expression);
  902. node->operatorToken = loc(2);
  903. sym(1).Node = node;
  904. } break;
  905. case 185: {
  906. AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
  907. QSOperator::Lt, sym(3).Expression);
  908. node->operatorToken = loc(2);
  909. sym(1).Node = node;
  910. } break;
  911. case 186: {
  912. AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
  913. QSOperator::Gt, sym(3).Expression);
  914. node->operatorToken = loc(2);
  915. sym(1).Node = node;
  916. } break;
  917. case 187: {
  918. AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
  919. QSOperator::Le, sym(3).Expression);
  920. node->operatorToken = loc(2);
  921. sym(1).Node = node;
  922. } break;
  923. case 188: {
  924. AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
  925. QSOperator::Ge, sym(3).Expression);
  926. node->operatorToken = loc(2);
  927. sym(1).Node = node;
  928. } break;
  929. case 189: {
  930. AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
  931. QSOperator::InstanceOf, sym(3).Expression);
  932. node->operatorToken = loc(2);
  933. sym(1).Node = node;
  934. } break;
  935. case 191: {
  936. AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
  937. QSOperator::Equal, sym(3).Expression);
  938. node->operatorToken = loc(2);
  939. sym(1).Node = node;
  940. } break;
  941. case 192: {
  942. AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
  943. QSOperator::NotEqual, sym(3).Expression);
  944. node->operatorToken = loc(2);
  945. sym(1).Node = node;
  946. } break;
  947. case 193: {
  948. AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
  949. QSOperator::StrictEqual, sym(3).Expression);
  950. node->operatorToken = loc(2);
  951. sym(1).Node = node;
  952. } break;
  953. case 194: {
  954. AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
  955. QSOperator::StrictNotEqual, sym(3).Expression);
  956. node->operatorToken = loc(2);
  957. sym(1).Node = node;
  958. } break;
  959. case 196: {
  960. AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
  961. QSOperator::Equal, sym(3).Expression);
  962. node->operatorToken = loc(2);
  963. sym(1).Node = node;
  964. } break;
  965. case 197: {
  966. AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
  967. QSOperator::NotEqual, sym(3).Expression);
  968. node->operatorToken = loc(2);
  969. sym(1).Node = node;
  970. } break;
  971. case 198: {
  972. AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
  973. QSOperator::StrictEqual, sym(3).Expression);
  974. node->operatorToken = loc(2);
  975. sym(1).Node = node;
  976. } break;
  977. case 199: {
  978. AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
  979. QSOperator::StrictNotEqual, sym(3).Expression);
  980. node->operatorToken = loc(2);
  981. sym(1).Node = node;
  982. } break;
  983. case 201: {
  984. AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
  985. QSOperator::BitAnd, sym(3).Expression);
  986. node->operatorToken = loc(2);
  987. sym(1).Node = node;
  988. } break;
  989. case 203: {
  990. AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
  991. QSOperator::BitAnd, sym(3).Expression);
  992. node->operatorToken = loc(2);
  993. sym(1).Node = node;
  994. } break;
  995. case 205: {
  996. AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
  997. QSOperator::BitXor, sym(3).Expression);
  998. node->operatorToken = loc(2);
  999. sym(1).Node = node;
  1000. } break;
  1001. case 207: {
  1002. AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
  1003. QSOperator::BitXor, sym(3).Expression);
  1004. node->operatorToken = loc(2);
  1005. sym(1).Node = node;
  1006. } break;
  1007. case 209: {
  1008. AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
  1009. QSOperator::BitOr, sym(3).Expression);
  1010. node->operatorToken = loc(2);
  1011. sym(1).Node = node;
  1012. } break;
  1013. case 211: {
  1014. AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
  1015. QSOperator::BitOr, sym(3).Expression);
  1016. node->operatorToken = loc(2);
  1017. sym(1).Node = node;
  1018. } break;
  1019. case 213: {
  1020. AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
  1021. QSOperator::And, sym(3).Expression);
  1022. node->operatorToken = loc(2);
  1023. sym(1).Node = node;
  1024. } break;
  1025. case 215: {
  1026. AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
  1027. QSOperator::And, sym(3).Expression);
  1028. node->operatorToken = loc(2);
  1029. sym(1).Node = node;
  1030. } break;
  1031. case 217: {
  1032. AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
  1033. QSOperator::Or, sym(3).Expression);
  1034. node->operatorToken = loc(2);
  1035. sym(1).Node = node;
  1036. } break;
  1037. case 219: {
  1038. AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
  1039. QSOperator::Or, sym(3).Expression);
  1040. node->operatorToken = loc(2);
  1041. sym(1).Node = node;
  1042. } break;
  1043. case 221: {
  1044. AST::ConditionalExpression *node = makeAstNode<AST::ConditionalExpression> (driver->nodePool(), sym(1).Expression,
  1045. sym(3).Expression, sym(5).Expression);
  1046. node->questionToken = loc(2);
  1047. node->colonToken = loc(4);
  1048. sym(1).Node = node;
  1049. } break;
  1050. case 223: {
  1051. AST::ConditionalExpression *node = makeAstNode<AST::ConditionalExpression> (driver->nodePool(), sym(1).Expression,
  1052. sym(3).Expression, sym(5).Expression);
  1053. node->questionToken = loc(2);
  1054. node->colonToken = loc(4);
  1055. sym(1).Node = node;
  1056. } break;
  1057. case 225: {
  1058. AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
  1059. sym(2).ival, sym(3).Expression);
  1060. node->operatorToken = loc(2);
  1061. sym(1).Node = node;
  1062. } break;
  1063. case 227: {
  1064. AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
  1065. sym(2).ival, sym(3).Expression);
  1066. node->operatorToken = loc(2);
  1067. sym(1).Node = node;
  1068. } break;
  1069. case 228: {
  1070. sym(1).ival = QSOperator::Assign;
  1071. } break;
  1072. case 229: {
  1073. sym(1).ival = QSOperator::InplaceMul;
  1074. } break;
  1075. case 230: {
  1076. sym(1).ival = QSOperator::InplaceDiv;
  1077. } break;
  1078. case 231: {
  1079. sym(1).ival = QSOperator::InplaceMod;
  1080. } break;
  1081. case 232: {
  1082. sym(1).ival = QSOperator::InplaceAdd;
  1083. } break;
  1084. case 233: {
  1085. sym(1).ival = QSOperator::InplaceSub;
  1086. } break;
  1087. case 234: {
  1088. sym(1).ival = QSOperator::InplaceLeftShift;
  1089. } break;
  1090. case 235: {
  1091. sym(1).ival = QSOperator::InplaceRightShift;
  1092. } break;
  1093. case 236: {
  1094. sym(1).ival = QSOperator::InplaceURightShift;
  1095. } break;
  1096. case 237: {
  1097. sym(1).ival = QSOperator::InplaceAnd;
  1098. } break;
  1099. case 238: {
  1100. sym(1).ival = QSOperator::InplaceXor;
  1101. } break;
  1102. case 239: {
  1103. sym(1).ival = QSOperator::InplaceOr;
  1104. } break;
  1105. case 241: {
  1106. AST::Expression *node = makeAstNode<AST::Expression> (driver->nodePool(), sym(1).Expression, sym(3).Expression);
  1107. node->commaToken = loc(2);
  1108. sym(1).Node = node;
  1109. } break;
  1110. case 242: {
  1111. sym(1).Node = 0;
  1112. } break;
  1113. case 245: {
  1114. AST::Expression *node = makeAstNode<AST::Expression> (driver->nodePool(), sym(1).Expression, sym(3).Expression);
  1115. node->commaToken = loc(2);
  1116. sym(1).Node = node;
  1117. } break;
  1118. case 246: {
  1119. sym(1).Node = 0;
  1120. } break;
  1121. case 263: {
  1122. AST::Block *node = makeAstNode<AST::Block> (driver->nodePool(), sym(2).StatementList);
  1123. node->lbraceToken = loc(1);
  1124. node->rbraceToken = loc(3);
  1125. sym(1).Node = node;
  1126. } break;
  1127. case 264: {
  1128. sym(1).Node = makeAstNode<AST::StatementList> (driver->nodePool(), sym(1).Statement);
  1129. } break;
  1130. case 265: {
  1131. sym(1).Node = makeAstNode<AST::StatementList> (driver->nodePool(), sym(1).StatementList, sym(2).Statement);
  1132. } break;
  1133. case 266: {
  1134. sym(1).Node = 0;
  1135. } break;
  1136. case 267: {
  1137. sym(1).Node = sym(1).StatementList->finish ();
  1138. } break;
  1139. case 269: {
  1140. AST::VariableStatement *node = makeAstNode<AST::VariableStatement> (driver->nodePool(),
  1141. sym(2).VariableDeclarationList->finish (/*readOnly=*/sym(1).ival == T_CONST));
  1142. node->declarationKindToken = loc(1);
  1143. node->semicolonToken = loc(3);
  1144. sym(1).Node = node;
  1145. } break;
  1146. case 270: {
  1147. sym(1).ival = T_CONST;
  1148. } break;
  1149. case 271: {
  1150. sym(1).ival = T_VAR;
  1151. } break;
  1152. case 272: {
  1153. sym(1).Node = makeAstNode<AST::VariableDeclarationList> (driver->nodePool(), sym(1).VariableDeclaration);
  1154. } break;
  1155. case 273: {
  1156. AST::VariableDeclarationList *node = makeAstNode<AST::VariableDeclarationList> (driver->nodePool(),
  1157. sym(1).VariableDeclarationList, sym(3).VariableDeclaration);
  1158. node->commaToken = loc(2);
  1159. sym(1).Node = node;
  1160. } break;
  1161. case 274: {
  1162. sym(1).Node = makeAstNode<AST::VariableDeclarationList> (driver->nodePool(), sym(1).VariableDeclaration);
  1163. } break;
  1164. case 275: {
  1165. sym(1).Node = makeAstNode<AST::VariableDeclarationList> (driver->nodePool(), sym(1).VariableDeclarationList, sym(3).VariableDeclaration);
  1166. } break;
  1167. case 276: {
  1168. AST::VariableDeclaration *node = makeAstNode<AST::VariableDeclaration> (driver->nodePool(), sym(1).sval, sym(2).Expression);
  1169. node->identifierToken = loc(1);
  1170. sym(1).Node = node;
  1171. } break;
  1172. case 277: {
  1173. AST::VariableDeclaration *node = makeAstNode<AST::VariableDeclaration> (driver->nodePool(), sym(1).sval, sym(2).Expression);
  1174. node->identifierToken = loc(1);
  1175. sym(1).Node = node;
  1176. } break;
  1177. case 278: {
  1178. // ### TODO: AST for initializer
  1179. sym(1) = sym(2);
  1180. } break;
  1181. case 279: {
  1182. sym(1).Node = 0;
  1183. } break;
  1184. case 281: {
  1185. // ### TODO: AST for initializer
  1186. sym(1) = sym(2);
  1187. } break;
  1188. case 282: {
  1189. sym(1).Node = 0;
  1190. } break;
  1191. case 284: {
  1192. AST::EmptyStatement *node = makeAstNode<AST::EmptyStatement> (driver->nodePool());
  1193. node->semicolonToken = loc(1);
  1194. sym(1).Node = node;
  1195. } break;
  1196. case 286: {
  1197. AST::ExpressionStatement *node = makeAstNode<AST::ExpressionStatement> (driver->nodePool(), sym(1).Expression);
  1198. node->semicolonToken = loc(2);
  1199. sym(1).Node = node;
  1200. } break;
  1201. case 287: {
  1202. AST::IfStatement *node = makeAstNode<AST::IfStatement> (driver->nodePool(), sym(3).Expression, sym(5).Statement, sym(7).Statement);
  1203. node->ifToken = loc(1);
  1204. node->lparenToken = loc(2);
  1205. node->rparenToken = loc(4);
  1206. node->elseToken = loc(5);
  1207. sym(1).Node = node;
  1208. } break;
  1209. case 288: {
  1210. AST::IfStatement *node = makeAstNode<AST::IfStatement> (driver->nodePool(), sym(3).Expression, sym(5).Statement);
  1211. node->ifToken = loc(1);
  1212. node->lparenToken = loc(2);
  1213. node->rparenToken = loc(4);
  1214. sym(1).Node = node;
  1215. } break;
  1216. case 290: {
  1217. AST::DoWhileStatement *node = makeAstNode<AST::DoWhileStatement> (driver->nodePool(), sym(2).Statement, sym(5).Expression);
  1218. node->doToken = loc(1);
  1219. node->whileToken = loc(3);
  1220. node->lparenToken = loc(4);
  1221. node->rparenToken = loc(6);
  1222. node->semicolonToken = loc(7);
  1223. sym(1).Node = node;
  1224. } break;
  1225. case 291: {
  1226. AST::WhileStatement *node = makeAstNode<AST::WhileStatement> (driver->nodePool(), sym(3).Expression, sym(5).Statement);
  1227. node->whileToken = loc(1);
  1228. node->lparenToken = loc(2);
  1229. node->rparenToken = loc(4);
  1230. sym(1).Node = node;
  1231. } break;
  1232. case 292: {
  1233. AST::ForStatement *node = makeAstNode<AST::ForStatement> (driver->nodePool(), sym(3).Expression,
  1234. sym(5).Expression, sym(7).Expression, sym(9).Statement);
  1235. node->forToken = loc(1);
  1236. node->lparenToken = loc(2);
  1237. node->firstSemicolonToken = loc(4);
  1238. node->secondSemicolonToken = loc(6);
  1239. node->rparenToken = loc(8);
  1240. sym(1).Node = node;
  1241. } break;
  1242. case 293: {
  1243. AST::LocalForStatement *node = makeAstNode<AST::LocalForStatement> (driver->nodePool(),
  1244. sym(4).VariableDeclarationList->finish (/*readOnly=*/false), sym(6).Expression,
  1245. sym(8).Expression, sym(10).Statement);
  1246. node->forToken = loc(1);
  1247. node->lparenToken = loc(2);
  1248. node->varToken = loc(3);
  1249. node->firstSemicolonToken = loc(5);
  1250. node->secondSemicolonToken = loc(7);
  1251. node->rparenToken = loc(9);
  1252. sym(1).Node = node;
  1253. } break;
  1254. case 294: {
  1255. AST:: ForEachStatement *node = makeAstNode<AST::ForEachStatement> (driver->nodePool(), sym(3).Expression,
  1256. sym(5).Expression, sym(7).Statement);
  1257. node->forToken = loc(1);
  1258. node->lparenToken = loc(2);
  1259. node->inToken = loc(4);
  1260. node->rparenToken = loc(6);
  1261. sym(1).Node = node;
  1262. } break;
  1263. case 295: {
  1264. AST::LocalForEachStatement *node = makeAstNode<AST::LocalForEachStatement> (driver->nodePool(),
  1265. sym(4).VariableDeclaration, sym(6).Expression, sym(8).Statement);
  1266. node->forToken = loc(1);
  1267. node->lparenToken = loc(2);
  1268. node->varToken = loc(3);
  1269. node->inToken = loc(5);
  1270. node->rparenToken = loc(7);
  1271. sym(1).Node = node;
  1272. } break;
  1273. case 297: {
  1274. AST::ContinueStatement *node = makeAstNode<AST::ContinueStatement> (driver->nodePool());
  1275. node->continueToken = loc(1);
  1276. node->semicolonToken = loc(2);
  1277. sym(1).Node = node;
  1278. } break;
  1279. case 299: {
  1280. AST::ContinueStatement *node = makeAstNode<AST::ContinueStatement> (driver->nodePool(), sym(2).sval);
  1281. node->continueToken = loc(1);
  1282. node->identifierToken = loc(2);
  1283. node->semicolonToken = loc(3);
  1284. sym(1).Node = node;
  1285. } break;
  1286. case 301: {
  1287. AST::BreakStatement *node = makeAstNode<AST::BreakStatement> (driver->nodePool());
  1288. node->breakToken = loc(1);
  1289. node->semicolonToken = loc(2);
  1290. sym(1).Node = node;
  1291. } break;
  1292. case 303: {
  1293. AST::BreakStatement *node = makeAstNode<AST::BreakStatement> (driver->nodePool(), sym(2).sval);
  1294. node->breakToken = loc(1);
  1295. node->identifierToken = loc(2);
  1296. node->semicolonToken = loc(3);
  1297. sym(1).Node = node;
  1298. } break;
  1299. case 305: {
  1300. AST::ReturnStatement *node = makeAstNode<AST::ReturnStatement> (driver->nodePool(), sym(2).Expression);
  1301. node->returnToken = loc(1);
  1302. node->semicolonToken = loc(3);
  1303. sym(1).Node = node;
  1304. } break;
  1305. case 306: {
  1306. AST::WithStatement *node = makeAstNode<AST::WithStatement> (driver->nodePool(), sym(3).Expression, sym(5).Statement);
  1307. node->withToken = loc(1);
  1308. node->lparenToken = loc(2);
  1309. node->rparenToken = loc(4);
  1310. sym(1).Node = node;
  1311. } break;
  1312. case 307: {
  1313. AST::SwitchStatement *node = makeAstNode<AST::SwitchStatement> (driver->nodePool(), sym(3).Expression, sym(5).CaseBlock);
  1314. node->switchToken = loc(1);
  1315. node->lparenToken = loc(2);
  1316. node->rparenToken = loc(4);
  1317. sym(1).Node = node;
  1318. } break;
  1319. case 308: {
  1320. AST::CaseBlock *node = makeAstNode<AST::CaseBlock> (driver->nodePool(), sym(2).CaseClauses);
  1321. node->lbraceToken = loc(1);
  1322. node->rbraceToken = loc(3);
  1323. sym(1).Node = node;
  1324. } break;
  1325. case 309: {
  1326. AST::CaseBlock *node = makeAstNode<AST::CaseBlock> (driver->nodePool(), sym(2).CaseClauses, sym(3).DefaultClause, sym(4).CaseClauses);
  1327. node->lbraceToken = loc(1);
  1328. node->rbraceToken = loc(5);
  1329. sym(1).Node = node;
  1330. } break;
  1331. case 310: {
  1332. sym(1).Node = makeAstNode<AST::CaseClauses> (driver->nodePool(), sym(1).CaseClause);
  1333. } break;
  1334. case 311: {
  1335. sym(1).Node = makeAstNode<AST::CaseClauses> (driver->nodePool(), sym(1).CaseClauses, sym(2).CaseClause);
  1336. } break;
  1337. case 312: {
  1338. sym(1).Node = 0;
  1339. } break;
  1340. case 313: {
  1341. sym(1).Node = sym(1).CaseClauses->finish ();
  1342. } break;
  1343. case 314: {
  1344. AST::CaseClause *node = makeAstNode<AST::CaseClause> (driver->nodePool(), sym(2).Expression, sym(4).StatementList);
  1345. node->caseToken = loc(1);
  1346. node->colonToken = loc(3);
  1347. sym(1).Node = node;
  1348. } break;
  1349. case 315: {
  1350. AST::DefaultClause *node = makeAstNode<AST::DefaultClause> (driver->nodePool(), sym(3).StatementList);
  1351. node->defaultToken = loc(1);
  1352. node->colonToken = loc(2);
  1353. sym(1).Node = node;
  1354. } break;
  1355. case 316:
  1356. case 317: {
  1357. AST::LabelledStatement *node = makeAstNode<AST::LabelledStatement> (driver->nodePool(), driver->intern(lexer->characterBuffer(), lexer->characterCount()), sym(3).Statement);
  1358. node->identifierToken = loc(1);
  1359. node->colonToken = loc(2);
  1360. sym(1).Node = node;
  1361. } break;
  1362. case 318: {
  1363. AST::LabelledStatement *node = makeAstNode<AST::LabelledStatement> (driver->nodePool(), sym(1).sval, sym(3).Statement);
  1364. node->identifierToken = loc(1);
  1365. node->colonToken = loc(2);
  1366. sym(1).Node = node;
  1367. } break;
  1368. case 320: {
  1369. AST::ThrowStatement *node = makeAstNode<AST::ThrowStatement> (driver->nodePool(), sym(2).Expression);
  1370. node->throwToken = loc(1);
  1371. node->semicolonToken = loc(3);
  1372. sym(1).Node = node;
  1373. } break;
  1374. case 321: {
  1375. AST::TryStatement *node = makeAstNode<AST::TryStatement> (driver->nodePool(), sym(2).Statement, sym(3).Catch);
  1376. node->tryToken = loc(1);
  1377. sym(1).Node = node;
  1378. } break;
  1379. case 322: {
  1380. AST::TryStatement *node = makeAstNode<AST::TryStatement> (driver->nodePool(), sym(2).Statement, sym(3).Finally);
  1381. node->tryToken = loc(1);
  1382. sym(1).Node = node;
  1383. } break;
  1384. case 323: {
  1385. AST::TryStatement *node = makeAstNode<AST::TryStatement> (driver->nodePool(), sym(2).Statement, sym(3).Catch, sym(4).Finally);
  1386. node->tryToken = loc(1);
  1387. sym(1).Node = node;
  1388. } break;
  1389. case 324: {
  1390. AST::Catch *node = makeAstNode<AST::Catch> (driver->nodePool(), sym(3).sval, sym(5).Block);
  1391. node->catchToken = loc(1);
  1392. node->lparenToken = loc(2);
  1393. node->identifierToken = loc(3);
  1394. node->rparenToken = loc(4);
  1395. sym(1).Node = node;
  1396. } break;
  1397. case 325: {
  1398. AST::Finally *node = makeAstNode<AST::Finally> (driver->nodePool(), sym(2).Block);
  1399. node->finallyToken = loc(1);
  1400. sym(1).Node = node;
  1401. } break;
  1402. case 327: {
  1403. AST::DebuggerStatement *node = makeAstNode<AST::DebuggerStatement> (driver->nodePool());
  1404. node->debuggerToken = loc(1);
  1405. node->semicolonToken = loc(2);
  1406. sym(1).Node = node;
  1407. } break;
  1408. case 328: {
  1409. AST::FunctionDeclaration *node = makeAstNode<AST::FunctionDeclaration> (driver->nodePool(), sym(2).sval, sym(4).FormalParameterList, sym(7).FunctionBody);
  1410. node->functionToken = loc(1);
  1411. node->identifierToken = loc(2);
  1412. node->lparenToken = loc(3);
  1413. node->rparenToken = loc(5);
  1414. node->lbraceToken = loc(6);
  1415. node->rbraceToken = loc(8);
  1416. sym(1).Node = node;
  1417. } break;
  1418. case 329: {
  1419. AST::FunctionExpression *node = makeAstNode<AST::FunctionExpression> (driver->nodePool(), sym(2).sval, sym(4).FormalParameterList, sym(7).FunctionBody);
  1420. node->functionToken = loc(1);
  1421. if (sym(2).sval)
  1422. node->identifierToken = loc(2);
  1423. node->lparenToken = loc(3);
  1424. node->rparenToken = loc(5);
  1425. node->lbraceToken = loc(6);
  1426. node->rbraceToken = loc(8);
  1427. sym(1).Node = node;
  1428. } break;
  1429. case 330: {
  1430. AST::FormalParameterList *node = makeAstNode<AST::FormalParameterList> (driver->nodePool(), sym(1).sval);
  1431. node->identifierToken