1 /****************************************************************************
3 ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
4 ** All rights reserved.
5 ** Contact: http://www.qt-project.org/
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*> (realloc(sym_stack, stack_size * sizeof(Value)));
74 state_stack = reinterpret_cast<int*> (realloc(state_stack, stack_size * sizeof(int)));
75 location_stack = reinterpret_cast<AST::SourceLocation*> (realloc(location_stack, stack_size * sizeof(AST::SourceLocation)));
76 string_stack = reinterpret_cast<QStringRef*> (realloc(string_stack, stack_size * sizeof(QStringRef)));
79 Parser::Parser(Engine *engine):
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->propertyTypeToken = loc(1);
382 node->identifierToken = loc(2);
387 AST::UiParameterList *node = new (pool) AST::UiParameterList(sym(1).UiParameterList, stringRef(3), stringRef(4));
388 node->commaToken = loc(2);
389 node->identifierToken = loc(4);
394 AST::UiPublicMember *node = new (pool) AST::UiPublicMember(QStringRef(), stringRef(2));
395 node->type = AST::UiPublicMember::Signal;
396 node->propertyToken = loc(1);
397 node->typeToken = loc(2);
398 node->identifierToken = loc(2);
399 node->parameters = sym(4).UiParameterList;
400 node->semicolonToken = loc(6);
405 AST::UiPublicMember *node = new (pool) AST::UiPublicMember(QStringRef(), stringRef(2));
406 node->type = AST::UiPublicMember::Signal;
407 node->propertyToken = loc(1);
408 node->typeToken = loc(2);
409 node->identifierToken = loc(2);
410 node->semicolonToken = loc(3);
415 AST::UiPublicMember *node = new (pool) AST::UiPublicMember(stringRef(4), stringRef(6));
416 node->typeModifier = stringRef(2);
417 node->propertyToken = loc(1);
418 node->typeModifierToken = loc(2);
419 node->typeToken = loc(4);
420 node->identifierToken = loc(6);
421 node->semicolonToken = loc(7);
426 AST::UiPublicMember *node = new (pool) AST::UiPublicMember(stringRef(2), stringRef(3));
427 node->propertyToken = loc(1);
428 node->typeToken = loc(2);
429 node->identifierToken = loc(3);
430 node->semicolonToken = loc(4);
435 AST::UiPublicMember *node = new (pool) AST::UiPublicMember(stringRef(3), stringRef(4));
436 node->isDefaultMember = true;
437 node->defaultToken = loc(1);
438 node->propertyToken = loc(2);
439 node->typeToken = loc(3);
440 node->identifierToken = loc(4);
441 node->semicolonToken = loc(5);
446 AST::UiPublicMember *node = new (pool) AST::UiPublicMember(stringRef(2), stringRef(3),
448 node->propertyToken = loc(1);
449 node->typeToken = loc(2);
450 node->identifierToken = loc(3);
451 node->colonToken = loc(4);
456 AST::UiPublicMember *node = new (pool) AST::UiPublicMember(stringRef(3), stringRef(4),
458 node->isReadonlyMember = true;
459 node->readonlyToken = loc(1);
460 node->propertyToken = loc(2);
461 node->typeToken = loc(3);
462 node->identifierToken = loc(4);
463 node->colonToken = loc(5);
468 AST::UiPublicMember *node = new (pool) AST::UiPublicMember(stringRef(3), stringRef(4),
470 node->isDefaultMember = true;
471 node->defaultToken = loc(1);
472 node->propertyToken = loc(2);
473 node->typeToken = loc(3);
474 node->identifierToken = loc(4);
475 node->colonToken = loc(5);
480 AST::UiPublicMember *node = new (pool) AST::UiPublicMember(stringRef(4), stringRef(6));
481 node->typeModifier = stringRef(2);
482 node->propertyToken = loc(1);
483 node->typeModifierToken = loc(2);
484 node->typeToken = loc(4);
485 node->identifierToken = loc(6);
486 node->semicolonToken = loc(7); // insert a fake ';' before ':'
488 AST::UiQualifiedId *propertyName = new (pool) AST::UiQualifiedId(stringRef(6));
489 propertyName->identifierToken = loc(6);
490 propertyName->next = 0;
492 AST::UiArrayBinding *binding = new (pool) AST::UiArrayBinding(
493 propertyName, sym(9).UiArrayMemberList->finish());
494 binding->colonToken = loc(7);
495 binding->lbracketToken = loc(8);
496 binding->rbracketToken = loc(10);
498 node->binding = binding;
504 AST::UiPublicMember *node = new (pool) AST::UiPublicMember(stringRef(2), stringRef(3));
505 node->propertyToken = loc(1);
506 node->typeToken = loc(2);
507 node->identifierToken = loc(3);
508 node->semicolonToken = loc(4); // insert a fake ';' before ':'
510 AST::UiQualifiedId *propertyName = new (pool) AST::UiQualifiedId(stringRef(3));
511 propertyName->identifierToken = loc(3);
512 propertyName->next = 0;
514 AST::UiObjectBinding *binding = new (pool) AST::UiObjectBinding(
515 propertyName, sym(5).UiQualifiedId, sym(6).UiObjectInitializer);
516 binding->colonToken = loc(4);
518 node->binding = binding;
524 sym(1).Node = new (pool) AST::UiSourceElement(sym(1).Node);
528 sym(1).Node = new (pool) AST::UiSourceElement(sym(1).Node);
532 AST::ThisExpression *node = new (pool) AST::ThisExpression();
533 node->thisToken = loc(1);
538 AST::IdentifierExpression *node = new (pool) AST::IdentifierExpression(stringRef(1));
539 node->identifierToken = loc(1);
544 AST::NullExpression *node = new (pool) AST::NullExpression();
545 node->nullToken = loc(1);
550 AST::TrueLiteral *node = new (pool) AST::TrueLiteral();
551 node->trueToken = loc(1);
556 AST::FalseLiteral *node = new (pool) AST::FalseLiteral();
557 node->falseToken = loc(1);
562 AST::NumericLiteral *node = new (pool) AST::NumericLiteral(sym(1).dval);
563 node->literalToken = loc(1);
568 AST::StringLiteral *node = new (pool) AST::StringLiteral(stringRef(1));
569 node->literalToken = loc(1);
574 bool rx = lexer->scanRegExp(Lexer::NoPrefix);
576 diagnostic_messages.append(DiagnosticMessage(DiagnosticMessage::Error, location(lexer), lexer->errorMessage()));
577 return false; // ### remove me
580 loc(1).length = lexer->tokenLength();
581 yylloc = loc(1); // adjust the location of the current token
583 AST::RegExpLiteral *node = new (pool) AST::RegExpLiteral(
584 driver->newStringRef(lexer->regExpPattern()), lexer->regExpFlags());
585 node->literalToken = loc(1);
590 bool rx = lexer->scanRegExp(Lexer::EqualPrefix);
592 diagnostic_messages.append(DiagnosticMessage(DiagnosticMessage::Error, location(lexer), lexer->errorMessage()));
596 loc(1).length = lexer->tokenLength();
597 yylloc = loc(1); // adjust the location of the current token
599 AST::RegExpLiteral *node = new (pool) AST::RegExpLiteral(
600 driver->newStringRef(lexer->regExpPattern()), lexer->regExpFlags());
601 node->literalToken = loc(1);
606 AST::ArrayLiteral *node = new (pool) AST::ArrayLiteral((AST::Elision *) 0);
607 node->lbracketToken = loc(1);
608 node->rbracketToken = loc(2);
613 AST::ArrayLiteral *node = new (pool) AST::ArrayLiteral(sym(2).Elision->finish());
614 node->lbracketToken = loc(1);
615 node->rbracketToken = loc(3);
620 AST::ArrayLiteral *node = new (pool) AST::ArrayLiteral(sym(2).ElementList->finish ());
621 node->lbracketToken = loc(1);
622 node->rbracketToken = loc(3);
627 AST::ArrayLiteral *node = new (pool) AST::ArrayLiteral(sym(2).ElementList->finish (),
629 node->lbracketToken = loc(1);
630 node->commaToken = loc(3);
631 node->rbracketToken = loc(4);
636 AST::ArrayLiteral *node = new (pool) AST::ArrayLiteral(sym(2).ElementList->finish (),
637 sym(4).Elision->finish());
638 node->lbracketToken = loc(1);
639 node->commaToken = loc(3);
640 node->rbracketToken = loc(5);
645 AST::ObjectLiteral *node = 0;
647 node = new (pool) AST::ObjectLiteral(
648 sym(2).PropertyNameAndValueList->finish ());
650 node = new (pool) AST::ObjectLiteral();
651 node->lbraceToken = loc(1);
652 node->rbraceToken = loc(3);
657 AST::ObjectLiteral *node = new (pool) AST::ObjectLiteral(
658 sym(2).PropertyNameAndValueList->finish ());
659 node->lbraceToken = loc(1);
660 node->rbraceToken = loc(4);
665 AST::NestedExpression *node = new (pool) AST::NestedExpression(sym(2).Expression);
666 node->lparenToken = loc(1);
667 node->rparenToken = loc(3);
672 if (AST::ArrayMemberExpression *mem = AST::cast<AST::ArrayMemberExpression *>(sym(1).Expression)) {
673 diagnostic_messages.append(DiagnosticMessage(DiagnosticMessage::Warning, mem->lbracketToken,
674 QLatin1String("Ignored annotation")));
676 sym(1).Expression = mem->base;
679 if (AST::UiQualifiedId *qualifiedId = reparseAsQualifiedId(sym(1).Expression)) {
680 sym(1).UiQualifiedId = qualifiedId;
682 sym(1).UiQualifiedId = 0;
684 diagnostic_messages.append(DiagnosticMessage(DiagnosticMessage::Error, loc(1),
685 QLatin1String("Expected a qualified name id")));
687 return false; // ### recover
692 sym(1).Node = new (pool) AST::ElementList((AST::Elision *) 0, sym(1).Expression);
696 sym(1).Node = new (pool) AST::ElementList(sym(1).Elision->finish(), sym(2).Expression);
700 AST::ElementList *node = new (pool) AST::ElementList(sym(1).ElementList,
701 (AST::Elision *) 0, sym(3).Expression);
702 node->commaToken = loc(2);
707 AST::ElementList *node = new (pool) AST::ElementList(sym(1).ElementList, sym(3).Elision->finish(),
709 node->commaToken = loc(2);
714 AST::Elision *node = new (pool) AST::Elision();
715 node->commaToken = loc(1);
720 AST::Elision *node = new (pool) AST::Elision(sym(1).Elision);
721 node->commaToken = loc(2);
726 AST::PropertyNameAndValueList *node = new (pool) AST::PropertyNameAndValueList(
727 sym(1).PropertyName, sym(3).Expression);
728 node->colonToken = loc(2);
733 AST::PropertyNameAndValueList *node = new (pool) AST::PropertyNameAndValueList(
734 sym(1).PropertyNameAndValueList, sym(3).PropertyName, sym(5).Expression);
735 node->commaToken = loc(2);
736 node->colonToken = loc(4);
741 AST::IdentifierPropertyName *node = new (pool) AST::IdentifierPropertyName(stringRef(1));
742 node->propertyNameToken = loc(1);
747 AST::IdentifierPropertyName *node = new (pool) AST::IdentifierPropertyName(stringRef(1));
748 node->propertyNameToken = loc(1);
753 AST::StringLiteralPropertyName *node = new (pool) AST::StringLiteralPropertyName(stringRef(1));
754 node->propertyNameToken = loc(1);
759 AST::NumericLiteralPropertyName *node = new (pool) AST::NumericLiteralPropertyName(sym(1).dval);
760 node->propertyNameToken = loc(1);
765 AST::IdentifierPropertyName *node = new (pool) AST::IdentifierPropertyName(stringRef(1));
766 node->propertyNameToken = loc(1);
771 AST::ArrayMemberExpression *node = new (pool) AST::ArrayMemberExpression(sym(1).Expression, sym(3).Expression);
772 node->lbracketToken = loc(2);
773 node->rbracketToken = loc(4);
778 AST::FieldMemberExpression *node = new (pool) AST::FieldMemberExpression(sym(1).Expression, stringRef(3));
779 node->dotToken = loc(2);
780 node->identifierToken = loc(3);
785 AST::NewMemberExpression *node = new (pool) AST::NewMemberExpression(sym(2).Expression, sym(4).ArgumentList);
786 node->newToken = loc(1);
787 node->lparenToken = loc(3);
788 node->rparenToken = loc(5);
793 AST::NewExpression *node = new (pool) AST::NewExpression(sym(2).Expression);
794 node->newToken = loc(1);
799 AST::CallExpression *node = new (pool) AST::CallExpression(sym(1).Expression, sym(3).ArgumentList);
800 node->lparenToken = loc(2);
801 node->rparenToken = loc(4);
806 AST::CallExpression *node = new (pool) AST::CallExpression(sym(1).Expression, sym(3).ArgumentList);
807 node->lparenToken = loc(2);
808 node->rparenToken = loc(4);
813 AST::ArrayMemberExpression *node = new (pool) AST::ArrayMemberExpression(sym(1).Expression, sym(3).Expression);
814 node->lbracketToken = loc(2);
815 node->rbracketToken = loc(4);
820 AST::FieldMemberExpression *node = new (pool) AST::FieldMemberExpression(sym(1).Expression, stringRef(3));
821 node->dotToken = loc(2);
822 node->identifierToken = loc(3);
831 sym(1).Node = sym(1).ArgumentList->finish();
835 sym(1).Node = new (pool) AST::ArgumentList(sym(1).Expression);
839 AST::ArgumentList *node = new (pool) AST::ArgumentList(sym(1).ArgumentList, sym(3).Expression);
840 node->commaToken = loc(2);
845 AST::PostIncrementExpression *node = new (pool) AST::PostIncrementExpression(sym(1).Expression);
846 node->incrementToken = loc(2);
851 AST::PostDecrementExpression *node = new (pool) AST::PostDecrementExpression(sym(1).Expression);
852 node->decrementToken = loc(2);
857 AST::DeleteExpression *node = new (pool) AST::DeleteExpression(sym(2).Expression);
858 node->deleteToken = loc(1);
863 AST::VoidExpression *node = new (pool) AST::VoidExpression(sym(2).Expression);
864 node->voidToken = loc(1);
869 AST::TypeOfExpression *node = new (pool) AST::TypeOfExpression(sym(2).Expression);
870 node->typeofToken = loc(1);
875 AST::PreIncrementExpression *node = new (pool) AST::PreIncrementExpression(sym(2).Expression);
876 node->incrementToken = loc(1);
881 AST::PreDecrementExpression *node = new (pool) AST::PreDecrementExpression(sym(2).Expression);
882 node->decrementToken = loc(1);
887 AST::UnaryPlusExpression *node = new (pool) AST::UnaryPlusExpression(sym(2).Expression);
888 node->plusToken = loc(1);
893 AST::UnaryMinusExpression *node = new (pool) AST::UnaryMinusExpression(sym(2).Expression);
894 node->minusToken = loc(1);
899 AST::TildeExpression *node = new (pool) AST::TildeExpression(sym(2).Expression);
900 node->tildeToken = loc(1);
905 AST::NotExpression *node = new (pool) AST::NotExpression(sym(2).Expression);
906 node->notToken = loc(1);
911 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
912 QSOperator::Mul, sym(3).Expression);
913 node->operatorToken = loc(2);
918 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
919 QSOperator::Div, sym(3).Expression);
920 node->operatorToken = loc(2);
925 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
926 QSOperator::Mod, sym(3).Expression);
927 node->operatorToken = loc(2);
932 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
933 QSOperator::Add, sym(3).Expression);
934 node->operatorToken = loc(2);
939 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
940 QSOperator::Sub, sym(3).Expression);
941 node->operatorToken = loc(2);
946 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
947 QSOperator::LShift, sym(3).Expression);
948 node->operatorToken = loc(2);
953 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
954 QSOperator::RShift, sym(3).Expression);
955 node->operatorToken = loc(2);
960 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
961 QSOperator::URShift, sym(3).Expression);
962 node->operatorToken = loc(2);
967 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
968 QSOperator::Lt, sym(3).Expression);
969 node->operatorToken = loc(2);
974 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
975 QSOperator::Gt, sym(3).Expression);
976 node->operatorToken = loc(2);
981 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
982 QSOperator::Le, sym(3).Expression);
983 node->operatorToken = loc(2);
988 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
989 QSOperator::Ge, sym(3).Expression);
990 node->operatorToken = loc(2);
995 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
996 QSOperator::InstanceOf, sym(3).Expression);
997 node->operatorToken = loc(2);
1002 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1003 QSOperator::In, sym(3).Expression);
1004 node->operatorToken = loc(2);
1009 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1010 QSOperator::Lt, sym(3).Expression);
1011 node->operatorToken = loc(2);
1016 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1017 QSOperator::Gt, sym(3).Expression);
1018 node->operatorToken = loc(2);
1023 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1024 QSOperator::Le, sym(3).Expression);
1025 node->operatorToken = loc(2);
1030 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1031 QSOperator::Ge, sym(3).Expression);
1032 node->operatorToken = loc(2);
1037 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1038 QSOperator::InstanceOf, sym(3).Expression);
1039 node->operatorToken = loc(2);
1044 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1045 QSOperator::Equal, sym(3).Expression);
1046 node->operatorToken = loc(2);
1051 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1052 QSOperator::NotEqual, sym(3).Expression);
1053 node->operatorToken = loc(2);
1058 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1059 QSOperator::StrictEqual, sym(3).Expression);
1060 node->operatorToken = loc(2);
1065 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1066 QSOperator::StrictNotEqual, sym(3).Expression);
1067 node->operatorToken = loc(2);
1072 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1073 QSOperator::Equal, sym(3).Expression);
1074 node->operatorToken = loc(2);
1079 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1080 QSOperator::NotEqual, sym(3).Expression);
1081 node->operatorToken = loc(2);
1086 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1087 QSOperator::StrictEqual, sym(3).Expression);
1088 node->operatorToken = loc(2);
1093 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1094 QSOperator::StrictNotEqual, sym(3).Expression);
1095 node->operatorToken = loc(2);
1100 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1101 QSOperator::BitAnd, sym(3).Expression);
1102 node->operatorToken = loc(2);
1107 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1108 QSOperator::BitAnd, sym(3).Expression);
1109 node->operatorToken = loc(2);
1114 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1115 QSOperator::BitXor, sym(3).Expression);
1116 node->operatorToken = loc(2);
1121 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1122 QSOperator::BitXor, sym(3).Expression);
1123 node->operatorToken = loc(2);
1128 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1129 QSOperator::BitOr, sym(3).Expression);
1130 node->operatorToken = loc(2);
1135 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1136 QSOperator::BitOr, sym(3).Expression);
1137 node->operatorToken = loc(2);
1142 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1143 QSOperator::And, sym(3).Expression);
1144 node->operatorToken = loc(2);
1149 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1150 QSOperator::And, sym(3).Expression);
1151 node->operatorToken = loc(2);
1156 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1157 QSOperator::Or, sym(3).Expression);
1158 node->operatorToken = loc(2);
1163 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1164 QSOperator::Or, sym(3).Expression);
1165 node->operatorToken = loc(2);
1170 AST::ConditionalExpression *node = new (pool) AST::ConditionalExpression(sym(1).Expression,
1171 sym(3).Expression, sym(5).Expression);
1172 node->questionToken = loc(2);
1173 node->colonToken = loc(4);
1178 AST::ConditionalExpression *node = new (pool) AST::ConditionalExpression(sym(1).Expression,
1179 sym(3).Expression, sym(5).Expression);
1180 node->questionToken = loc(2);
1181 node->colonToken = loc(4);
1186 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1187 sym(2).ival, sym(3).Expression);
1188 node->operatorToken = loc(2);
1193 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1194 sym(2).ival, sym(3).Expression);
1195 node->operatorToken = loc(2);
1200 sym(1).ival = QSOperator::Assign;
1204 sym(1).ival = QSOperator::InplaceMul;
1208 sym(1).ival = QSOperator::InplaceDiv;
1212 sym(1).ival = QSOperator::InplaceMod;
1216 sym(1).ival = QSOperator::InplaceAdd;
1220 sym(1).ival = QSOperator::InplaceSub;
1224 sym(1).ival = QSOperator::InplaceLeftShift;
1228 sym(1).ival = QSOperator::InplaceRightShift;
1232 sym(1).ival = QSOperator::InplaceURightShift;
1236 sym(1).ival = QSOperator::InplaceAnd;
1240 sym(1).ival = QSOperator::InplaceXor;
1244 sym(1).ival = QSOperator::InplaceOr;
1248 AST::Expression *node = new (pool) AST::Expression(sym(1).Expression, sym(3).Expression);
1249 node->commaToken = loc(2);
1258 AST::Expression *node = new (pool) AST::Expression(sym(1).Expression, sym(3).Expression);
1259 node->commaToken = loc(2);
1268 AST::Block *node = new (pool) AST::Block(sym(2).StatementList);
1269 node->lbraceToken = loc(1);
1270 node->rbraceToken = loc(3);
1275 sym(1).Node = new (pool) AST::StatementList(sym(1).Statement);
1279 sym(1).Node = new (pool) AST::StatementList(sym(1).StatementList, sym(2).Statement);
1287 sym(1).Node = sym(1).StatementList->finish ();
1291 AST::VariableStatement *node = new (pool) AST::VariableStatement(
1292 sym(2).VariableDeclarationList->finish (/*readOnly=*/sym(1).ival == T_CONST));
1293 node->declarationKindToken = loc(1);
1294 node->semicolonToken = loc(3);
1299 sym(1).ival = T_CONST;
1303 sym(1).ival = T_VAR;
1307 sym(1).Node = new (pool) AST::VariableDeclarationList(sym(1).VariableDeclaration);
1311 AST::VariableDeclarationList *node = new (pool) AST::VariableDeclarationList(
1312 sym(1).VariableDeclarationList, sym(3).VariableDeclaration);
1313 node->commaToken = loc(2);
1318 sym(1).Node = new (pool) AST::VariableDeclarationList(sym(1).VariableDeclaration);
1322 sym(1).Node = new (pool) AST::VariableDeclarationList(sym(1).VariableDeclarationList, sym(3).VariableDeclaration);
1326 AST::VariableDeclaration *node = new (pool) AST::VariableDeclaration(stringRef(1), sym(2).Expression);
1327 node->identifierToken = loc(1);
1332 AST::VariableDeclaration *node = new (pool) AST::VariableDeclaration(stringRef(1), sym(2).Expression);
1333 node->identifierToken = loc(1);
1338 // ### TODO: AST for initializer
1347 // ### TODO: AST for initializer
1356 AST::EmptyStatement *node = new (pool) AST::EmptyStatement();
1357 node->semicolonToken = loc(1);
1362 AST::ExpressionStatement *node = new (pool) AST::ExpressionStatement(sym(1).Expression);
1363 node->semicolonToken = loc(2);
1368 AST::IfStatement *node = new (pool) AST::IfStatement(sym(3).Expression, sym(5).Statement, sym(7).Statement);
1369 node->ifToken = loc(1);
1370 node->lparenToken = loc(2);
1371 node->rparenToken = loc(4);
1372 node->elseToken = loc(6);
1377 AST::IfStatement *node = new (pool) AST::IfStatement(sym(3).Expression, sym(5).Statement);
1378 node->ifToken = loc(1);
1379 node->lparenToken = loc(2);
1380 node->rparenToken = loc(4);
1385 AST::DoWhileStatement *node = new (pool) AST::DoWhileStatement(sym(2).Statement, sym(5).Expression);
1386 node->doToken = loc(1);
1387 node->whileToken = loc(3);
1388 node->lparenToken = loc(4);
1389 node->rparenToken = loc(6);
1390 node->semicolonToken = loc(7);
1395 AST::WhileStatement *node = new (pool) AST::WhileStatement(sym(3).Expression, sym(5).Statement);
1396 node->whileToken = loc(1);
1397 node->lparenToken = loc(2);
1398 node->rparenToken = loc(4);
1403 AST::ForStatement *node = new (pool) AST::ForStatement(sym(3).Expression,
1404 sym(5).Expression, sym(7).Expression, sym(9).Statement);
1405 node->forToken = loc(1);
1406 node->lparenToken = loc(2);
1407 node->firstSemicolonToken = loc(4);
1408 node->secondSemicolonToken = loc(6);
1409 node->rparenToken = loc(8);
1414 AST::LocalForStatement *node = new (pool) AST::LocalForStatement(
1415 sym(4).VariableDeclarationList->finish (/*readOnly=*/false), sym(6).Expression,
1416 sym(8).Expression, sym(10).Statement);
1417 node->forToken = loc(1);
1418 node->lparenToken = loc(2);
1419 node->varToken = loc(3);
1420 node->firstSemicolonToken = loc(5);
1421 node->secondSemicolonToken = loc(7);
1422 node->rparenToken = loc(9);
1427 AST:: ForEachStatement *node = new (pool) AST::ForEachStatement(sym(3).Expression,
1428 sym(5).Expression, sym(7).Statement);
1429 node->forToken = loc(1);
1430 node->lparenToken = loc(2);
1431 node->inToken = loc(4);
1432 node->rparenToken = loc(6);
1437 AST::LocalForEachStatement *node = new (pool) AST::LocalForEachStatement(
1438 sym(4).VariableDeclaration, sym(6).Expression, sym(8).Statement);
1439 node->forToken = loc(1);
1440 node->lparenToken = loc(2);
1441 node->varToken = loc(3);
1442 node->inToken = loc(5);
1443 node->rparenToken = loc(7);
1448 AST::ContinueStatement *node = new (pool) AST::ContinueStatement();
1449 node->continueToken = loc(1);
1450 node->semicolonToken = loc(2);
1455 AST::ContinueStatement *node = new (pool) AST::ContinueStatement(stringRef(2));
1456 node->continueToken = loc(1);
1457 node->identifierToken = loc(2);
1458 node->semicolonToken = loc(3);
1463 AST::BreakStatement *node = new (pool) AST::BreakStatement(QStringRef());
1464 node->breakToken = loc(1);
1465 node->semicolonToken = loc(2);
1470 AST::BreakStatement *node = new (pool) AST::BreakStatement(stringRef(2));
1471 node->breakToken = loc(1);
1472 node->identifierToken = loc(2);
1473 node->semicolonToken = loc(3);
1478 AST::ReturnStatement *node = new (pool) AST::ReturnStatement(sym(2).Expression);
1479 node->returnToken = loc(1);
1480 node->semicolonToken = loc(3);
1485 AST::WithStatement *node = new (pool) AST::WithStatement(sym(3).Expression, sym(5).Statement);
1486 node->withToken = loc(1);
1487 node->lparenToken = loc(2);
1488 node->rparenToken = loc(4);
1493 AST::SwitchStatement *node = new (pool) AST::SwitchStatement(sym(3).Expression, sym(5).CaseBlock);
1494 node->switchToken = loc(1);
1495 node->lparenToken = loc(2);
1496 node->rparenToken = loc(4);
1501 AST::CaseBlock *node = new (pool) AST::CaseBlock(sym(2).CaseClauses);
1502 node->lbraceToken = loc(1);
1503 node->rbraceToken = loc(3);
1508 AST::CaseBlock *node = new (pool) AST::CaseBlock(sym(2).CaseClauses, sym(3).DefaultClause, sym(4).CaseClauses);
1509 node->lbraceToken = loc(1);
1510 node->rbraceToken = loc(5);
1515 sym(1).Node = new (pool) AST::CaseClauses(sym(1).CaseClause);
1519 sym(1).Node = new (pool) AST::CaseClauses(sym(1).CaseClauses, sym(2).CaseClause);
1527 sym(1).Node = sym(1).CaseClauses->finish ();
1531 AST::CaseClause *node = new (pool) AST::CaseClause(sym(2).Expression, sym(4).StatementList);
1532 node->caseToken = loc(1);
1533 node->colonToken = loc(3);
1538 AST::DefaultClause *node = new (pool) AST::DefaultClause(sym(3).StatementList);
1539 node->defaultToken = loc(1);
1540 node->colonToken = loc(2);
1545 AST::LabelledStatement *node = new (pool) AST::LabelledStatement(stringRef(1), sym(3).Statement);
1546 node->identifierToken = loc(1);
1547 node->colonToken = loc(2);
1552 AST::LabelledStatement *node = new (pool) AST::LabelledStatement(stringRef(1), sym(3).Statement);
1553 node->identifierToken = loc(1);
1554 node->colonToken = loc(2);
1559 AST::ThrowStatement *node = new (pool) AST::ThrowStatement(sym(2).Expression);
1560 node->throwToken = loc(1);
1561 node->semicolonToken = loc(3);
1566 AST::TryStatement *node = new (pool) AST::TryStatement(sym(2).Statement, sym(3).Catch);
1567 node->tryToken = loc(1);
1572 AST::TryStatement *node = new (pool) AST::TryStatement(sym(2).Statement, sym(3).Finally);
1573 node->tryToken = loc(1);
1578 AST::TryStatement *node = new (pool) AST::TryStatement(sym(2).Statement, sym(3).Catch, sym(4).Finally);
1579 node->tryToken = loc(1);
1584 AST::Catch *node = new (pool) AST::Catch(stringRef(3), sym(5).Block);
1585 node->catchToken = loc(1);
1586 node->lparenToken = loc(2);
1587 node->identifierToken = loc(3);
1588 node->rparenToken = loc(4);
1593 AST::Finally *node = new (pool) AST::Finally(sym(2).Block);
1594 node->finallyToken = loc(1);
1599 AST::DebuggerStatement *node = new (pool) AST::DebuggerStatement();
1600 node->debuggerToken = loc(1);
1601 node->semicolonToken = loc(2);
1606 AST::FunctionDeclaration *node = new (pool) AST::FunctionDeclaration(stringRef(2), sym(4).FormalParameterList, sym(7).FunctionBody);
1607 node->functionToken = loc(1);
1608 node->identifierToken = loc(2);
1609 node->lparenToken = loc(3);
1610 node->rparenToken = loc(5);
1611 node->lbraceToken = loc(6);
1612 node->rbraceToken = loc(8);
1617 AST::FunctionExpression *node = new (pool) AST::FunctionExpression(stringRef(2), sym(4).FormalParameterList, sym(7).FunctionBody);
1618 node->functionToken = loc(1);
1619 if (! stringRef(2).isNull())
1620 node->identifierToken = loc(2);
1621 node->lparenToken = loc(3);
1622 node->rparenToken = loc(5);
1623 node->lbraceToken = loc(6);
1624 node->rbraceToken = loc(8);
1629 AST::FormalParameterList *node = new (pool) AST::FormalParameterList(stringRef(1));
1630 node->identifierToken = loc(1);
1635 AST::FormalParameterList *node = new (pool) AST::FormalParameterList(sym(1).FormalParameterList, stringRef(3));
1636 node->commaToken = loc(2);
1637 node->identifierToken = loc(3);
1646 sym(1).Node = sym(1).FormalParameterList->finish ();
1654 sym(1).Node = new (pool) AST::FunctionBody(sym(1).SourceElements->finish ());
1658 sym(1).Node = new (pool) AST::Program(sym(1).SourceElements->finish ());
1662 sym(1).Node = new (pool) AST::SourceElements(sym(1).SourceElement);
1666 sym(1).Node = new (pool) AST::SourceElements(sym(1).SourceElements, sym(2).SourceElement);
1670 sym(1).Node = new (pool) AST::StatementSourceElement(sym(1).Statement);
1674 sym(1).Node = new (pool) AST::FunctionSourceElement(sym(1).FunctionDeclaration);
1678 stringRef(1) = QStringRef();
1686 action = nt_action(state_stack[tos], lhs[r] - TERMINAL_COUNT);
1688 } while (action != 0);
1690 if (first_token == last_token) {
1691 const int errorState = state_stack[tos];
1693 // automatic insertion of `;'
1694 if (yytoken != -1 && t_action(errorState, T_AUTOMATIC_SEMICOLON) && lexer->canInsertAutomaticSemicolon(yytoken)) {
1695 SavedToken &tk = token_buffer[0];
1698 tk.spell = yytokenspell;
1701 yylloc = yyprevlloc;
1702 yylloc.offset += yylloc.length;
1703 yylloc.startColumn += yylloc.length;
1706 //const QString msg = qApp->translate("QDeclarativeParser", "Missing `;'");
1707 //diagnostic_messages.append(DiagnosticMessage(DiagnosticMessage::Warning, yylloc, msg));
1709 first_token = &token_buffer[0];
1710 last_token = &token_buffer[1];
1712 yytoken = T_SEMICOLON;
1715 action = errorState;
1722 token_buffer[0].token = yytoken;
1723 token_buffer[0].dval = yylval;
1724 token_buffer[0].spell = yytokenspell;
1725 token_buffer[0].loc = yylloc;
1727 token_buffer[1].token = yytoken = lexer->lex();
1728 token_buffer[1].dval = yylval = lexer->tokenValue();
1729 token_buffer[1].spell = yytokenspell = lexer->tokenSpell();
1730 token_buffer[1].loc = yylloc = location(lexer);
1732 if (t_action(errorState, yytoken)) {
1734 int token = token_buffer[0].token;
1735 if (token < 0 || token >= TERMINAL_COUNT)
1736 msg = qApp->translate("QDeclarativeParser", "Syntax error");
1738 msg = qApp->translate("QDeclarativeParser", "Unexpected token `%1'").arg(QLatin1String(spell[token]));
1739 diagnostic_messages.append(DiagnosticMessage(DiagnosticMessage::Error, token_buffer[0].loc, msg));
1741 action = errorState;
1745 static int tokens[] = {
1753 T_RPAREN, T_RBRACKET, T_RBRACE,
1758 T_LPAREN, T_LBRACKET, T_LBRACE,
1763 for (int *tk = tokens; *tk != EOF_SYMBOL; ++tk) {
1764 int a = t_action(errorState, *tk);
1765 if (a > 0 && t_action(a, yytoken)) {
1766 const QString msg = qApp->translate("QDeclarativeParser", "Expected token `%1'").arg(QLatin1String(spell[*tk]));
1767 diagnostic_messages.append(DiagnosticMessage(DiagnosticMessage::Error, token_buffer[0].loc, msg));
1771 yylloc = token_buffer[0].loc;
1774 first_token = &token_buffer[0];
1775 last_token = &token_buffer[2];
1777 action = errorState;
1782 for (int tk = 1; tk < TERMINAL_COUNT; ++tk) {
1783 if (tk == T_AUTOMATIC_SEMICOLON || tk == T_FEED_UI_PROGRAM ||
1784 tk == T_FEED_JS_STATEMENT || tk == T_FEED_JS_EXPRESSION ||
1785 tk == T_FEED_JS_SOURCE_ELEMENT)
1788 int a = t_action(errorState, tk);
1789 if (a > 0 && t_action(a, yytoken)) {
1790 const QString msg = qApp->translate("QDeclarativeParser", "Expected token `%1'").arg(QLatin1String(spell[tk]));
1791 diagnostic_messages.append(DiagnosticMessage(DiagnosticMessage::Error, token_buffer[0].loc, msg));
1795 yylloc = token_buffer[0].loc;
1798 action = errorState;
1803 const QString msg = qApp->translate("QDeclarativeParser", "Syntax error");
1804 diagnostic_messages.append(DiagnosticMessage(DiagnosticMessage::Error, token_buffer[0].loc, msg));
1810 QT_QML_END_NAMESPACE