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 <QtCore/QCoreApplication>
47 #include "qdeclarativejsengine_p.h"
48 #include "qdeclarativejslexer_p.h"
49 #include "qdeclarativejsast_p.h"
50 #include "qdeclarativejsmemorypool_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)));
76 string_stack = reinterpret_cast<QStringRef*> (qRealloc(string_stack, stack_size * sizeof(QStringRef)));
79 Parser::Parser(Engine *engine):
98 qFree(location_stack);
103 static inline AST::SourceLocation location(Lexer *lexer)
105 AST::SourceLocation loc;
106 loc.offset = lexer->tokenOffset();
107 loc.length = lexer->tokenLength();
108 loc.startLine = lexer->tokenStartLine();
109 loc.startColumn = lexer->tokenStartColumn();
113 AST::UiQualifiedId *Parser::reparseAsQualifiedId(AST::ExpressionNode *expr)
115 QVarLengthArray<QStringRef, 4> nameIds;
116 QVarLengthArray<AST::SourceLocation, 4> locations;
118 AST::ExpressionNode *it = expr;
119 while (AST::FieldMemberExpression *m = AST::cast<AST::FieldMemberExpression *>(it)) {
120 nameIds.append(m->name);
121 locations.append(m->identifierToken);
125 if (AST::IdentifierExpression *idExpr = AST::cast<AST::IdentifierExpression *>(it)) {
126 AST::UiQualifiedId *q = new (pool) AST::UiQualifiedId(idExpr->name);
127 q->identifierToken = idExpr->identifierToken;
129 AST::UiQualifiedId *currentId = q;
130 for (int i = nameIds.size() - 1; i != -1; --i) {
131 currentId = new (pool) AST::UiQualifiedId(currentId, nameIds[i]);
132 currentId->identifierToken = locations[i];
135 return currentId->finish();
141 bool Parser::parse(int startToken)
143 Lexer *lexer = driver->lexer();
144 bool hadErrors = false;
148 token_buffer[0].token = startToken;
149 first_token = &token_buffer[0];
150 last_token = &token_buffer[1];
156 if (++tos == stack_size)
159 state_stack[tos] = action;
162 if (yytoken == -1 && -TERMINAL_COUNT != action_index[action]) {
165 if (first_token == last_token) {
166 yytoken = lexer->lex();
167 yylval = lexer->tokenValue();
168 yytokenspell = lexer->tokenSpell();
169 yylloc = location(lexer);
171 yytoken = first_token->token;
172 yylval = first_token->dval;
173 yytokenspell = first_token->spell;
174 yylloc = first_token->loc;
179 action = t_action(action, yytoken);
181 if (action != ACCEPT_STATE) {
183 sym(1).dval = yylval;
184 stringRef(1) = yytokenspell;
190 } else if (action < 0) {
191 const int r = -action - 1;
197 sym(1).Node = sym(2).Node;
198 program = sym(1).Node;
202 sym(1).Node = sym(2).Node;
203 program = sym(1).Node;
207 sym(1).Node = sym(2).Node;
208 program = sym(1).Node;
212 sym(1).Node = sym(2).Node;
213 program = sym(1).Node;
217 sym(1).Node = sym(2).Node;
218 program = sym(1).Node;
222 sym(1).Node = sym(2).Node;
223 program = sym(1).Node;
227 sym(1).UiProgram = new (pool) AST::UiProgram(sym(1).UiImportList,
228 sym(2).UiObjectMemberList->finish());
232 sym(1).Node = sym(1).UiImportList->finish();
236 sym(1).Node = new (pool) AST::UiImportList(sym(1).UiImport);
240 sym(1).Node = new (pool) AST::UiImportList(sym(1).UiImportList, sym(2).UiImport);
244 sym(1).UiImport->semicolonToken = loc(2);
248 sym(1).UiImport->versionToken = loc(2);
249 sym(1).UiImport->semicolonToken = loc(3);
253 sym(1).UiImport->versionToken = loc(2);
254 sym(1).UiImport->asToken = loc(3);
255 sym(1).UiImport->importIdToken = loc(4);
256 sym(1).UiImport->importId = stringRef(4);
257 sym(1).UiImport->semicolonToken = loc(5);
261 sym(1).UiImport->asToken = loc(2);
262 sym(1).UiImport->importIdToken = loc(3);
263 sym(1).UiImport->importId = stringRef(3);
264 sym(1).UiImport->semicolonToken = loc(4);
268 AST::UiImport *node = 0;
270 if (AST::StringLiteral *importIdLiteral = AST::cast<AST::StringLiteral *>(sym(2).Expression)) {
271 node = new (pool) AST::UiImport(importIdLiteral->value);
272 node->fileNameToken = loc(2);
273 } else if (AST::UiQualifiedId *qualifiedId = reparseAsQualifiedId(sym(2).Expression)) {
274 node = new (pool) AST::UiImport(qualifiedId);
275 node->fileNameToken = loc(2);
281 node->importToken = loc(1);
283 diagnostic_messages.append(DiagnosticMessage(DiagnosticMessage::Error, loc(1),
284 QLatin1String("Expected a qualified name id or a string literal")));
286 return false; // ### remove me
295 sym(1).Node = new (pool) AST::UiObjectMemberList(sym(1).UiObjectMember);
299 sym(1).Node = new (pool) AST::UiObjectMemberList(sym(1).UiObjectMember);
303 AST::UiObjectMemberList *node = new (pool) AST:: UiObjectMemberList(
304 sym(1).UiObjectMemberList, sym(2).UiObjectMember);
309 sym(1).Node = new (pool) AST::UiArrayMemberList(sym(1).UiObjectMember);
313 AST::UiArrayMemberList *node = new (pool) AST::UiArrayMemberList(
314 sym(1).UiArrayMemberList, sym(3).UiObjectMember);
315 node->commaToken = loc(2);
320 AST::UiObjectInitializer *node = new (pool) AST::UiObjectInitializer((AST::UiObjectMemberList*)0);
321 node->lbraceToken = loc(1);
322 node->rbraceToken = loc(2);
327 AST::UiObjectInitializer *node = new (pool) AST::UiObjectInitializer(sym(2).UiObjectMemberList->finish());
328 node->lbraceToken = loc(1);
329 node->rbraceToken = loc(3);
334 AST::UiObjectDefinition *node = new (pool) AST::UiObjectDefinition(sym(1).UiQualifiedId,
335 sym(2).UiObjectInitializer);
340 AST::UiArrayBinding *node = new (pool) AST::UiArrayBinding(
341 sym(1).UiQualifiedId, sym(4).UiArrayMemberList->finish());
342 node->colonToken = loc(2);
343 node->lbracketToken = loc(3);
344 node->rbracketToken = loc(5);
349 AST::UiObjectBinding *node = new (pool) AST::UiObjectBinding(
350 sym(1).UiQualifiedId, sym(3).UiQualifiedId, sym(4).UiObjectInitializer);
351 node->colonToken = loc(2);
356 AST::UiObjectBinding *node = new (pool) AST::UiObjectBinding(
357 sym(3).UiQualifiedId, sym(1).UiQualifiedId, sym(4).UiObjectInitializer);
358 node->colonToken = loc(2);
359 node->hasOnToken = true;
365 AST::UiScriptBinding *node = new (pool) AST::UiScriptBinding(
366 sym(1).UiQualifiedId, sym(3).Statement);
367 node->colonToken = loc(2);
376 sym(1).Node = sym(1).UiParameterList->finish ();
380 AST::UiParameterList *node = new (pool) AST::UiParameterList(stringRef(1), stringRef(2));
381 node->identifierToken = loc(2);
386 AST::UiParameterList *node = new (pool) AST::UiParameterList(sym(1).UiParameterList, stringRef(3), stringRef(4));
387 node->commaToken = loc(2);
388 node->identifierToken = loc(4);
393 AST::UiPublicMember *node = new (pool) AST::UiPublicMember(QStringRef(), stringRef(2));
394 node->type = AST::UiPublicMember::Signal;
395 node->propertyToken = loc(1);
396 node->typeToken = loc(2);
397 node->identifierToken = loc(2);
398 node->parameters = sym(4).UiParameterList;
399 node->semicolonToken = loc(6);
404 AST::UiPublicMember *node = new (pool) AST::UiPublicMember(QStringRef(), stringRef(2));
405 node->type = AST::UiPublicMember::Signal;
406 node->propertyToken = loc(1);
407 node->typeToken = loc(2);
408 node->identifierToken = loc(2);
409 node->semicolonToken = loc(3);
414 AST::UiPublicMember *node = new (pool) AST::UiPublicMember(stringRef(4), stringRef(6));
415 node->typeModifier = stringRef(2);
416 node->propertyToken = loc(1);
417 node->typeModifierToken = loc(2);
418 node->typeToken = loc(4);
419 node->identifierToken = loc(6);
420 node->semicolonToken = loc(7);
425 AST::UiPublicMember *node = new (pool) AST::UiPublicMember(stringRef(2), stringRef(3));
426 node->propertyToken = loc(1);
427 node->typeToken = loc(2);
428 node->identifierToken = loc(3);
429 node->semicolonToken = loc(4);
434 AST::UiPublicMember *node = new (pool) AST::UiPublicMember(stringRef(3), stringRef(4));
435 node->isDefaultMember = true;
436 node->defaultToken = loc(1);
437 node->propertyToken = loc(2);
438 node->typeToken = loc(3);
439 node->identifierToken = loc(4);
440 node->semicolonToken = loc(5);
445 AST::UiPublicMember *node = new (pool) AST::UiPublicMember(stringRef(2), stringRef(3),
447 node->propertyToken = loc(1);
448 node->typeToken = loc(2);
449 node->identifierToken = loc(3);
450 node->colonToken = loc(4);
455 AST::UiPublicMember *node = new (pool) AST::UiPublicMember(stringRef(3), stringRef(4),
457 node->isReadonlyMember = true;
458 node->readonlyToken = loc(1);
459 node->propertyToken = loc(2);
460 node->typeToken = loc(3);
461 node->identifierToken = loc(4);
462 node->colonToken = loc(5);
467 AST::UiPublicMember *node = new (pool) AST::UiPublicMember(stringRef(3), stringRef(4),
469 node->isDefaultMember = true;
470 node->defaultToken = loc(1);
471 node->propertyToken = loc(2);
472 node->typeToken = loc(3);
473 node->identifierToken = loc(4);
474 node->colonToken = loc(5);
479 AST::UiPublicMember *node = new (pool) AST::UiPublicMember(stringRef(4), stringRef(6));
480 node->typeModifier = stringRef(2);
481 node->propertyToken = loc(1);
482 node->typeModifierToken = loc(2);
483 node->typeToken = loc(4);
484 node->identifierToken = loc(6);
485 node->semicolonToken = loc(7); // insert a fake ';' before ':'
487 AST::UiQualifiedId *propertyName = new (pool) AST::UiQualifiedId(stringRef(6));
488 propertyName->identifierToken = loc(6);
489 propertyName->next = 0;
491 AST::UiArrayBinding *binding = new (pool) AST::UiArrayBinding(
492 propertyName, sym(9).UiArrayMemberList->finish());
493 binding->colonToken = loc(7);
494 binding->lbracketToken = loc(8);
495 binding->rbracketToken = loc(10);
497 node->binding = binding;
503 AST::UiPublicMember *node = new (pool) AST::UiPublicMember(stringRef(2), stringRef(3));
504 node->propertyToken = loc(1);
505 node->typeToken = loc(2);
506 node->identifierToken = loc(3);
507 node->semicolonToken = loc(4); // insert a fake ';' before ':'
509 AST::UiQualifiedId *propertyName = new (pool) AST::UiQualifiedId(stringRef(3));
510 propertyName->identifierToken = loc(3);
511 propertyName->next = 0;
513 AST::UiObjectBinding *binding = new (pool) AST::UiObjectBinding(
514 propertyName, sym(5).UiQualifiedId, sym(6).UiObjectInitializer);
515 binding->colonToken = loc(4);
517 node->binding = binding;
523 sym(1).Node = new (pool) AST::UiSourceElement(sym(1).Node);
527 sym(1).Node = new (pool) AST::UiSourceElement(sym(1).Node);
531 AST::ThisExpression *node = new (pool) AST::ThisExpression();
532 node->thisToken = loc(1);
537 AST::IdentifierExpression *node = new (pool) AST::IdentifierExpression(stringRef(1));
538 node->identifierToken = loc(1);
543 AST::NullExpression *node = new (pool) AST::NullExpression();
544 node->nullToken = loc(1);
549 AST::TrueLiteral *node = new (pool) AST::TrueLiteral();
550 node->trueToken = loc(1);
555 AST::FalseLiteral *node = new (pool) AST::FalseLiteral();
556 node->falseToken = loc(1);
561 AST::NumericLiteral *node = new (pool) AST::NumericLiteral(sym(1).dval);
562 node->literalToken = loc(1);
567 AST::StringLiteral *node = new (pool) AST::StringLiteral(stringRef(1));
568 node->literalToken = loc(1);
573 bool rx = lexer->scanRegExp(Lexer::NoPrefix);
575 diagnostic_messages.append(DiagnosticMessage(DiagnosticMessage::Error, location(lexer), lexer->errorMessage()));
576 return false; // ### remove me
579 loc(1).length = lexer->tokenLength();
580 yylloc = loc(1); // adjust the location of the current token
582 AST::RegExpLiteral *node = new (pool) AST::RegExpLiteral(
583 driver->newStringRef(lexer->regExpPattern()), lexer->regExpFlags());
584 node->literalToken = loc(1);
589 bool rx = lexer->scanRegExp(Lexer::EqualPrefix);
591 diagnostic_messages.append(DiagnosticMessage(DiagnosticMessage::Error, location(lexer), lexer->errorMessage()));
595 loc(1).length = lexer->tokenLength();
596 yylloc = loc(1); // adjust the location of the current token
598 AST::RegExpLiteral *node = new (pool) AST::RegExpLiteral(
599 driver->newStringRef(lexer->regExpPattern()), lexer->regExpFlags());
600 node->literalToken = loc(1);
605 AST::ArrayLiteral *node = new (pool) AST::ArrayLiteral((AST::Elision *) 0);
606 node->lbracketToken = loc(1);
607 node->rbracketToken = loc(2);
612 AST::ArrayLiteral *node = new (pool) AST::ArrayLiteral(sym(2).Elision->finish());
613 node->lbracketToken = loc(1);
614 node->rbracketToken = loc(3);
619 AST::ArrayLiteral *node = new (pool) AST::ArrayLiteral(sym(2).ElementList->finish ());
620 node->lbracketToken = loc(1);
621 node->rbracketToken = loc(3);
626 AST::ArrayLiteral *node = new (pool) AST::ArrayLiteral(sym(2).ElementList->finish (),
628 node->lbracketToken = loc(1);
629 node->commaToken = loc(3);
630 node->rbracketToken = loc(4);
635 AST::ArrayLiteral *node = new (pool) AST::ArrayLiteral(sym(2).ElementList->finish (),
636 sym(4).Elision->finish());
637 node->lbracketToken = loc(1);
638 node->commaToken = loc(3);
639 node->rbracketToken = loc(5);
644 AST::ObjectLiteral *node = 0;
646 node = new (pool) AST::ObjectLiteral(
647 sym(2).PropertyNameAndValueList->finish ());
649 node = new (pool) AST::ObjectLiteral();
650 node->lbraceToken = loc(1);
651 node->rbraceToken = loc(3);
656 AST::ObjectLiteral *node = new (pool) AST::ObjectLiteral(
657 sym(2).PropertyNameAndValueList->finish ());
658 node->lbraceToken = loc(1);
659 node->rbraceToken = loc(4);
664 AST::NestedExpression *node = new (pool) AST::NestedExpression(sym(2).Expression);
665 node->lparenToken = loc(1);
666 node->rparenToken = loc(3);
671 if (AST::ArrayMemberExpression *mem = AST::cast<AST::ArrayMemberExpression *>(sym(1).Expression)) {
672 diagnostic_messages.append(DiagnosticMessage(DiagnosticMessage::Warning, mem->lbracketToken,
673 QLatin1String("Ignored annotation")));
675 sym(1).Expression = mem->base;
678 if (AST::UiQualifiedId *qualifiedId = reparseAsQualifiedId(sym(1).Expression)) {
679 sym(1).UiQualifiedId = qualifiedId;
681 sym(1).UiQualifiedId = 0;
683 diagnostic_messages.append(DiagnosticMessage(DiagnosticMessage::Error, loc(1),
684 QLatin1String("Expected a qualified name id")));
686 return false; // ### recover
691 sym(1).Node = new (pool) AST::ElementList((AST::Elision *) 0, sym(1).Expression);
695 sym(1).Node = new (pool) AST::ElementList(sym(1).Elision->finish(), sym(2).Expression);
699 AST::ElementList *node = new (pool) AST::ElementList(sym(1).ElementList,
700 (AST::Elision *) 0, sym(3).Expression);
701 node->commaToken = loc(2);
706 AST::ElementList *node = new (pool) AST::ElementList(sym(1).ElementList, sym(3).Elision->finish(),
708 node->commaToken = loc(2);
713 AST::Elision *node = new (pool) AST::Elision();
714 node->commaToken = loc(1);
719 AST::Elision *node = new (pool) AST::Elision(sym(1).Elision);
720 node->commaToken = loc(2);
725 AST::PropertyNameAndValueList *node = new (pool) AST::PropertyNameAndValueList(
726 sym(1).PropertyName, sym(3).Expression);
727 node->colonToken = loc(2);
732 AST::PropertyNameAndValueList *node = new (pool) AST::PropertyNameAndValueList(
733 sym(1).PropertyNameAndValueList, sym(3).PropertyName, sym(5).Expression);
734 node->commaToken = loc(2);
735 node->colonToken = loc(4);
740 AST::IdentifierPropertyName *node = new (pool) AST::IdentifierPropertyName(stringRef(1));
741 node->propertyNameToken = loc(1);
746 AST::IdentifierPropertyName *node = new (pool) AST::IdentifierPropertyName(stringRef(1));
747 node->propertyNameToken = loc(1);
752 AST::StringLiteralPropertyName *node = new (pool) AST::StringLiteralPropertyName(stringRef(1));
753 node->propertyNameToken = loc(1);
758 AST::NumericLiteralPropertyName *node = new (pool) AST::NumericLiteralPropertyName(sym(1).dval);
759 node->propertyNameToken = loc(1);
764 AST::IdentifierPropertyName *node = new (pool) AST::IdentifierPropertyName(stringRef(1));
765 node->propertyNameToken = loc(1);
770 AST::ArrayMemberExpression *node = new (pool) AST::ArrayMemberExpression(sym(1).Expression, sym(3).Expression);
771 node->lbracketToken = loc(2);
772 node->rbracketToken = loc(4);
777 AST::FieldMemberExpression *node = new (pool) AST::FieldMemberExpression(sym(1).Expression, stringRef(3));
778 node->dotToken = loc(2);
779 node->identifierToken = loc(3);
784 AST::NewMemberExpression *node = new (pool) AST::NewMemberExpression(sym(2).Expression, sym(4).ArgumentList);
785 node->newToken = loc(1);
786 node->lparenToken = loc(3);
787 node->rparenToken = loc(5);
792 AST::NewExpression *node = new (pool) AST::NewExpression(sym(2).Expression);
793 node->newToken = loc(1);
798 AST::CallExpression *node = new (pool) AST::CallExpression(sym(1).Expression, sym(3).ArgumentList);
799 node->lparenToken = loc(2);
800 node->rparenToken = loc(4);
805 AST::CallExpression *node = new (pool) AST::CallExpression(sym(1).Expression, sym(3).ArgumentList);
806 node->lparenToken = loc(2);
807 node->rparenToken = loc(4);
812 AST::ArrayMemberExpression *node = new (pool) AST::ArrayMemberExpression(sym(1).Expression, sym(3).Expression);
813 node->lbracketToken = loc(2);
814 node->rbracketToken = loc(4);
819 AST::FieldMemberExpression *node = new (pool) AST::FieldMemberExpression(sym(1).Expression, stringRef(3));
820 node->dotToken = loc(2);
821 node->identifierToken = loc(3);
830 sym(1).Node = sym(1).ArgumentList->finish();
834 sym(1).Node = new (pool) AST::ArgumentList(sym(1).Expression);
838 AST::ArgumentList *node = new (pool) AST::ArgumentList(sym(1).ArgumentList, sym(3).Expression);
839 node->commaToken = loc(2);
844 AST::PostIncrementExpression *node = new (pool) AST::PostIncrementExpression(sym(1).Expression);
845 node->incrementToken = loc(2);
850 AST::PostDecrementExpression *node = new (pool) AST::PostDecrementExpression(sym(1).Expression);
851 node->decrementToken = loc(2);
856 AST::DeleteExpression *node = new (pool) AST::DeleteExpression(sym(2).Expression);
857 node->deleteToken = loc(1);
862 AST::VoidExpression *node = new (pool) AST::VoidExpression(sym(2).Expression);
863 node->voidToken = loc(1);
868 AST::TypeOfExpression *node = new (pool) AST::TypeOfExpression(sym(2).Expression);
869 node->typeofToken = loc(1);
874 AST::PreIncrementExpression *node = new (pool) AST::PreIncrementExpression(sym(2).Expression);
875 node->incrementToken = loc(1);
880 AST::PreDecrementExpression *node = new (pool) AST::PreDecrementExpression(sym(2).Expression);
881 node->decrementToken = loc(1);
886 AST::UnaryPlusExpression *node = new (pool) AST::UnaryPlusExpression(sym(2).Expression);
887 node->plusToken = loc(1);
892 AST::UnaryMinusExpression *node = new (pool) AST::UnaryMinusExpression(sym(2).Expression);
893 node->minusToken = loc(1);
898 AST::TildeExpression *node = new (pool) AST::TildeExpression(sym(2).Expression);
899 node->tildeToken = loc(1);
904 AST::NotExpression *node = new (pool) AST::NotExpression(sym(2).Expression);
905 node->notToken = loc(1);
910 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
911 QSOperator::Mul, sym(3).Expression);
912 node->operatorToken = loc(2);
917 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
918 QSOperator::Div, sym(3).Expression);
919 node->operatorToken = loc(2);
924 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
925 QSOperator::Mod, sym(3).Expression);
926 node->operatorToken = loc(2);
931 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
932 QSOperator::Add, sym(3).Expression);
933 node->operatorToken = loc(2);
938 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
939 QSOperator::Sub, sym(3).Expression);
940 node->operatorToken = loc(2);
945 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
946 QSOperator::LShift, sym(3).Expression);
947 node->operatorToken = loc(2);
952 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
953 QSOperator::RShift, sym(3).Expression);
954 node->operatorToken = loc(2);
959 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
960 QSOperator::URShift, sym(3).Expression);
961 node->operatorToken = loc(2);
966 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
967 QSOperator::Lt, sym(3).Expression);
968 node->operatorToken = loc(2);
973 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
974 QSOperator::Gt, sym(3).Expression);
975 node->operatorToken = loc(2);
980 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
981 QSOperator::Le, sym(3).Expression);
982 node->operatorToken = loc(2);
987 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
988 QSOperator::Ge, sym(3).Expression);
989 node->operatorToken = loc(2);
994 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
995 QSOperator::InstanceOf, sym(3).Expression);
996 node->operatorToken = loc(2);
1001 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1002 QSOperator::In, sym(3).Expression);
1003 node->operatorToken = loc(2);
1008 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1009 QSOperator::Lt, sym(3).Expression);
1010 node->operatorToken = loc(2);
1015 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1016 QSOperator::Gt, sym(3).Expression);
1017 node->operatorToken = loc(2);
1022 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1023 QSOperator::Le, sym(3).Expression);
1024 node->operatorToken = loc(2);
1029 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1030 QSOperator::Ge, sym(3).Expression);
1031 node->operatorToken = loc(2);
1036 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1037 QSOperator::InstanceOf, sym(3).Expression);
1038 node->operatorToken = loc(2);
1043 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1044 QSOperator::Equal, sym(3).Expression);
1045 node->operatorToken = loc(2);
1050 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1051 QSOperator::NotEqual, sym(3).Expression);
1052 node->operatorToken = loc(2);
1057 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1058 QSOperator::StrictEqual, sym(3).Expression);
1059 node->operatorToken = loc(2);
1064 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1065 QSOperator::StrictNotEqual, sym(3).Expression);
1066 node->operatorToken = loc(2);
1071 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1072 QSOperator::Equal, sym(3).Expression);
1073 node->operatorToken = loc(2);
1078 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1079 QSOperator::NotEqual, sym(3).Expression);
1080 node->operatorToken = loc(2);
1085 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1086 QSOperator::StrictEqual, sym(3).Expression);
1087 node->operatorToken = loc(2);
1092 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1093 QSOperator::StrictNotEqual, sym(3).Expression);
1094 node->operatorToken = loc(2);
1099 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1100 QSOperator::BitAnd, sym(3).Expression);
1101 node->operatorToken = loc(2);
1106 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1107 QSOperator::BitAnd, sym(3).Expression);
1108 node->operatorToken = loc(2);
1113 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1114 QSOperator::BitXor, sym(3).Expression);
1115 node->operatorToken = loc(2);
1120 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1121 QSOperator::BitXor, sym(3).Expression);
1122 node->operatorToken = loc(2);
1127 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1128 QSOperator::BitOr, sym(3).Expression);
1129 node->operatorToken = loc(2);
1134 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1135 QSOperator::BitOr, sym(3).Expression);
1136 node->operatorToken = loc(2);
1141 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1142 QSOperator::And, sym(3).Expression);
1143 node->operatorToken = loc(2);
1148 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1149 QSOperator::And, sym(3).Expression);
1150 node->operatorToken = loc(2);
1155 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1156 QSOperator::Or, sym(3).Expression);
1157 node->operatorToken = loc(2);
1162 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1163 QSOperator::Or, sym(3).Expression);
1164 node->operatorToken = loc(2);
1169 AST::ConditionalExpression *node = new (pool) AST::ConditionalExpression(sym(1).Expression,
1170 sym(3).Expression, sym(5).Expression);
1171 node->questionToken = loc(2);
1172 node->colonToken = loc(4);
1177 AST::ConditionalExpression *node = new (pool) AST::ConditionalExpression(sym(1).Expression,
1178 sym(3).Expression, sym(5).Expression);
1179 node->questionToken = loc(2);
1180 node->colonToken = loc(4);
1185 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1186 sym(2).ival, sym(3).Expression);
1187 node->operatorToken = loc(2);
1192 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1193 sym(2).ival, sym(3).Expression);
1194 node->operatorToken = loc(2);
1199 sym(1).ival = QSOperator::Assign;
1203 sym(1).ival = QSOperator::InplaceMul;
1207 sym(1).ival = QSOperator::InplaceDiv;
1211 sym(1).ival = QSOperator::InplaceMod;
1215 sym(1).ival = QSOperator::InplaceAdd;
1219 sym(1).ival = QSOperator::InplaceSub;
1223 sym(1).ival = QSOperator::InplaceLeftShift;
1227 sym(1).ival = QSOperator::InplaceRightShift;
1231 sym(1).ival = QSOperator::InplaceURightShift;
1235 sym(1).ival = QSOperator::InplaceAnd;
1239 sym(1).ival = QSOperator::InplaceXor;
1243 sym(1).ival = QSOperator::InplaceOr;
1247 AST::Expression *node = new (pool) AST::Expression(sym(1).Expression, sym(3).Expression);
1248 node->commaToken = loc(2);
1257 AST::Expression *node = new (pool) AST::Expression(sym(1).Expression, sym(3).Expression);
1258 node->commaToken = loc(2);
1267 AST::Block *node = new (pool) AST::Block(sym(2).StatementList);
1268 node->lbraceToken = loc(1);
1269 node->rbraceToken = loc(3);
1274 sym(1).Node = new (pool) AST::StatementList(sym(1).Statement);
1278 sym(1).Node = new (pool) AST::StatementList(sym(1).StatementList, sym(2).Statement);
1286 sym(1).Node = sym(1).StatementList->finish ();
1290 AST::VariableStatement *node = new (pool) AST::VariableStatement(
1291 sym(2).VariableDeclarationList->finish (/*readOnly=*/sym(1).ival == T_CONST));
1292 node->declarationKindToken = loc(1);
1293 node->semicolonToken = loc(3);
1298 sym(1).ival = T_CONST;
1302 sym(1).ival = T_VAR;
1306 sym(1).Node = new (pool) AST::VariableDeclarationList(sym(1).VariableDeclaration);
1310 AST::VariableDeclarationList *node = new (pool) AST::VariableDeclarationList(
1311 sym(1).VariableDeclarationList, sym(3).VariableDeclaration);
1312 node->commaToken = loc(2);
1317 sym(1).Node = new (pool) AST::VariableDeclarationList(sym(1).VariableDeclaration);
1321 sym(1).Node = new (pool) AST::VariableDeclarationList(sym(1).VariableDeclarationList, sym(3).VariableDeclaration);
1325 AST::VariableDeclaration *node = new (pool) AST::VariableDeclaration(stringRef(1), sym(2).Expression);
1326 node->identifierToken = loc(1);
1331 AST::VariableDeclaration *node = new (pool) AST::VariableDeclaration(stringRef(1), sym(2).Expression);
1332 node->identifierToken = loc(1);
1337 // ### TODO: AST for initializer
1346 // ### TODO: AST for initializer
1355 AST::EmptyStatement *node = new (pool) AST::EmptyStatement();
1356 node->semicolonToken = loc(1);
1361 AST::ExpressionStatement *node = new (pool) AST::ExpressionStatement(sym(1).Expression);
1362 node->semicolonToken = loc(2);
1367 AST::IfStatement *node = new (pool) AST::IfStatement(sym(3).Expression, sym(5).Statement, sym(7).Statement);
1368 node->ifToken = loc(1);
1369 node->lparenToken = loc(2);
1370 node->rparenToken = loc(4);
1371 node->elseToken = loc(6);
1376 AST::IfStatement *node = new (pool) AST::IfStatement(sym(3).Expression, sym(5).Statement);
1377 node->ifToken = loc(1);
1378 node->lparenToken = loc(2);
1379 node->rparenToken = loc(4);
1384 AST::DoWhileStatement *node = new (pool) AST::DoWhileStatement(sym(2).Statement, sym(5).Expression);
1385 node->doToken = loc(1);
1386 node->whileToken = loc(3);
1387 node->lparenToken = loc(4);
1388 node->rparenToken = loc(6);
1389 node->semicolonToken = loc(7);
1394 AST::WhileStatement *node = new (pool) AST::WhileStatement(sym(3).Expression, sym(5).Statement);
1395 node->whileToken = loc(1);
1396 node->lparenToken = loc(2);
1397 node->rparenToken = loc(4);
1402 AST::ForStatement *node = new (pool) AST::ForStatement(sym(3).Expression,
1403 sym(5).Expression, sym(7).Expression, sym(9).Statement);
1404 node->forToken = loc(1);
1405 node->lparenToken = loc(2);
1406 node->firstSemicolonToken = loc(4);
1407 node->secondSemicolonToken = loc(6);
1408 node->rparenToken = loc(8);
1413 AST::LocalForStatement *node = new (pool) AST::LocalForStatement(
1414 sym(4).VariableDeclarationList->finish (/*readOnly=*/false), sym(6).Expression,
1415 sym(8).Expression, sym(10).Statement);
1416 node->forToken = loc(1);
1417 node->lparenToken = loc(2);
1418 node->varToken = loc(3);
1419 node->firstSemicolonToken = loc(5);
1420 node->secondSemicolonToken = loc(7);
1421 node->rparenToken = loc(9);
1426 AST:: ForEachStatement *node = new (pool) AST::ForEachStatement(sym(3).Expression,
1427 sym(5).Expression, sym(7).Statement);
1428 node->forToken = loc(1);
1429 node->lparenToken = loc(2);
1430 node->inToken = loc(4);
1431 node->rparenToken = loc(6);
1436 AST::LocalForEachStatement *node = new (pool) AST::LocalForEachStatement(
1437 sym(4).VariableDeclaration, sym(6).Expression, sym(8).Statement);
1438 node->forToken = loc(1);
1439 node->lparenToken = loc(2);
1440 node->varToken = loc(3);
1441 node->inToken = loc(5);
1442 node->rparenToken = loc(7);
1447 AST::ContinueStatement *node = new (pool) AST::ContinueStatement();
1448 node->continueToken = loc(1);
1449 node->semicolonToken = loc(2);
1454 AST::ContinueStatement *node = new (pool) AST::ContinueStatement(stringRef(2));
1455 node->continueToken = loc(1);
1456 node->identifierToken = loc(2);
1457 node->semicolonToken = loc(3);
1462 AST::BreakStatement *node = new (pool) AST::BreakStatement(QStringRef());
1463 node->breakToken = loc(1);
1464 node->semicolonToken = loc(2);
1469 AST::BreakStatement *node = new (pool) AST::BreakStatement(stringRef(2));
1470 node->breakToken = loc(1);
1471 node->identifierToken = loc(2);
1472 node->semicolonToken = loc(3);
1477 AST::ReturnStatement *node = new (pool) AST::ReturnStatement(sym(2).Expression);
1478 node->returnToken = loc(1);
1479 node->semicolonToken = loc(3);
1484 AST::WithStatement *node = new (pool) AST::WithStatement(sym(3).Expression, sym(5).Statement);
1485 node->withToken = loc(1);
1486 node->lparenToken = loc(2);
1487 node->rparenToken = loc(4);
1492 AST::SwitchStatement *node = new (pool) AST::SwitchStatement(sym(3).Expression, sym(5).CaseBlock);
1493 node->switchToken = loc(1);
1494 node->lparenToken = loc(2);
1495 node->rparenToken = loc(4);
1500 AST::CaseBlock *node = new (pool) AST::CaseBlock(sym(2).CaseClauses);
1501 node->lbraceToken = loc(1);
1502 node->rbraceToken = loc(3);
1507 AST::CaseBlock *node = new (pool) AST::CaseBlock(sym(2).CaseClauses, sym(3).DefaultClause, sym(4).CaseClauses);
1508 node->lbraceToken = loc(1);
1509 node->rbraceToken = loc(5);
1514 sym(1).Node = new (pool) AST::CaseClauses(sym(1).CaseClause);
1518 sym(1).Node = new (pool) AST::CaseClauses(sym(1).CaseClauses, sym(2).CaseClause);
1526 sym(1).Node = sym(1).CaseClauses->finish ();
1530 AST::CaseClause *node = new (pool) AST::CaseClause(sym(2).Expression, sym(4).StatementList);
1531 node->caseToken = loc(1);
1532 node->colonToken = loc(3);
1537 AST::DefaultClause *node = new (pool) AST::DefaultClause(sym(3).StatementList);
1538 node->defaultToken = loc(1);
1539 node->colonToken = loc(2);
1544 AST::LabelledStatement *node = new (pool) AST::LabelledStatement(stringRef(1), sym(3).Statement);
1545 node->identifierToken = loc(1);
1546 node->colonToken = loc(2);
1551 AST::LabelledStatement *node = new (pool) AST::LabelledStatement(stringRef(1), sym(3).Statement);
1552 node->identifierToken = loc(1);
1553 node->colonToken = loc(2);
1558 AST::ThrowStatement *node = new (pool) AST::ThrowStatement(sym(2).Expression);
1559 node->throwToken = loc(1);
1560 node->semicolonToken = loc(3);
1565 AST::TryStatement *node = new (pool) AST::TryStatement(sym(2).Statement, sym(3).Catch);
1566 node->tryToken = loc(1);
1571 AST::TryStatement *node = new (pool) AST::TryStatement(sym(2).Statement, sym(3).Finally);
1572 node->tryToken = loc(1);
1577 AST::TryStatement *node = new (pool) AST::TryStatement(sym(2).Statement, sym(3).Catch, sym(4).Finally);
1578 node->tryToken = loc(1);
1583 AST::Catch *node = new (pool) AST::Catch(stringRef(3), sym(5).Block);
1584 node->catchToken = loc(1);
1585 node->lparenToken = loc(2);
1586 node->identifierToken = loc(3);
1587 node->rparenToken = loc(4);
1592 AST::Finally *node = new (pool) AST::Finally(sym(2).Block);
1593 node->finallyToken = loc(1);
1598 AST::DebuggerStatement *node = new (pool) AST::DebuggerStatement();
1599 node->debuggerToken = loc(1);
1600 node->semicolonToken = loc(2);
1605 AST::FunctionDeclaration *node = new (pool) AST::FunctionDeclaration(stringRef(2), sym(4).FormalParameterList, sym(7).FunctionBody);
1606 node->functionToken = loc(1);
1607 node->identifierToken = loc(2);
1608 node->lparenToken = loc(3);
1609 node->rparenToken = loc(5);
1610 node->lbraceToken = loc(6);
1611 node->rbraceToken = loc(8);
1616 AST::FunctionExpression *node = new (pool) AST::FunctionExpression(stringRef(2), sym(4).FormalParameterList, sym(7).FunctionBody);
1617 node->functionToken = loc(1);
1618 if (! stringRef(2).isNull())
1619 node->identifierToken = loc(2);
1620 node->lparenToken = loc(3);
1621 node->rparenToken = loc(5);
1622 node->lbraceToken = loc(6);
1623 node->rbraceToken = loc(8);
1628 AST::FormalParameterList *node = new (pool) AST::FormalParameterList(stringRef(1));
1629 node->identifierToken = loc(1);
1634 AST::FormalParameterList *node = new (pool) AST::FormalParameterList(sym(1).FormalParameterList, stringRef(3));
1635 node->commaToken = loc(2);
1636 node->identifierToken = loc(3);
1645 sym(1).Node = sym(1).FormalParameterList->finish ();
1653 sym(1).Node = new (pool) AST::FunctionBody(sym(1).SourceElements->finish ());
1657 sym(1).Node = new (pool) AST::Program(sym(1).SourceElements->finish ());
1661 sym(1).Node = new (pool) AST::SourceElements(sym(1).SourceElement);
1665 sym(1).Node = new (pool) AST::SourceElements(sym(1).SourceElements, sym(2).SourceElement);
1669 sym(1).Node = new (pool) AST::StatementSourceElement(sym(1).Statement);
1673 sym(1).Node = new (pool) AST::FunctionSourceElement(sym(1).FunctionDeclaration);
1677 stringRef(1) = QStringRef();
1685 action = nt_action(state_stack[tos], lhs[r] - TERMINAL_COUNT);
1687 } while (action != 0);
1689 if (first_token == last_token) {
1690 const int errorState = state_stack[tos];
1692 // automatic insertion of `;'
1693 if (yytoken != -1 && t_action(errorState, T_AUTOMATIC_SEMICOLON) && lexer->canInsertAutomaticSemicolon(yytoken)) {
1694 SavedToken &tk = token_buffer[0];
1697 tk.spell = yytokenspell;
1700 yylloc = yyprevlloc;
1701 yylloc.offset += yylloc.length;
1702 yylloc.startColumn += yylloc.length;
1705 //const QString msg = qApp->translate("QDeclarativeParser", "Missing `;'");
1706 //diagnostic_messages.append(DiagnosticMessage(DiagnosticMessage::Warning, yylloc, msg));
1708 first_token = &token_buffer[0];
1709 last_token = &token_buffer[1];
1711 yytoken = T_SEMICOLON;
1714 action = errorState;
1721 token_buffer[0].token = yytoken;
1722 token_buffer[0].dval = yylval;
1723 token_buffer[0].spell = yytokenspell;
1724 token_buffer[0].loc = yylloc;
1726 token_buffer[1].token = yytoken = lexer->lex();
1727 token_buffer[1].dval = yylval = lexer->tokenValue();
1728 token_buffer[1].spell = yytokenspell = lexer->tokenSpell();
1729 token_buffer[1].loc = yylloc = location(lexer);
1731 if (t_action(errorState, yytoken)) {
1733 int token = token_buffer[0].token;
1734 if (token < 0 || token >= TERMINAL_COUNT)
1735 msg = qApp->translate("QDeclarativeParser", "Syntax error");
1737 msg = qApp->translate("QDeclarativeParser", "Unexpected token `%1'").arg(QLatin1String(spell[token]));
1738 diagnostic_messages.append(DiagnosticMessage(DiagnosticMessage::Error, token_buffer[0].loc, msg));
1740 action = errorState;
1744 static int tokens[] = {
1752 T_RPAREN, T_RBRACKET, T_RBRACE,
1757 T_LPAREN, T_LBRACKET, T_LBRACE,
1762 for (int *tk = tokens; *tk != EOF_SYMBOL; ++tk) {
1763 int a = t_action(errorState, *tk);
1764 if (a > 0 && t_action(a, yytoken)) {
1765 const QString msg = qApp->translate("QDeclarativeParser", "Expected token `%1'").arg(QLatin1String(spell[*tk]));
1766 diagnostic_messages.append(DiagnosticMessage(DiagnosticMessage::Error, token_buffer[0].loc, msg));
1770 yylloc = token_buffer[0].loc;
1773 first_token = &token_buffer[0];
1774 last_token = &token_buffer[2];
1776 action = errorState;
1781 for (int tk = 1; tk < TERMINAL_COUNT; ++tk) {
1782 if (tk == T_AUTOMATIC_SEMICOLON || tk == T_FEED_UI_PROGRAM ||
1783 tk == T_FEED_JS_STATEMENT || tk == T_FEED_JS_EXPRESSION ||
1784 tk == T_FEED_JS_SOURCE_ELEMENT)
1787 int a = t_action(errorState, tk);
1788 if (a > 0 && t_action(a, yytoken)) {
1789 const QString msg = qApp->translate("QDeclarativeParser", "Expected token `%1'").arg(QLatin1String(spell[tk]));
1790 diagnostic_messages.append(DiagnosticMessage(DiagnosticMessage::Error, token_buffer[0].loc, msg));
1794 yylloc = token_buffer[0].loc;
1797 action = errorState;
1802 const QString msg = qApp->translate("QDeclarativeParser", "Syntax error");
1803 diagnostic_messages.append(DiagnosticMessage(DiagnosticMessage::Error, token_buffer[0].loc, msg));
1809 QT_QML_END_NAMESPACE