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();
581 AST::RegExpLiteral *node = new (pool) AST::RegExpLiteral(
582 driver->newStringRef(lexer->regExpPattern()), lexer->regExpFlags());
583 node->literalToken = loc(1);
588 bool rx = lexer->scanRegExp(Lexer::EqualPrefix);
590 diagnostic_messages.append(DiagnosticMessage(DiagnosticMessage::Error, location(lexer), lexer->errorMessage()));
594 loc(1).length = lexer->tokenLength();
596 AST::RegExpLiteral *node = new (pool) AST::RegExpLiteral(
597 driver->newStringRef(lexer->regExpPattern()), lexer->regExpFlags());
598 node->literalToken = loc(1);
603 AST::ArrayLiteral *node = new (pool) AST::ArrayLiteral((AST::Elision *) 0);
604 node->lbracketToken = loc(1);
605 node->rbracketToken = loc(2);
610 AST::ArrayLiteral *node = new (pool) AST::ArrayLiteral(sym(2).Elision->finish());
611 node->lbracketToken = loc(1);
612 node->rbracketToken = loc(3);
617 AST::ArrayLiteral *node = new (pool) AST::ArrayLiteral(sym(2).ElementList->finish ());
618 node->lbracketToken = loc(1);
619 node->rbracketToken = loc(3);
624 AST::ArrayLiteral *node = new (pool) AST::ArrayLiteral(sym(2).ElementList->finish (),
626 node->lbracketToken = loc(1);
627 node->commaToken = loc(3);
628 node->rbracketToken = loc(4);
633 AST::ArrayLiteral *node = new (pool) AST::ArrayLiteral(sym(2).ElementList->finish (),
634 sym(4).Elision->finish());
635 node->lbracketToken = loc(1);
636 node->commaToken = loc(3);
637 node->rbracketToken = loc(5);
642 AST::ObjectLiteral *node = 0;
644 node = new (pool) AST::ObjectLiteral(
645 sym(2).PropertyNameAndValueList->finish ());
647 node = new (pool) AST::ObjectLiteral();
648 node->lbraceToken = loc(1);
649 node->rbraceToken = loc(3);
654 AST::ObjectLiteral *node = new (pool) AST::ObjectLiteral(
655 sym(2).PropertyNameAndValueList->finish ());
656 node->lbraceToken = loc(1);
657 node->rbraceToken = loc(4);
662 AST::NestedExpression *node = new (pool) AST::NestedExpression(sym(2).Expression);
663 node->lparenToken = loc(1);
664 node->rparenToken = loc(3);
669 if (AST::ArrayMemberExpression *mem = AST::cast<AST::ArrayMemberExpression *>(sym(1).Expression)) {
670 diagnostic_messages.append(DiagnosticMessage(DiagnosticMessage::Warning, mem->lbracketToken,
671 QLatin1String("Ignored annotation")));
673 sym(1).Expression = mem->base;
676 if (AST::UiQualifiedId *qualifiedId = reparseAsQualifiedId(sym(1).Expression)) {
677 sym(1).UiQualifiedId = qualifiedId;
679 sym(1).UiQualifiedId = 0;
681 diagnostic_messages.append(DiagnosticMessage(DiagnosticMessage::Error, loc(1),
682 QLatin1String("Expected a qualified name id")));
684 return false; // ### recover
689 sym(1).Node = new (pool) AST::ElementList((AST::Elision *) 0, sym(1).Expression);
693 sym(1).Node = new (pool) AST::ElementList(sym(1).Elision->finish(), sym(2).Expression);
697 AST::ElementList *node = new (pool) AST::ElementList(sym(1).ElementList,
698 (AST::Elision *) 0, sym(3).Expression);
699 node->commaToken = loc(2);
704 AST::ElementList *node = new (pool) AST::ElementList(sym(1).ElementList, sym(3).Elision->finish(),
706 node->commaToken = loc(2);
711 AST::Elision *node = new (pool) AST::Elision();
712 node->commaToken = loc(1);
717 AST::Elision *node = new (pool) AST::Elision(sym(1).Elision);
718 node->commaToken = loc(2);
723 AST::PropertyNameAndValueList *node = new (pool) AST::PropertyNameAndValueList(
724 sym(1).PropertyName, sym(3).Expression);
725 node->colonToken = loc(2);
730 AST::PropertyNameAndValueList *node = new (pool) AST::PropertyNameAndValueList(
731 sym(1).PropertyNameAndValueList, sym(3).PropertyName, sym(5).Expression);
732 node->commaToken = loc(2);
733 node->colonToken = loc(4);
738 AST::IdentifierPropertyName *node = new (pool) AST::IdentifierPropertyName(stringRef(1));
739 node->propertyNameToken = loc(1);
744 AST::IdentifierPropertyName *node = new (pool) AST::IdentifierPropertyName(stringRef(1));
745 node->propertyNameToken = loc(1);
750 AST::StringLiteralPropertyName *node = new (pool) AST::StringLiteralPropertyName(stringRef(1));
751 node->propertyNameToken = loc(1);
756 AST::NumericLiteralPropertyName *node = new (pool) AST::NumericLiteralPropertyName(sym(1).dval);
757 node->propertyNameToken = loc(1);
762 AST::IdentifierPropertyName *node = new (pool) AST::IdentifierPropertyName(stringRef(1));
763 node->propertyNameToken = loc(1);
768 AST::ArrayMemberExpression *node = new (pool) AST::ArrayMemberExpression(sym(1).Expression, sym(3).Expression);
769 node->lbracketToken = loc(2);
770 node->rbracketToken = loc(4);
775 AST::FieldMemberExpression *node = new (pool) AST::FieldMemberExpression(sym(1).Expression, stringRef(3));
776 node->dotToken = loc(2);
777 node->identifierToken = loc(3);
782 AST::NewMemberExpression *node = new (pool) AST::NewMemberExpression(sym(2).Expression, sym(4).ArgumentList);
783 node->newToken = loc(1);
784 node->lparenToken = loc(3);
785 node->rparenToken = loc(5);
790 AST::NewExpression *node = new (pool) AST::NewExpression(sym(2).Expression);
791 node->newToken = loc(1);
796 AST::CallExpression *node = new (pool) AST::CallExpression(sym(1).Expression, sym(3).ArgumentList);
797 node->lparenToken = loc(2);
798 node->rparenToken = loc(4);
803 AST::CallExpression *node = new (pool) AST::CallExpression(sym(1).Expression, sym(3).ArgumentList);
804 node->lparenToken = loc(2);
805 node->rparenToken = loc(4);
810 AST::ArrayMemberExpression *node = new (pool) AST::ArrayMemberExpression(sym(1).Expression, sym(3).Expression);
811 node->lbracketToken = loc(2);
812 node->rbracketToken = loc(4);
817 AST::FieldMemberExpression *node = new (pool) AST::FieldMemberExpression(sym(1).Expression, stringRef(3));
818 node->dotToken = loc(2);
819 node->identifierToken = loc(3);
828 sym(1).Node = sym(1).ArgumentList->finish();
832 sym(1).Node = new (pool) AST::ArgumentList(sym(1).Expression);
836 AST::ArgumentList *node = new (pool) AST::ArgumentList(sym(1).ArgumentList, sym(3).Expression);
837 node->commaToken = loc(2);
842 AST::PostIncrementExpression *node = new (pool) AST::PostIncrementExpression(sym(1).Expression);
843 node->incrementToken = loc(2);
848 AST::PostDecrementExpression *node = new (pool) AST::PostDecrementExpression(sym(1).Expression);
849 node->decrementToken = loc(2);
854 AST::DeleteExpression *node = new (pool) AST::DeleteExpression(sym(2).Expression);
855 node->deleteToken = loc(1);
860 AST::VoidExpression *node = new (pool) AST::VoidExpression(sym(2).Expression);
861 node->voidToken = loc(1);
866 AST::TypeOfExpression *node = new (pool) AST::TypeOfExpression(sym(2).Expression);
867 node->typeofToken = loc(1);
872 AST::PreIncrementExpression *node = new (pool) AST::PreIncrementExpression(sym(2).Expression);
873 node->incrementToken = loc(1);
878 AST::PreDecrementExpression *node = new (pool) AST::PreDecrementExpression(sym(2).Expression);
879 node->decrementToken = loc(1);
884 AST::UnaryPlusExpression *node = new (pool) AST::UnaryPlusExpression(sym(2).Expression);
885 node->plusToken = loc(1);
890 AST::UnaryMinusExpression *node = new (pool) AST::UnaryMinusExpression(sym(2).Expression);
891 node->minusToken = loc(1);
896 AST::TildeExpression *node = new (pool) AST::TildeExpression(sym(2).Expression);
897 node->tildeToken = loc(1);
902 AST::NotExpression *node = new (pool) AST::NotExpression(sym(2).Expression);
903 node->notToken = loc(1);
908 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
909 QSOperator::Mul, sym(3).Expression);
910 node->operatorToken = loc(2);
915 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
916 QSOperator::Div, sym(3).Expression);
917 node->operatorToken = loc(2);
922 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
923 QSOperator::Mod, sym(3).Expression);
924 node->operatorToken = loc(2);
929 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
930 QSOperator::Add, sym(3).Expression);
931 node->operatorToken = loc(2);
936 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
937 QSOperator::Sub, sym(3).Expression);
938 node->operatorToken = loc(2);
943 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
944 QSOperator::LShift, sym(3).Expression);
945 node->operatorToken = loc(2);
950 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
951 QSOperator::RShift, sym(3).Expression);
952 node->operatorToken = loc(2);
957 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
958 QSOperator::URShift, sym(3).Expression);
959 node->operatorToken = loc(2);
964 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
965 QSOperator::Lt, sym(3).Expression);
966 node->operatorToken = loc(2);
971 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
972 QSOperator::Gt, sym(3).Expression);
973 node->operatorToken = loc(2);
978 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
979 QSOperator::Le, sym(3).Expression);
980 node->operatorToken = loc(2);
985 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
986 QSOperator::Ge, sym(3).Expression);
987 node->operatorToken = loc(2);
992 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
993 QSOperator::InstanceOf, sym(3).Expression);
994 node->operatorToken = loc(2);
999 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1000 QSOperator::In, sym(3).Expression);
1001 node->operatorToken = loc(2);
1006 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1007 QSOperator::Lt, sym(3).Expression);
1008 node->operatorToken = loc(2);
1013 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1014 QSOperator::Gt, sym(3).Expression);
1015 node->operatorToken = loc(2);
1020 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1021 QSOperator::Le, sym(3).Expression);
1022 node->operatorToken = loc(2);
1027 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1028 QSOperator::Ge, sym(3).Expression);
1029 node->operatorToken = loc(2);
1034 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1035 QSOperator::InstanceOf, sym(3).Expression);
1036 node->operatorToken = loc(2);
1041 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1042 QSOperator::Equal, sym(3).Expression);
1043 node->operatorToken = loc(2);
1048 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1049 QSOperator::NotEqual, sym(3).Expression);
1050 node->operatorToken = loc(2);
1055 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1056 QSOperator::StrictEqual, sym(3).Expression);
1057 node->operatorToken = loc(2);
1062 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1063 QSOperator::StrictNotEqual, sym(3).Expression);
1064 node->operatorToken = loc(2);
1069 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1070 QSOperator::Equal, sym(3).Expression);
1071 node->operatorToken = loc(2);
1076 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1077 QSOperator::NotEqual, sym(3).Expression);
1078 node->operatorToken = loc(2);
1083 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1084 QSOperator::StrictEqual, sym(3).Expression);
1085 node->operatorToken = loc(2);
1090 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1091 QSOperator::StrictNotEqual, sym(3).Expression);
1092 node->operatorToken = loc(2);
1097 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1098 QSOperator::BitAnd, sym(3).Expression);
1099 node->operatorToken = loc(2);
1104 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1105 QSOperator::BitAnd, sym(3).Expression);
1106 node->operatorToken = loc(2);
1111 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1112 QSOperator::BitXor, sym(3).Expression);
1113 node->operatorToken = loc(2);
1118 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1119 QSOperator::BitXor, sym(3).Expression);
1120 node->operatorToken = loc(2);
1125 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1126 QSOperator::BitOr, sym(3).Expression);
1127 node->operatorToken = loc(2);
1132 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1133 QSOperator::BitOr, sym(3).Expression);
1134 node->operatorToken = loc(2);
1139 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1140 QSOperator::And, sym(3).Expression);
1141 node->operatorToken = loc(2);
1146 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1147 QSOperator::And, sym(3).Expression);
1148 node->operatorToken = loc(2);
1153 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1154 QSOperator::Or, sym(3).Expression);
1155 node->operatorToken = loc(2);
1160 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1161 QSOperator::Or, sym(3).Expression);
1162 node->operatorToken = loc(2);
1167 AST::ConditionalExpression *node = new (pool) AST::ConditionalExpression(sym(1).Expression,
1168 sym(3).Expression, sym(5).Expression);
1169 node->questionToken = loc(2);
1170 node->colonToken = loc(4);
1175 AST::ConditionalExpression *node = new (pool) AST::ConditionalExpression(sym(1).Expression,
1176 sym(3).Expression, sym(5).Expression);
1177 node->questionToken = loc(2);
1178 node->colonToken = loc(4);
1183 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1184 sym(2).ival, sym(3).Expression);
1185 node->operatorToken = loc(2);
1190 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1191 sym(2).ival, sym(3).Expression);
1192 node->operatorToken = loc(2);
1197 sym(1).ival = QSOperator::Assign;
1201 sym(1).ival = QSOperator::InplaceMul;
1205 sym(1).ival = QSOperator::InplaceDiv;
1209 sym(1).ival = QSOperator::InplaceMod;
1213 sym(1).ival = QSOperator::InplaceAdd;
1217 sym(1).ival = QSOperator::InplaceSub;
1221 sym(1).ival = QSOperator::InplaceLeftShift;
1225 sym(1).ival = QSOperator::InplaceRightShift;
1229 sym(1).ival = QSOperator::InplaceURightShift;
1233 sym(1).ival = QSOperator::InplaceAnd;
1237 sym(1).ival = QSOperator::InplaceXor;
1241 sym(1).ival = QSOperator::InplaceOr;
1245 AST::Expression *node = new (pool) AST::Expression(sym(1).Expression, sym(3).Expression);
1246 node->commaToken = loc(2);
1255 AST::Expression *node = new (pool) AST::Expression(sym(1).Expression, sym(3).Expression);
1256 node->commaToken = loc(2);
1265 AST::Block *node = new (pool) AST::Block(sym(2).StatementList);
1266 node->lbraceToken = loc(1);
1267 node->rbraceToken = loc(3);
1272 sym(1).Node = new (pool) AST::StatementList(sym(1).Statement);
1276 sym(1).Node = new (pool) AST::StatementList(sym(1).StatementList, sym(2).Statement);
1284 sym(1).Node = sym(1).StatementList->finish ();
1288 AST::VariableStatement *node = new (pool) AST::VariableStatement(
1289 sym(2).VariableDeclarationList->finish (/*readOnly=*/sym(1).ival == T_CONST));
1290 node->declarationKindToken = loc(1);
1291 node->semicolonToken = loc(3);
1296 sym(1).ival = T_CONST;
1300 sym(1).ival = T_VAR;
1304 sym(1).Node = new (pool) AST::VariableDeclarationList(sym(1).VariableDeclaration);
1308 AST::VariableDeclarationList *node = new (pool) AST::VariableDeclarationList(
1309 sym(1).VariableDeclarationList, sym(3).VariableDeclaration);
1310 node->commaToken = loc(2);
1315 sym(1).Node = new (pool) AST::VariableDeclarationList(sym(1).VariableDeclaration);
1319 sym(1).Node = new (pool) AST::VariableDeclarationList(sym(1).VariableDeclarationList, sym(3).VariableDeclaration);
1323 AST::VariableDeclaration *node = new (pool) AST::VariableDeclaration(stringRef(1), sym(2).Expression);
1324 node->identifierToken = loc(1);
1329 AST::VariableDeclaration *node = new (pool) AST::VariableDeclaration(stringRef(1), sym(2).Expression);
1330 node->identifierToken = loc(1);
1335 // ### TODO: AST for initializer
1344 // ### TODO: AST for initializer
1353 AST::EmptyStatement *node = new (pool) AST::EmptyStatement();
1354 node->semicolonToken = loc(1);
1359 AST::ExpressionStatement *node = new (pool) AST::ExpressionStatement(sym(1).Expression);
1360 node->semicolonToken = loc(2);
1365 AST::IfStatement *node = new (pool) AST::IfStatement(sym(3).Expression, sym(5).Statement, sym(7).Statement);
1366 node->ifToken = loc(1);
1367 node->lparenToken = loc(2);
1368 node->rparenToken = loc(4);
1369 node->elseToken = loc(6);
1374 AST::IfStatement *node = new (pool) AST::IfStatement(sym(3).Expression, sym(5).Statement);
1375 node->ifToken = loc(1);
1376 node->lparenToken = loc(2);
1377 node->rparenToken = loc(4);
1382 AST::DoWhileStatement *node = new (pool) AST::DoWhileStatement(sym(2).Statement, sym(5).Expression);
1383 node->doToken = loc(1);
1384 node->whileToken = loc(3);
1385 node->lparenToken = loc(4);
1386 node->rparenToken = loc(6);
1387 node->semicolonToken = loc(7);
1392 AST::WhileStatement *node = new (pool) AST::WhileStatement(sym(3).Expression, sym(5).Statement);
1393 node->whileToken = loc(1);
1394 node->lparenToken = loc(2);
1395 node->rparenToken = loc(4);
1400 AST::ForStatement *node = new (pool) AST::ForStatement(sym(3).Expression,
1401 sym(5).Expression, sym(7).Expression, sym(9).Statement);
1402 node->forToken = loc(1);
1403 node->lparenToken = loc(2);
1404 node->firstSemicolonToken = loc(4);
1405 node->secondSemicolonToken = loc(6);
1406 node->rparenToken = loc(8);
1411 AST::LocalForStatement *node = new (pool) AST::LocalForStatement(
1412 sym(4).VariableDeclarationList->finish (/*readOnly=*/false), sym(6).Expression,
1413 sym(8).Expression, sym(10).Statement);
1414 node->forToken = loc(1);
1415 node->lparenToken = loc(2);
1416 node->varToken = loc(3);
1417 node->firstSemicolonToken = loc(5);
1418 node->secondSemicolonToken = loc(7);
1419 node->rparenToken = loc(9);
1424 AST:: ForEachStatement *node = new (pool) AST::ForEachStatement(sym(3).Expression,
1425 sym(5).Expression, sym(7).Statement);
1426 node->forToken = loc(1);
1427 node->lparenToken = loc(2);
1428 node->inToken = loc(4);
1429 node->rparenToken = loc(6);
1434 AST::LocalForEachStatement *node = new (pool) AST::LocalForEachStatement(
1435 sym(4).VariableDeclaration, sym(6).Expression, sym(8).Statement);
1436 node->forToken = loc(1);
1437 node->lparenToken = loc(2);
1438 node->varToken = loc(3);
1439 node->inToken = loc(5);
1440 node->rparenToken = loc(7);
1445 AST::ContinueStatement *node = new (pool) AST::ContinueStatement();
1446 node->continueToken = loc(1);
1447 node->semicolonToken = loc(2);
1452 AST::ContinueStatement *node = new (pool) AST::ContinueStatement(stringRef(2));
1453 node->continueToken = loc(1);
1454 node->identifierToken = loc(2);
1455 node->semicolonToken = loc(3);
1460 AST::BreakStatement *node = new (pool) AST::BreakStatement(QStringRef());
1461 node->breakToken = loc(1);
1462 node->semicolonToken = loc(2);
1467 AST::BreakStatement *node = new (pool) AST::BreakStatement(stringRef(2));
1468 node->breakToken = loc(1);
1469 node->identifierToken = loc(2);
1470 node->semicolonToken = loc(3);
1475 AST::ReturnStatement *node = new (pool) AST::ReturnStatement(sym(2).Expression);
1476 node->returnToken = loc(1);
1477 node->semicolonToken = loc(3);
1482 AST::WithStatement *node = new (pool) AST::WithStatement(sym(3).Expression, sym(5).Statement);
1483 node->withToken = loc(1);
1484 node->lparenToken = loc(2);
1485 node->rparenToken = loc(4);
1490 AST::SwitchStatement *node = new (pool) AST::SwitchStatement(sym(3).Expression, sym(5).CaseBlock);
1491 node->switchToken = loc(1);
1492 node->lparenToken = loc(2);
1493 node->rparenToken = loc(4);
1498 AST::CaseBlock *node = new (pool) AST::CaseBlock(sym(2).CaseClauses);
1499 node->lbraceToken = loc(1);
1500 node->rbraceToken = loc(3);
1505 AST::CaseBlock *node = new (pool) AST::CaseBlock(sym(2).CaseClauses, sym(3).DefaultClause, sym(4).CaseClauses);
1506 node->lbraceToken = loc(1);
1507 node->rbraceToken = loc(5);
1512 sym(1).Node = new (pool) AST::CaseClauses(sym(1).CaseClause);
1516 sym(1).Node = new (pool) AST::CaseClauses(sym(1).CaseClauses, sym(2).CaseClause);
1524 sym(1).Node = sym(1).CaseClauses->finish ();
1528 AST::CaseClause *node = new (pool) AST::CaseClause(sym(2).Expression, sym(4).StatementList);
1529 node->caseToken = loc(1);
1530 node->colonToken = loc(3);
1535 AST::DefaultClause *node = new (pool) AST::DefaultClause(sym(3).StatementList);
1536 node->defaultToken = loc(1);
1537 node->colonToken = loc(2);
1542 AST::LabelledStatement *node = new (pool) AST::LabelledStatement(stringRef(1), sym(3).Statement);
1543 node->identifierToken = loc(1);
1544 node->colonToken = loc(2);
1549 AST::LabelledStatement *node = new (pool) AST::LabelledStatement(stringRef(1), sym(3).Statement);
1550 node->identifierToken = loc(1);
1551 node->colonToken = loc(2);
1556 AST::ThrowStatement *node = new (pool) AST::ThrowStatement(sym(2).Expression);
1557 node->throwToken = loc(1);
1558 node->semicolonToken = loc(3);
1563 AST::TryStatement *node = new (pool) AST::TryStatement(sym(2).Statement, sym(3).Catch);
1564 node->tryToken = loc(1);
1569 AST::TryStatement *node = new (pool) AST::TryStatement(sym(2).Statement, sym(3).Finally);
1570 node->tryToken = loc(1);
1575 AST::TryStatement *node = new (pool) AST::TryStatement(sym(2).Statement, sym(3).Catch, sym(4).Finally);
1576 node->tryToken = loc(1);
1581 AST::Catch *node = new (pool) AST::Catch(stringRef(3), sym(5).Block);
1582 node->catchToken = loc(1);
1583 node->lparenToken = loc(2);
1584 node->identifierToken = loc(3);
1585 node->rparenToken = loc(4);
1590 AST::Finally *node = new (pool) AST::Finally(sym(2).Block);
1591 node->finallyToken = loc(1);
1596 AST::DebuggerStatement *node = new (pool) AST::DebuggerStatement();
1597 node->debuggerToken = loc(1);
1598 node->semicolonToken = loc(2);
1603 AST::FunctionDeclaration *node = new (pool) AST::FunctionDeclaration(stringRef(2), sym(4).FormalParameterList, sym(7).FunctionBody);
1604 node->functionToken = loc(1);
1605 node->identifierToken = loc(2);
1606 node->lparenToken = loc(3);
1607 node->rparenToken = loc(5);
1608 node->lbraceToken = loc(6);
1609 node->rbraceToken = loc(8);
1614 AST::FunctionExpression *node = new (pool) AST::FunctionExpression(stringRef(2), sym(4).FormalParameterList, sym(7).FunctionBody);
1615 node->functionToken = loc(1);
1616 if (! stringRef(2).isNull())
1617 node->identifierToken = loc(2);
1618 node->lparenToken = loc(3);
1619 node->rparenToken = loc(5);
1620 node->lbraceToken = loc(6);
1621 node->rbraceToken = loc(8);
1626 AST::FormalParameterList *node = new (pool) AST::FormalParameterList(stringRef(1));
1627 node->identifierToken = loc(1);
1632 AST::FormalParameterList *node = new (pool) AST::FormalParameterList(sym(1).FormalParameterList, stringRef(3));
1633 node->commaToken = loc(2);
1634 node->identifierToken = loc(3);
1643 sym(1).Node = sym(1).FormalParameterList->finish ();
1651 sym(1).Node = new (pool) AST::FunctionBody(sym(1).SourceElements->finish ());
1655 sym(1).Node = new (pool) AST::Program(sym(1).SourceElements->finish ());
1659 sym(1).Node = new (pool) AST::SourceElements(sym(1).SourceElement);
1663 sym(1).Node = new (pool) AST::SourceElements(sym(1).SourceElements, sym(2).SourceElement);
1667 sym(1).Node = new (pool) AST::StatementSourceElement(sym(1).Statement);
1671 sym(1).Node = new (pool) AST::FunctionSourceElement(sym(1).FunctionDeclaration);
1675 stringRef(1) = QStringRef();
1683 action = nt_action(state_stack[tos], lhs[r] - TERMINAL_COUNT);
1685 } while (action != 0);
1687 if (first_token == last_token) {
1688 const int errorState = state_stack[tos];
1690 // automatic insertion of `;'
1691 if (yytoken != -1 && t_action(errorState, T_AUTOMATIC_SEMICOLON) && lexer->canInsertAutomaticSemicolon(yytoken)) {
1692 SavedToken &tk = token_buffer[0];
1695 tk.spell = yytokenspell;
1698 yylloc = yyprevlloc;
1699 yylloc.offset += yylloc.length;
1700 yylloc.startColumn += yylloc.length;
1703 //const QString msg = qApp->translate("QDeclarativeParser", "Missing `;'");
1704 //diagnostic_messages.append(DiagnosticMessage(DiagnosticMessage::Warning, yylloc, msg));
1706 first_token = &token_buffer[0];
1707 last_token = &token_buffer[1];
1709 yytoken = T_SEMICOLON;
1712 action = errorState;
1719 token_buffer[0].token = yytoken;
1720 token_buffer[0].dval = yylval;
1721 token_buffer[0].spell = yytokenspell;
1722 token_buffer[0].loc = yylloc;
1724 token_buffer[1].token = yytoken = lexer->lex();
1725 token_buffer[1].dval = yylval = lexer->tokenValue();
1726 token_buffer[1].spell = yytokenspell = lexer->tokenSpell();
1727 token_buffer[1].loc = yylloc = location(lexer);
1729 if (t_action(errorState, yytoken)) {
1731 int token = token_buffer[0].token;
1732 if (token < 0 || token >= TERMINAL_COUNT)
1733 msg = qApp->translate("QDeclarativeParser", "Syntax error");
1735 msg = qApp->translate("QDeclarativeParser", "Unexpected token `%1'").arg(QLatin1String(spell[token]));
1736 diagnostic_messages.append(DiagnosticMessage(DiagnosticMessage::Error, token_buffer[0].loc, msg));
1738 action = errorState;
1742 static int tokens[] = {
1750 T_RPAREN, T_RBRACKET, T_RBRACE,
1755 T_LPAREN, T_LBRACKET, T_LBRACE,
1760 for (int *tk = tokens; *tk != EOF_SYMBOL; ++tk) {
1761 int a = t_action(errorState, *tk);
1762 if (a > 0 && t_action(a, yytoken)) {
1763 const QString msg = qApp->translate("QDeclarativeParser", "Expected token `%1'").arg(QLatin1String(spell[*tk]));
1764 diagnostic_messages.append(DiagnosticMessage(DiagnosticMessage::Error, token_buffer[0].loc, msg));
1768 yylloc = token_buffer[0].loc;
1771 first_token = &token_buffer[0];
1772 last_token = &token_buffer[2];
1774 action = errorState;
1779 for (int tk = 1; tk < TERMINAL_COUNT; ++tk) {
1780 if (tk == T_AUTOMATIC_SEMICOLON || tk == T_FEED_UI_PROGRAM ||
1781 tk == T_FEED_JS_STATEMENT || tk == T_FEED_JS_EXPRESSION ||
1782 tk == T_FEED_JS_SOURCE_ELEMENT)
1785 int a = t_action(errorState, tk);
1786 if (a > 0 && t_action(a, yytoken)) {
1787 const QString msg = qApp->translate("QDeclarativeParser", "Expected token `%1'").arg(QLatin1String(spell[tk]));
1788 diagnostic_messages.append(DiagnosticMessage(DiagnosticMessage::Error, token_buffer[0].loc, msg));
1792 yylloc = token_buffer[0].loc;
1795 action = errorState;
1800 const QString msg = qApp->translate("QDeclarativeParser", "Syntax error");
1801 diagnostic_messages.append(DiagnosticMessage(DiagnosticMessage::Error, token_buffer[0].loc, msg));
1807 QT_QML_END_NAMESPACE