1 /****************************************************************************
3 ** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
4 ** All rights reserved.
5 ** Contact: Nokia Corporation (qt-info@nokia.com)
7 ** This file is part of the QtDeclarative module of the Qt Toolkit.
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.
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.
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.
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.
40 ****************************************************************************/
42 #include <QtCore/QtDebug>
43 #include <QtWidgets/QApplication>
47 #include "qdeclarativejsengine_p.h"
48 #include "qdeclarativejslexer_p.h"
49 #include "qdeclarativejsast_p.h"
50 #include "qdeclarativejsnodepool_p.h"
54 #include "qdeclarativejsparser_p.h"
55 #include <QVarLengthArray>
58 // This file is automatically generated from qmljs.g.
59 // Changes will be lost.
62 using namespace QDeclarativeJS;
64 QT_QML_BEGIN_NAMESPACE
66 void Parser::reallocateStack()
73 sym_stack = reinterpret_cast<Value*> (qRealloc(sym_stack, stack_size * sizeof(Value)));
74 state_stack = reinterpret_cast<int*> (qRealloc(state_stack, stack_size * sizeof(int)));
75 location_stack = reinterpret_cast<AST::SourceLocation*> (qRealloc(location_stack, stack_size * sizeof(AST::SourceLocation)));
78 inline static bool automatic(Engine *driver, int token)
80 return token == QDeclarativeJSGrammar::T_RBRACE
82 || driver->lexer()->prevTerminator();
86 Parser::Parser(Engine *engine):
103 qFree(location_stack);
107 static inline AST::SourceLocation location(Lexer *lexer)
109 AST::SourceLocation loc;
110 loc.offset = lexer->tokenOffset();
111 loc.length = lexer->tokenLength();
112 loc.startLine = lexer->startLineNo();
113 loc.startColumn = lexer->startColumnNo();
117 AST::UiQualifiedId *Parser::reparseAsQualifiedId(AST::ExpressionNode *expr)
119 QVarLengthArray<NameId *, 4> nameIds;
120 QVarLengthArray<AST::SourceLocation, 4> locations;
122 AST::ExpressionNode *it = expr;
123 while (AST::FieldMemberExpression *m = AST::cast<AST::FieldMemberExpression *>(it)) {
124 nameIds.append(m->name);
125 locations.append(m->identifierToken);
129 if (AST::IdentifierExpression *idExpr = AST::cast<AST::IdentifierExpression *>(it)) {
130 AST::UiQualifiedId *q = makeAstNode<AST::UiQualifiedId>(driver->nodePool(), idExpr->name);
131 q->identifierToken = idExpr->identifierToken;
133 AST::UiQualifiedId *currentId = q;
134 for (int i = nameIds.size() - 1; i != -1; --i) {
135 currentId = makeAstNode<AST::UiQualifiedId>(driver->nodePool(), currentId, nameIds[i]);
136 currentId->identifierToken = locations[i];
139 return currentId->finish();
145 bool Parser::parse(int startToken)
147 Lexer *lexer = driver->lexer();
148 bool hadErrors = false;
152 token_buffer[0].token = startToken;
153 first_token = &token_buffer[0];
154 last_token = &token_buffer[1];
160 if (++tos == stack_size)
163 state_stack[tos] = action;
166 if (yytoken == -1 && -TERMINAL_COUNT != action_index[action]) {
169 if (first_token == last_token) {
170 yytoken = lexer->lex();
171 yylval = lexer->dval();
172 yylloc = location(lexer);
174 yytoken = first_token->token;
175 yylval = first_token->dval;
176 yylloc = first_token->loc;
181 action = t_action(action, yytoken);
183 if (action != ACCEPT_STATE) {
185 sym(1).dval = yylval;
191 } else if (action < 0) {
192 const int r = -action - 1;
198 sym(1).Node = sym(2).Node;
199 program = sym(1).Node;
203 sym(1).Node = sym(2).Node;
204 program = sym(1).Node;
208 sym(1).Node = sym(2).Node;
209 program = sym(1).Node;
213 sym(1).Node = sym(2).Node;
214 program = sym(1).Node;
218 sym(1).Node = sym(2).Node;
219 program = sym(1).Node;
223 sym(1).Node = sym(2).Node;
224 program = sym(1).Node;
228 sym(1).UiProgram = makeAstNode<AST::UiProgram> (driver->nodePool(), sym(1).UiImportList,
229 sym(2).UiObjectMemberList->finish());
233 sym(1).Node = sym(1).UiImportList->finish();
237 sym(1).Node = makeAstNode<AST::UiImportList> (driver->nodePool(), sym(1).UiImport);
241 sym(1).Node = makeAstNode<AST::UiImportList> (driver->nodePool(),
242 sym(1).UiImportList, sym(2).UiImport);
246 sym(1).UiImport->semicolonToken = loc(2);
250 sym(1).UiImport->versionToken = loc(2);
251 sym(1).UiImport->semicolonToken = loc(3);
255 sym(1).UiImport->versionToken = loc(2);
256 sym(1).UiImport->asToken = loc(3);
257 sym(1).UiImport->importIdToken = loc(4);
258 sym(1).UiImport->importId = sym(4).sval;
259 sym(1).UiImport->semicolonToken = loc(5);
263 sym(1).UiImport->asToken = loc(2);
264 sym(1).UiImport->importIdToken = loc(3);
265 sym(1).UiImport->importId = sym(3).sval;
266 sym(1).UiImport->semicolonToken = loc(4);
270 AST::UiImport *node = 0;
272 if (AST::StringLiteral *importIdLiteral = AST::cast<AST::StringLiteral *>(sym(2).Expression)) {
273 node = makeAstNode<AST::UiImport>(driver->nodePool(), importIdLiteral->value);
274 node->fileNameToken = loc(2);
275 } else if (AST::UiQualifiedId *qualifiedId = reparseAsQualifiedId(sym(2).Expression)) {
276 node = makeAstNode<AST::UiImport>(driver->nodePool(), qualifiedId);
277 node->fileNameToken = loc(2);
283 node->importToken = loc(1);
285 diagnostic_messages.append(DiagnosticMessage(DiagnosticMessage::Error, loc(1),
286 QLatin1String("Expected a qualified name id or a string literal")));
288 return false; // ### remove me
297 sym(1).Node = makeAstNode<AST::UiObjectMemberList> (driver->nodePool(), sym(1).UiObjectMember);
301 sym(1).Node = makeAstNode<AST::UiObjectMemberList> (driver->nodePool(), sym(1).UiObjectMember);
305 AST::UiObjectMemberList *node = makeAstNode<AST:: UiObjectMemberList> (driver->nodePool(),
306 sym(1).UiObjectMemberList, sym(2).UiObjectMember);
311 sym(1).Node = makeAstNode<AST::UiArrayMemberList> (driver->nodePool(), sym(1).UiObjectMember);
315 AST::UiArrayMemberList *node = makeAstNode<AST::UiArrayMemberList> (driver->nodePool(),
316 sym(1).UiArrayMemberList, sym(3).UiObjectMember);
317 node->commaToken = loc(2);
322 AST::UiObjectInitializer *node = makeAstNode<AST::UiObjectInitializer> (driver->nodePool(), (AST::UiObjectMemberList*)0);
323 node->lbraceToken = loc(1);
324 node->rbraceToken = loc(2);
329 AST::UiObjectInitializer *node = makeAstNode<AST::UiObjectInitializer> (driver->nodePool(), sym(2).UiObjectMemberList->finish());
330 node->lbraceToken = loc(1);
331 node->rbraceToken = loc(3);
336 AST::UiObjectDefinition *node = makeAstNode<AST::UiObjectDefinition> (driver->nodePool(), sym(1).UiQualifiedId,
337 sym(2).UiObjectInitializer);
342 AST::UiArrayBinding *node = makeAstNode<AST::UiArrayBinding> (driver->nodePool(),
343 sym(1).UiQualifiedId, sym(4).UiArrayMemberList->finish());
344 node->colonToken = loc(2);
345 node->lbracketToken = loc(3);
346 node->rbracketToken = loc(5);
351 AST::UiObjectBinding *node = makeAstNode<AST::UiObjectBinding> (driver->nodePool(),
352 sym(1).UiQualifiedId, sym(3).UiQualifiedId, sym(4).UiObjectInitializer);
353 node->colonToken = loc(2);
358 AST::UiObjectBinding *node = makeAstNode<AST::UiObjectBinding> (driver->nodePool(),
359 sym(3).UiQualifiedId, sym(1).UiQualifiedId, sym(4).UiObjectInitializer);
360 node->colonToken = loc(2);
361 node->hasOnToken = true;
367 AST::UiScriptBinding *node = makeAstNode<AST::UiScriptBinding> (driver->nodePool(),
368 sym(1).UiQualifiedId, sym(3).Statement);
369 node->colonToken = loc(2);
376 sym(1).sval = driver->intern(lexer->characterBuffer(), lexer->characterCount());
385 sym(1).Node = sym(1).UiParameterList->finish ();
389 AST::UiParameterList *node = makeAstNode<AST::UiParameterList> (driver->nodePool(), sym(1).sval, sym(2).sval);
390 node->identifierToken = loc(2);
395 AST::UiParameterList *node = makeAstNode<AST::UiParameterList> (driver->nodePool(), sym(1).UiParameterList, sym(3).sval, sym(4).sval);
396 node->commaToken = loc(2);
397 node->identifierToken = loc(4);
402 AST::UiPublicMember *node = makeAstNode<AST::UiPublicMember> (driver->nodePool(), (NameId *)0, sym(2).sval);
403 node->type = AST::UiPublicMember::Signal;
404 node->propertyToken = loc(1);
405 node->typeToken = loc(2);
406 node->identifierToken = loc(2);
407 node->parameters = sym(4).UiParameterList;
408 node->semicolonToken = loc(6);
413 AST::UiPublicMember *node = makeAstNode<AST::UiPublicMember> (driver->nodePool(), (NameId *)0, sym(2).sval);
414 node->type = AST::UiPublicMember::Signal;
415 node->propertyToken = loc(1);
416 node->typeToken = loc(2);
417 node->identifierToken = loc(2);
418 node->semicolonToken = loc(3);
423 AST::UiPublicMember *node = makeAstNode<AST::UiPublicMember> (driver->nodePool(), sym(4).sval, sym(6).sval);
424 node->typeModifier = sym(2).sval;
425 node->propertyToken = loc(1);
426 node->typeModifierToken = loc(2);
427 node->typeToken = loc(4);
428 node->identifierToken = loc(6);
429 node->semicolonToken = loc(7);
434 AST::UiPublicMember *node = makeAstNode<AST::UiPublicMember> (driver->nodePool(), sym(2).sval, sym(3).sval);
435 node->propertyToken = loc(1);
436 node->typeToken = loc(2);
437 node->identifierToken = loc(3);
438 node->semicolonToken = loc(4);
443 AST::UiPublicMember *node = makeAstNode<AST::UiPublicMember> (driver->nodePool(), sym(3).sval, sym(4).sval);
444 node->isDefaultMember = true;
445 node->defaultToken = loc(1);
446 node->propertyToken = loc(2);
447 node->typeToken = loc(3);
448 node->identifierToken = loc(4);
449 node->semicolonToken = loc(5);
454 AST::UiPublicMember *node = makeAstNode<AST::UiPublicMember> (driver->nodePool(), sym(2).sval, sym(3).sval,
456 node->propertyToken = loc(1);
457 node->typeToken = loc(2);
458 node->identifierToken = loc(3);
459 node->colonToken = loc(4);
464 AST::UiPublicMember *node = makeAstNode<AST::UiPublicMember> (driver->nodePool(), sym(3).sval, sym(4).sval,
466 node->isReadonlyMember = true;
467 node->readonlyToken = loc(1);
468 node->propertyToken = loc(2);
469 node->typeToken = loc(3);
470 node->identifierToken = loc(4);
471 node->colonToken = loc(5);
476 AST::UiPublicMember *node = makeAstNode<AST::UiPublicMember> (driver->nodePool(), sym(3).sval, sym(4).sval,
478 node->isDefaultMember = true;
479 node->defaultToken = loc(1);
480 node->propertyToken = loc(2);
481 node->typeToken = loc(3);
482 node->identifierToken = loc(4);
483 node->colonToken = loc(5);
488 AST::UiPublicMember *node = makeAstNode<AST::UiPublicMember> (driver->nodePool(), sym(4).sval, sym(6).sval);
489 node->typeModifier = sym(2).sval;
490 node->propertyToken = loc(1);
491 node->typeModifierToken = loc(2);
492 node->typeToken = loc(4);
493 node->identifierToken = loc(6);
494 node->semicolonToken = loc(7); // insert a fake ';' before ':'
496 AST::UiQualifiedId *propertyName = makeAstNode<AST::UiQualifiedId>(driver->nodePool(), sym(6).sval);
497 propertyName->identifierToken = loc(6);
498 propertyName->next = 0;
500 AST::UiArrayBinding *binding = makeAstNode<AST::UiArrayBinding> (driver->nodePool(),
501 propertyName, sym(9).UiArrayMemberList->finish());
502 binding->colonToken = loc(7);
503 binding->lbracketToken = loc(8);
504 binding->rbracketToken = loc(10);
506 node->binding = binding;
512 AST::UiPublicMember *node = makeAstNode<AST::UiPublicMember> (driver->nodePool(), sym(2).sval, sym(3).sval);
513 node->propertyToken = loc(1);
514 node->typeToken = loc(2);
515 node->identifierToken = loc(3);
516 node->semicolonToken = loc(4); // insert a fake ';' before ':'
518 AST::UiQualifiedId *propertyName = makeAstNode<AST::UiQualifiedId>(driver->nodePool(), sym(3).sval);
519 propertyName->identifierToken = loc(3);
520 propertyName->next = 0;
522 AST::UiObjectBinding *binding = makeAstNode<AST::UiObjectBinding> (driver->nodePool(),
523 propertyName, sym(5).UiQualifiedId, sym(6).UiObjectInitializer);
524 binding->colonToken = loc(4);
526 node->binding = binding;
532 sym(1).Node = makeAstNode<AST::UiSourceElement>(driver->nodePool(), sym(1).Node);
536 sym(1).Node = makeAstNode<AST::UiSourceElement>(driver->nodePool(), sym(1).Node);
540 QString s = QLatin1String(QDeclarativeJSGrammar::spell[T_PROPERTY]);
541 sym(1).sval = driver->intern(s.constData(), s.length());
546 QString s = QLatin1String(QDeclarativeJSGrammar::spell[T_SIGNAL]);
547 sym(1).sval = driver->intern(s.constData(), s.length());
552 QString s = QLatin1String(QDeclarativeJSGrammar::spell[T_READONLY]);
553 sym(1).sval = driver->intern(s.constData(), s.length());
558 QString s = QLatin1String(QDeclarativeJSGrammar::spell[T_ON]);
559 sym(1).sval = driver->intern(s.constData(), s.length());
564 AST::ThisExpression *node = makeAstNode<AST::ThisExpression> (driver->nodePool());
565 node->thisToken = loc(1);
570 AST::IdentifierExpression *node = makeAstNode<AST::IdentifierExpression> (driver->nodePool(), sym(1).sval);
571 node->identifierToken = loc(1);
576 AST::NullExpression *node = makeAstNode<AST::NullExpression> (driver->nodePool());
577 node->nullToken = loc(1);
582 AST::TrueLiteral *node = makeAstNode<AST::TrueLiteral> (driver->nodePool());
583 node->trueToken = loc(1);
588 AST::FalseLiteral *node = makeAstNode<AST::FalseLiteral> (driver->nodePool());
589 node->falseToken = loc(1);
594 AST::NumericLiteral *node = makeAstNode<AST::NumericLiteral> (driver->nodePool(), sym(1).dval);
595 node->literalToken = loc(1);
600 AST::StringLiteral *node = makeAstNode<AST::StringLiteral> (driver->nodePool(), sym(1).sval);
601 node->literalToken = loc(1);
606 bool rx = lexer->scanRegExp(Lexer::NoPrefix);
608 diagnostic_messages.append(DiagnosticMessage(DiagnosticMessage::Error, location(lexer), lexer->errorMessage()));
609 return false; // ### remove me
612 loc(1).length = lexer->tokenLength();
614 AST::RegExpLiteral *node = makeAstNode<AST::RegExpLiteral> (driver->nodePool(), lexer->pattern, lexer->flags);
615 node->literalToken = loc(1);
620 bool rx = lexer->scanRegExp(Lexer::EqualPrefix);
622 diagnostic_messages.append(DiagnosticMessage(DiagnosticMessage::Error, location(lexer), lexer->errorMessage()));
626 loc(1).length = lexer->tokenLength();
628 AST::RegExpLiteral *node = makeAstNode<AST::RegExpLiteral> (driver->nodePool(), lexer->pattern, lexer->flags);
629 node->literalToken = loc(1);
634 AST::ArrayLiteral *node = makeAstNode<AST::ArrayLiteral> (driver->nodePool(), (AST::Elision *) 0);
635 node->lbracketToken = loc(1);
636 node->rbracketToken = loc(2);
641 AST::ArrayLiteral *node = makeAstNode<AST::ArrayLiteral> (driver->nodePool(), sym(2).Elision->finish());
642 node->lbracketToken = loc(1);
643 node->rbracketToken = loc(3);
648 AST::ArrayLiteral *node = makeAstNode<AST::ArrayLiteral> (driver->nodePool(), sym(2).ElementList->finish ());
649 node->lbracketToken = loc(1);
650 node->rbracketToken = loc(3);
655 AST::ArrayLiteral *node = makeAstNode<AST::ArrayLiteral> (driver->nodePool(), sym(2).ElementList->finish (),
657 node->lbracketToken = loc(1);
658 node->commaToken = loc(3);
659 node->rbracketToken = loc(4);
664 AST::ArrayLiteral *node = makeAstNode<AST::ArrayLiteral> (driver->nodePool(), sym(2).ElementList->finish (),
665 sym(4).Elision->finish());
666 node->lbracketToken = loc(1);
667 node->commaToken = loc(3);
668 node->rbracketToken = loc(5);
673 AST::ObjectLiteral *node = 0;
675 node = makeAstNode<AST::ObjectLiteral> (driver->nodePool(),
676 sym(2).PropertyNameAndValueList->finish ());
678 node = makeAstNode<AST::ObjectLiteral> (driver->nodePool());
679 node->lbraceToken = loc(1);
680 node->rbraceToken = loc(3);
685 AST::ObjectLiteral *node = makeAstNode<AST::ObjectLiteral> (driver->nodePool(),
686 sym(2).PropertyNameAndValueList->finish ());
687 node->lbraceToken = loc(1);
688 node->rbraceToken = loc(4);
693 AST::NestedExpression *node = makeAstNode<AST::NestedExpression>(driver->nodePool(), sym(2).Expression);
694 node->lparenToken = loc(1);
695 node->rparenToken = loc(3);
700 if (AST::ArrayMemberExpression *mem = AST::cast<AST::ArrayMemberExpression *>(sym(1).Expression)) {
701 diagnostic_messages.append(DiagnosticMessage(DiagnosticMessage::Warning, mem->lbracketToken,
702 QLatin1String("Ignored annotation")));
704 sym(1).Expression = mem->base;
707 if (AST::UiQualifiedId *qualifiedId = reparseAsQualifiedId(sym(1).Expression)) {
708 sym(1).UiQualifiedId = qualifiedId;
710 sym(1).UiQualifiedId = 0;
712 diagnostic_messages.append(DiagnosticMessage(DiagnosticMessage::Error, loc(1),
713 QLatin1String("Expected a qualified name id")));
715 return false; // ### recover
720 sym(1).Node = makeAstNode<AST::ElementList> (driver->nodePool(), (AST::Elision *) 0, sym(1).Expression);
724 sym(1).Node = makeAstNode<AST::ElementList> (driver->nodePool(), sym(1).Elision->finish(), sym(2).Expression);
728 AST::ElementList *node = makeAstNode<AST::ElementList> (driver->nodePool(), sym(1).ElementList,
729 (AST::Elision *) 0, sym(3).Expression);
730 node->commaToken = loc(2);
735 AST::ElementList *node = makeAstNode<AST::ElementList> (driver->nodePool(), sym(1).ElementList, sym(3).Elision->finish(),
737 node->commaToken = loc(2);
742 AST::Elision *node = makeAstNode<AST::Elision> (driver->nodePool());
743 node->commaToken = loc(1);
748 AST::Elision *node = makeAstNode<AST::Elision> (driver->nodePool(), sym(1).Elision);
749 node->commaToken = loc(2);
754 AST::PropertyNameAndValueList *node = makeAstNode<AST::PropertyNameAndValueList> (driver->nodePool(),
755 sym(1).PropertyName, sym(3).Expression);
756 node->colonToken = loc(2);
761 AST::PropertyNameAndValueList *node = makeAstNode<AST::PropertyNameAndValueList> (driver->nodePool(),
762 sym(1).PropertyNameAndValueList, sym(3).PropertyName, sym(5).Expression);
763 node->commaToken = loc(2);
764 node->colonToken = loc(4);
769 AST::IdentifierPropertyName *node = makeAstNode<AST::IdentifierPropertyName> (driver->nodePool(), sym(1).sval);
770 node->propertyNameToken = loc(1);
775 AST::IdentifierPropertyName *node = makeAstNode<AST::IdentifierPropertyName> (driver->nodePool(), driver->intern(lexer->characterBuffer(), lexer->characterCount()));
776 node->propertyNameToken = loc(1);
781 AST::StringLiteralPropertyName *node = makeAstNode<AST::StringLiteralPropertyName> (driver->nodePool(), sym(1).sval);
782 node->propertyNameToken = loc(1);
787 AST::NumericLiteralPropertyName *node = makeAstNode<AST::NumericLiteralPropertyName> (driver->nodePool(), sym(1).dval);
788 node->propertyNameToken = loc(1);
793 AST::IdentifierPropertyName *node = makeAstNode<AST::IdentifierPropertyName> (driver->nodePool(), sym(1).sval);
794 node->propertyNameToken = loc(1);
860 sym(1).sval = driver->intern(lexer->characterBuffer(), lexer->characterCount());
864 AST::ArrayMemberExpression *node = makeAstNode<AST::ArrayMemberExpression> (driver->nodePool(), sym(1).Expression, sym(3).Expression);
865 node->lbracketToken = loc(2);
866 node->rbracketToken = loc(4);
871 AST::FieldMemberExpression *node = makeAstNode<AST::FieldMemberExpression> (driver->nodePool(), sym(1).Expression, sym(3).sval);
872 node->dotToken = loc(2);
873 node->identifierToken = loc(3);
878 AST::NewMemberExpression *node = makeAstNode<AST::NewMemberExpression> (driver->nodePool(), sym(2).Expression, sym(4).ArgumentList);
879 node->newToken = loc(1);
880 node->lparenToken = loc(3);
881 node->rparenToken = loc(5);
886 AST::NewExpression *node = makeAstNode<AST::NewExpression> (driver->nodePool(), sym(2).Expression);
887 node->newToken = loc(1);
892 AST::CallExpression *node = makeAstNode<AST::CallExpression> (driver->nodePool(), sym(1).Expression, sym(3).ArgumentList);
893 node->lparenToken = loc(2);
894 node->rparenToken = loc(4);
899 AST::CallExpression *node = makeAstNode<AST::CallExpression> (driver->nodePool(), sym(1).Expression, sym(3).ArgumentList);
900 node->lparenToken = loc(2);
901 node->rparenToken = loc(4);
906 AST::ArrayMemberExpression *node = makeAstNode<AST::ArrayMemberExpression> (driver->nodePool(), sym(1).Expression, sym(3).Expression);
907 node->lbracketToken = loc(2);
908 node->rbracketToken = loc(4);
913 AST::FieldMemberExpression *node = makeAstNode<AST::FieldMemberExpression> (driver->nodePool(), sym(1).Expression, sym(3).sval);
914 node->dotToken = loc(2);
915 node->identifierToken = loc(3);
924 sym(1).Node = sym(1).ArgumentList->finish();
928 sym(1).Node = makeAstNode<AST::ArgumentList> (driver->nodePool(), sym(1).Expression);
932 AST::ArgumentList *node = makeAstNode<AST::ArgumentList> (driver->nodePool(), sym(1).ArgumentList, sym(3).Expression);
933 node->commaToken = loc(2);
938 AST::PostIncrementExpression *node = makeAstNode<AST::PostIncrementExpression> (driver->nodePool(), sym(1).Expression);
939 node->incrementToken = loc(2);
944 AST::PostDecrementExpression *node = makeAstNode<AST::PostDecrementExpression> (driver->nodePool(), sym(1).Expression);
945 node->decrementToken = loc(2);
950 AST::DeleteExpression *node = makeAstNode<AST::DeleteExpression> (driver->nodePool(), sym(2).Expression);
951 node->deleteToken = loc(1);
956 AST::VoidExpression *node = makeAstNode<AST::VoidExpression> (driver->nodePool(), sym(2).Expression);
957 node->voidToken = loc(1);
962 AST::TypeOfExpression *node = makeAstNode<AST::TypeOfExpression> (driver->nodePool(), sym(2).Expression);
963 node->typeofToken = loc(1);
968 AST::PreIncrementExpression *node = makeAstNode<AST::PreIncrementExpression> (driver->nodePool(), sym(2).Expression);
969 node->incrementToken = loc(1);
974 AST::PreDecrementExpression *node = makeAstNode<AST::PreDecrementExpression> (driver->nodePool(), sym(2).Expression);
975 node->decrementToken = loc(1);
980 AST::UnaryPlusExpression *node = makeAstNode<AST::UnaryPlusExpression> (driver->nodePool(), sym(2).Expression);
981 node->plusToken = loc(1);
986 AST::UnaryMinusExpression *node = makeAstNode<AST::UnaryMinusExpression> (driver->nodePool(), sym(2).Expression);
987 node->minusToken = loc(1);
992 AST::TildeExpression *node = makeAstNode<AST::TildeExpression> (driver->nodePool(), sym(2).Expression);
993 node->tildeToken = loc(1);
998 AST::NotExpression *node = makeAstNode<AST::NotExpression> (driver->nodePool(), sym(2).Expression);
999 node->notToken = loc(1);
1004 AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
1005 QSOperator::Mul, sym(3).Expression);
1006 node->operatorToken = loc(2);
1011 AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
1012 QSOperator::Div, sym(3).Expression);
1013 node->operatorToken = loc(2);
1018 AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
1019 QSOperator::Mod, sym(3).Expression);
1020 node->operatorToken = loc(2);
1025 AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
1026 QSOperator::Add, sym(3).Expression);
1027 node->operatorToken = loc(2);
1032 AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
1033 QSOperator::Sub, sym(3).Expression);
1034 node->operatorToken = loc(2);
1039 AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
1040 QSOperator::LShift, sym(3).Expression);
1041 node->operatorToken = loc(2);
1046 AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
1047 QSOperator::RShift, sym(3).Expression);
1048 node->operatorToken = loc(2);
1053 AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
1054 QSOperator::URShift, sym(3).Expression);
1055 node->operatorToken = loc(2);
1060 AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
1061 QSOperator::Lt, sym(3).Expression);
1062 node->operatorToken = loc(2);
1067 AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
1068 QSOperator::Gt, sym(3).Expression);
1069 node->operatorToken = loc(2);
1074 AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
1075 QSOperator::Le, sym(3).Expression);
1076 node->operatorToken = loc(2);
1081 AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
1082 QSOperator::Ge, sym(3).Expression);
1083 node->operatorToken = loc(2);
1088 AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
1089 QSOperator::InstanceOf, sym(3).Expression);
1090 node->operatorToken = loc(2);
1095 AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
1096 QSOperator::In, sym(3).Expression);
1097 node->operatorToken = loc(2);
1102 AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
1103 QSOperator::Lt, sym(3).Expression);
1104 node->operatorToken = loc(2);
1109 AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
1110 QSOperator::Gt, sym(3).Expression);
1111 node->operatorToken = loc(2);
1116 AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
1117 QSOperator::Le, sym(3).Expression);
1118 node->operatorToken = loc(2);
1123 AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
1124 QSOperator::Ge, sym(3).Expression);
1125 node->operatorToken = loc(2);
1130 AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
1131 QSOperator::InstanceOf, sym(3).Expression);
1132 node->operatorToken = loc(2);
1137 AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
1138 QSOperator::Equal, sym(3).Expression);
1139 node->operatorToken = loc(2);
1144 AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
1145 QSOperator::NotEqual, sym(3).Expression);
1146 node->operatorToken = loc(2);
1151 AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
1152 QSOperator::StrictEqual, sym(3).Expression);
1153 node->operatorToken = loc(2);
1158 AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
1159 QSOperator::StrictNotEqual, sym(3).Expression);
1160 node->operatorToken = loc(2);
1165 AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
1166 QSOperator::Equal, sym(3).Expression);
1167 node->operatorToken = loc(2);
1172 AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
1173 QSOperator::NotEqual, sym(3).Expression);
1174 node->operatorToken = loc(2);
1179 AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
1180 QSOperator::StrictEqual, sym(3).Expression);
1181 node->operatorToken = loc(2);
1186 AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
1187 QSOperator::StrictNotEqual, sym(3).Expression);
1188 node->operatorToken = loc(2);
1193 AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
1194 QSOperator::BitAnd, sym(3).Expression);
1195 node->operatorToken = loc(2);
1200 AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
1201 QSOperator::BitAnd, sym(3).Expression);
1202 node->operatorToken = loc(2);
1207 AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
1208 QSOperator::BitXor, sym(3).Expression);
1209 node->operatorToken = loc(2);
1214 AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
1215 QSOperator::BitXor, sym(3).Expression);
1216 node->operatorToken = loc(2);
1221 AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
1222 QSOperator::BitOr, sym(3).Expression);
1223 node->operatorToken = loc(2);
1228 AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
1229 QSOperator::BitOr, sym(3).Expression);
1230 node->operatorToken = loc(2);
1235 AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
1236 QSOperator::And, sym(3).Expression);
1237 node->operatorToken = loc(2);
1242 AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
1243 QSOperator::And, sym(3).Expression);
1244 node->operatorToken = loc(2);
1249 AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
1250 QSOperator::Or, sym(3).Expression);
1251 node->operatorToken = loc(2);
1256 AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
1257 QSOperator::Or, sym(3).Expression);
1258 node->operatorToken = loc(2);
1263 AST::ConditionalExpression *node = makeAstNode<AST::ConditionalExpression> (driver->nodePool(), sym(1).Expression,
1264 sym(3).Expression, sym(5).Expression);
1265 node->questionToken = loc(2);
1266 node->colonToken = loc(4);
1271 AST::ConditionalExpression *node = makeAstNode<AST::ConditionalExpression> (driver->nodePool(), sym(1).Expression,
1272 sym(3).Expression, sym(5).Expression);
1273 node->questionToken = loc(2);
1274 node->colonToken = loc(4);
1279 AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
1280 sym(2).ival, sym(3).Expression);
1281 node->operatorToken = loc(2);
1286 AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
1287 sym(2).ival, sym(3).Expression);
1288 node->operatorToken = loc(2);
1293 sym(1).ival = QSOperator::Assign;
1297 sym(1).ival = QSOperator::InplaceMul;
1301 sym(1).ival = QSOperator::InplaceDiv;
1305 sym(1).ival = QSOperator::InplaceMod;
1309 sym(1).ival = QSOperator::InplaceAdd;
1313 sym(1).ival = QSOperator::InplaceSub;
1317 sym(1).ival = QSOperator::InplaceLeftShift;
1321 sym(1).ival = QSOperator::InplaceRightShift;
1325 sym(1).ival = QSOperator::InplaceURightShift;
1329 sym(1).ival = QSOperator::InplaceAnd;
1333 sym(1).ival = QSOperator::InplaceXor;
1337 sym(1).ival = QSOperator::InplaceOr;
1341 AST::Expression *node = makeAstNode<AST::Expression> (driver->nodePool(), sym(1).Expression, sym(3).Expression);
1342 node->commaToken = loc(2);
1351 AST::Expression *node = makeAstNode<AST::Expression> (driver->nodePool(), sym(1).Expression, sym(3).Expression);
1352 node->commaToken = loc(2);
1361 AST::Block *node = makeAstNode<AST::Block> (driver->nodePool(), sym(2).StatementList);
1362 node->lbraceToken = loc(1);
1363 node->rbraceToken = loc(3);
1368 sym(1).Node = makeAstNode<AST::StatementList> (driver->nodePool(), sym(1).Statement);
1372 sym(1).Node = makeAstNode<AST::StatementList> (driver->nodePool(), sym(1).StatementList, sym(2).Statement);
1380 sym(1).Node = sym(1).StatementList->finish ();
1384 AST::VariableStatement *node = makeAstNode<AST::VariableStatement> (driver->nodePool(),
1385 sym(2).VariableDeclarationList->finish (/*readOnly=*/sym(1).ival == T_CONST));
1386 node->declarationKindToken = loc(1);
1387 node->semicolonToken = loc(3);
1392 sym(1).ival = T_CONST;
1396 sym(1).ival = T_VAR;
1400 sym(1).Node = makeAstNode<AST::VariableDeclarationList> (driver->nodePool(), sym(1).VariableDeclaration);
1404 AST::VariableDeclarationList *node = makeAstNode<AST::VariableDeclarationList> (driver->nodePool(),
1405 sym(1).VariableDeclarationList, sym(3).VariableDeclaration);
1406 node->commaToken = loc(2);
1411 sym(1).Node = makeAstNode<AST::VariableDeclarationList> (driver->nodePool(), sym(1).VariableDeclaration);
1415 sym(1).Node = makeAstNode<AST::VariableDeclarationList> (driver->nodePool(), sym(1).VariableDeclarationList, sym(3).VariableDeclaration);
1419 AST::VariableDeclaration *node = makeAstNode<AST::VariableDeclaration> (driver->nodePool(), sym(1).sval, sym(2).Expression);
1420 node->identifierToken = loc(1);
1425 AST::VariableDeclaration *node = makeAstNode<AST::VariableDeclaration> (driver->nodePool(), sym(1).sval, sym(2).Expression);
1426 node->identifierToken = loc(1);
1431 // ### TODO: AST for initializer
1440 // ### TODO: AST for initializer
1449 AST::EmptyStatement *node = makeAstNode<AST::EmptyStatement> (driver->nodePool());
1450 node->semicolonToken = loc(1);
1455 AST::ExpressionStatement *node = makeAstNode<AST::ExpressionStatement> (driver->nodePool(), sym(1).Expression);
1456 node->semicolonToken = loc(2);
1461 AST::IfStatement *node = makeAstNode<AST::IfStatement> (driver->nodePool(), sym(3).Expression, sym(5).Statement, sym(7).Statement);
1462 node->ifToken = loc(1);
1463 node->lparenToken = loc(2);
1464 node->rparenToken = loc(4);
1465 node->elseToken = loc(5);
1470 AST::IfStatement *node = makeAstNode<AST::IfStatement> (driver->nodePool(), sym(3).Expression, sym(5).Statement);
1471 node->ifToken = loc(1);
1472 node->lparenToken = loc(2);
1473 node->rparenToken = loc(4);
1478 AST::DoWhileStatement *node = makeAstNode<AST::DoWhileStatement> (driver->nodePool(), sym(2).Statement, sym(5).Expression);
1479 node->doToken = loc(1);
1480 node->whileToken = loc(3);
1481 node->lparenToken = loc(4);
1482 node->rparenToken = loc(6);
1483 node->semicolonToken = loc(7);
1488 AST::WhileStatement *node = makeAstNode<AST::WhileStatement> (driver->nodePool(), sym(3).Expression, sym(5).Statement);
1489 node->whileToken = loc(1);
1490 node->lparenToken = loc(2);
1491 node->rparenToken = loc(4);
1496 AST::ForStatement *node = makeAstNode<AST::ForStatement> (driver->nodePool(), sym(3).Expression,
1497 sym(5).Expression, sym(7).Expression, sym(9).Statement);
1498 node->forToken = loc(1);
1499 node->lparenToken = loc(2);
1500 node->firstSemicolonToken = loc(4);
1501 node->secondSemicolonToken = loc(6);
1502 node->rparenToken = loc(8);
1507 AST::LocalForStatement *node = makeAstNode<AST::LocalForStatement> (driver->nodePool(),
1508 sym(4).VariableDeclarationList->finish (/*readOnly=*/false), sym(6).Expression,
1509 sym(8).Expression, sym(10).Statement);
1510 node->forToken = loc(1);
1511 node->lparenToken = loc(2);
1512 node->varToken = loc(3);
1513 node->firstSemicolonToken = loc(5);
1514 node->secondSemicolonToken = loc(7);
1515 node->rparenToken = loc(9);
1520 AST:: ForEachStatement *node = makeAstNode<AST::ForEachStatement> (driver->nodePool(), sym(3).Expression,
1521 sym(5).Expression, sym(7).Statement);
1522 node->forToken = loc(1);
1523 node->lparenToken = loc(2);
1524 node->inToken = loc(4);
1525 node->rparenToken = loc(6);
1530 AST::LocalForEachStatement *node = makeAstNode<AST::LocalForEachStatement> (driver->nodePool(),
1531 sym(4).VariableDeclaration, sym(6).Expression, sym(8).Statement);
1532 node->forToken = loc(1);
1533 node->lparenToken = loc(2);
1534 node->varToken = loc(3);
1535 node->inToken = loc(5);
1536 node->rparenToken = loc(7);
1541 AST::ContinueStatement *node = makeAstNode<AST::ContinueStatement> (driver->nodePool());
1542 node->continueToken = loc(1);
1543 node->semicolonToken = loc(2);
1548 AST::ContinueStatement *node = makeAstNode<AST::ContinueStatement> (driver->nodePool(), sym(2).sval);
1549 node->continueToken = loc(1);
1550 node->identifierToken = loc(2);
1551 node->semicolonToken = loc(3);
1556 AST::BreakStatement *node = makeAstNode<AST::BreakStatement> (driver->nodePool());
1557 node->breakToken = loc(1);
1558 node->semicolonToken = loc(2);
1563 AST::BreakStatement *node = makeAstNode<AST::BreakStatement> (driver->nodePool(), sym(2).sval);
1564 node->breakToken = loc(1);
1565 node->identifierToken = loc(2);
1566 node->semicolonToken = loc(3);
1571 AST::ReturnStatement *node = makeAstNode<AST::ReturnStatement> (driver->nodePool(), sym(2).Expression);
1572 node->returnToken = loc(1);
1573 node->semicolonToken = loc(3);
1578 AST::WithStatement *node = makeAstNode<AST::WithStatement> (driver->nodePool(), sym(3).Expression, sym(5).Statement);
1579 node->withToken = loc(1);
1580 node->lparenToken = loc(2);
1581 node->rparenToken = loc(4);
1586 AST::SwitchStatement *node = makeAstNode<AST::SwitchStatement> (driver->nodePool(), sym(3).Expression, sym(5).CaseBlock);
1587 node->switchToken = loc(1);
1588 node->lparenToken = loc(2);
1589 node->rparenToken = loc(4);
1594 AST::CaseBlock *node = makeAstNode<AST::CaseBlock> (driver->nodePool(), sym(2).CaseClauses);
1595 node->lbraceToken = loc(1);
1596 node->rbraceToken = loc(3);
1601 AST::CaseBlock *node = makeAstNode<AST::CaseBlock> (driver->nodePool(), sym(2).CaseClauses, sym(3).DefaultClause, sym(4).CaseClauses);
1602 node->lbraceToken = loc(1);
1603 node->rbraceToken = loc(5);
1608 sym(1).Node = makeAstNode<AST::CaseClauses> (driver->nodePool(), sym(1).CaseClause);
1612 sym(1).Node = makeAstNode<AST::CaseClauses> (driver->nodePool(), sym(1).CaseClauses, sym(2).CaseClause);
1620 sym(1).Node = sym(1).CaseClauses->finish ();
1624 AST::CaseClause *node = makeAstNode<AST::CaseClause> (driver->nodePool(), sym(2).Expression, sym(4).StatementList);
1625 node->caseToken = loc(1);
1626 node->colonToken = loc(3);
1631 AST::DefaultClause *node = makeAstNode<AST::DefaultClause> (driver->nodePool(), sym(3).StatementList);
1632 node->defaultToken = loc(1);
1633 node->colonToken = loc(2);
1638 AST::LabelledStatement *node = makeAstNode<AST::LabelledStatement> (driver->nodePool(), driver->intern(lexer->characterBuffer(), lexer->characterCount()), sym(3).Statement);
1639 node->identifierToken = loc(1);
1640 node->colonToken = loc(2);
1645 AST::LabelledStatement *node = makeAstNode<AST::LabelledStatement> (driver->nodePool(), sym(1).sval, sym(3).Statement);
1646 node->identifierToken = loc(1);
1647 node->colonToken = loc(2);
1652 AST::ThrowStatement *node = makeAstNode<AST::ThrowStatement> (driver->nodePool(), sym(2).Expression);
1653 node->throwToken = loc(1);
1654 node->semicolonToken = loc(3);
1659 AST::TryStatement *node = makeAstNode<AST::TryStatement> (driver->nodePool(), sym(2).Statement, sym(3).Catch);
1660 node->tryToken = loc(1);
1665 AST::TryStatement *node = makeAstNode<AST::TryStatement> (driver->nodePool(), sym(2).Statement, sym(3).Finally);
1666 node->tryToken = loc(1);
1671 AST::TryStatement *node = makeAstNode<AST::TryStatement> (driver->nodePool(), sym(2).Statement, sym(3).Catch, sym(4).Finally);
1672 node->tryToken = loc(1);
1677 AST::Catch *node = makeAstNode<AST::Catch> (driver->nodePool(), sym(3).sval, sym(5).Block);
1678 node->catchToken = loc(1);
1679 node->lparenToken = loc(2);
1680 node->identifierToken = loc(3);
1681 node->rparenToken = loc(4);
1686 AST::Finally *node = makeAstNode<AST::Finally> (driver->nodePool(), sym(2).Block);
1687 node->finallyToken = loc(1);
1692 AST::DebuggerStatement *node = makeAstNode<AST::DebuggerStatement> (driver->nodePool());
1693 node->debuggerToken = loc(1);
1694 node->semicolonToken = loc(2);
1699 AST::FunctionDeclaration *node = makeAstNode<AST::FunctionDeclaration> (driver->nodePool(), sym(2).sval, sym(4).FormalParameterList, sym(7).FunctionBody);
1700 node->functionToken = loc(1);
1701 node->identifierToken = loc(2);
1702 node->lparenToken = loc(3);
1703 node->rparenToken = loc(5);
1704 node->lbraceToken = loc(6);
1705 node->rbraceToken = loc(8);
1710 AST::FunctionExpression *node = makeAstNode<AST::FunctionExpression> (driver->nodePool(), sym(2).sval, sym(4).FormalParameterList, sym(7).FunctionBody);
1711 node->functionToken = loc(1);
1713 node->identifierToken = loc(2);
1714 node->lparenToken = loc(3);
1715 node->rparenToken = loc(5);
1716 node->lbraceToken = loc(6);
1717 node->rbraceToken = loc(8);
1722 AST::FormalParameterList *node = makeAstNode<AST::FormalParameterList> (driver->nodePool(), sym(1).sval);
1723 node->identifierToken = loc(1);
1728 AST::FormalParameterList *node = makeAstNode<AST::FormalParameterList> (driver->nodePool(), sym(1).FormalParameterList, sym(3).sval);
1729 node->commaToken = loc(2);
1730 node->identifierToken = loc(3);
1739 sym(1).Node = sym(1).FormalParameterList->finish ();
1747 sym(1).Node = makeAstNode<AST::FunctionBody> (driver->nodePool(), sym(1).SourceElements->finish ());
1751 sym(1).Node = makeAstNode<AST::Program> (driver->nodePool(), sym(1).SourceElements->finish ());
1755 sym(1).Node = makeAstNode<AST::SourceElements> (driver->nodePool(), sym(1).SourceElement);
1759 sym(1).Node = makeAstNode<AST::SourceElements> (driver->nodePool(), sym(1).SourceElements, sym(2).SourceElement);
1763 sym(1).Node = makeAstNode<AST::StatementSourceElement> (driver->nodePool(), sym(1).Statement);
1767 sym(1).Node = makeAstNode<AST::FunctionSourceElement> (driver->nodePool(), sym(1).FunctionDeclaration);
1779 action = nt_action(state_stack[tos], lhs[r] - TERMINAL_COUNT);
1781 } while (action != 0);
1783 if (first_token == last_token) {
1784 const int errorState = state_stack[tos];
1786 // automatic insertion of `;'
1787 if (yytoken != -1 && t_action(errorState, T_AUTOMATIC_SEMICOLON) && automatic(driver, yytoken)) {
1788 SavedToken &tk = token_buffer[0];
1793 yylloc = yyprevlloc;
1794 yylloc.offset += yylloc.length;
1795 yylloc.startColumn += yylloc.length;
1798 //const QString msg = qApp->translate("QDeclarativeParser", "Missing `;'");
1799 //diagnostic_messages.append(DiagnosticMessage(DiagnosticMessage::Warning, yylloc, msg));
1801 first_token = &token_buffer[0];
1802 last_token = &token_buffer[1];
1804 yytoken = T_SEMICOLON;
1807 action = errorState;
1814 token_buffer[0].token = yytoken;
1815 token_buffer[0].dval = yylval;
1816 token_buffer[0].loc = yylloc;
1818 token_buffer[1].token = yytoken = lexer->lex();
1819 token_buffer[1].dval = yylval = lexer->dval();
1820 token_buffer[1].loc = yylloc = location(lexer);
1822 if (t_action(errorState, yytoken)) {
1824 int token = token_buffer[0].token;
1825 if (token < 0 || token >= TERMINAL_COUNT)
1826 msg = qApp->translate("QDeclarativeParser", "Syntax error");
1828 msg = qApp->translate("QDeclarativeParser", "Unexpected token `%1'").arg(QLatin1String(spell[token]));
1829 diagnostic_messages.append(DiagnosticMessage(DiagnosticMessage::Error, token_buffer[0].loc, msg));
1831 action = errorState;
1835 static int tokens[] = {
1843 T_RPAREN, T_RBRACKET, T_RBRACE,
1848 T_LPAREN, T_LBRACKET, T_LBRACE,
1853 for (int *tk = tokens; *tk != EOF_SYMBOL; ++tk) {
1854 int a = t_action(errorState, *tk);
1855 if (a > 0 && t_action(a, yytoken)) {
1856 const QString msg = qApp->translate("QDeclarativeParser", "Expected token `%1'").arg(QLatin1String(spell[*tk]));
1857 diagnostic_messages.append(DiagnosticMessage(DiagnosticMessage::Error, token_buffer[0].loc, msg));
1861 yylloc = token_buffer[0].loc;
1864 first_token = &token_buffer[0];
1865 last_token = &token_buffer[2];
1867 action = errorState;
1872 for (int tk = 1; tk < TERMINAL_COUNT; ++tk) {
1873 if (tk == T_AUTOMATIC_SEMICOLON || tk == T_FEED_UI_PROGRAM ||
1874 tk == T_FEED_JS_STATEMENT || tk == T_FEED_JS_EXPRESSION ||
1875 tk == T_FEED_JS_SOURCE_ELEMENT)
1878 int a = t_action(errorState, tk);
1879 if (a > 0 && t_action(a, yytoken)) {
1880 const QString msg = qApp->translate("QDeclarativeParser", "Expected token `%1'").arg(QLatin1String(spell[tk]));
1881 diagnostic_messages.append(DiagnosticMessage(DiagnosticMessage::Error, token_buffer[0].loc, msg));
1885 yylloc = token_buffer[0].loc;
1888 action = errorState;
1893 const QString msg = qApp->translate("QDeclarativeParser", "Syntax error");
1894 diagnostic_messages.append(DiagnosticMessage(DiagnosticMessage::Error, token_buffer[0].loc, msg));
1900 QT_QML_END_NAMESPACE