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 <QtGui/QGuiApplication>
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 inline static bool automatic(Engine *driver, int token)
81 return token == QDeclarativeJSGrammar::T_RBRACE
83 || driver->lexer()->prevTerminator();
87 Parser::Parser(Engine *engine):
106 qFree(location_stack);
111 static inline AST::SourceLocation location(Lexer *lexer)
113 AST::SourceLocation loc;
114 loc.offset = lexer->tokenOffset();
115 loc.length = lexer->tokenLength();
116 loc.startLine = lexer->tokenStartLine();
117 loc.startColumn = lexer->tokenStartColumn();
121 AST::UiQualifiedId *Parser::reparseAsQualifiedId(AST::ExpressionNode *expr)
123 QVarLengthArray<QStringRef, 4> nameIds;
124 QVarLengthArray<AST::SourceLocation, 4> locations;
126 AST::ExpressionNode *it = expr;
127 while (AST::FieldMemberExpression *m = AST::cast<AST::FieldMemberExpression *>(it)) {
128 nameIds.append(m->name);
129 locations.append(m->identifierToken);
133 if (AST::IdentifierExpression *idExpr = AST::cast<AST::IdentifierExpression *>(it)) {
134 AST::UiQualifiedId *q = new (pool) AST::UiQualifiedId(idExpr->name);
135 q->identifierToken = idExpr->identifierToken;
137 AST::UiQualifiedId *currentId = q;
138 for (int i = nameIds.size() - 1; i != -1; --i) {
139 currentId = new (pool) AST::UiQualifiedId(currentId, nameIds[i]);
140 currentId->identifierToken = locations[i];
143 return currentId->finish();
149 bool Parser::parse(int startToken)
151 Lexer *lexer = driver->lexer();
152 bool hadErrors = false;
156 token_buffer[0].token = startToken;
157 first_token = &token_buffer[0];
158 last_token = &token_buffer[1];
164 if (++tos == stack_size)
167 state_stack[tos] = action;
170 if (yytoken == -1 && -TERMINAL_COUNT != action_index[action]) {
173 if (first_token == last_token) {
174 yytoken = lexer->lex();
175 yylval = lexer->tokenValue();
176 yytokenspell = lexer->tokenSpell();
177 yylloc = location(lexer);
179 yytoken = first_token->token;
180 yylval = first_token->dval;
181 yytokenspell = first_token->spell;
182 yylloc = first_token->loc;
187 action = t_action(action, yytoken);
189 if (action != ACCEPT_STATE) {
191 sym(1).dval = yylval;
192 stringRef(1) = yytokenspell;
198 } else if (action < 0) {
199 const int r = -action - 1;
205 sym(1).Node = sym(2).Node;
206 program = sym(1).Node;
210 sym(1).Node = sym(2).Node;
211 program = sym(1).Node;
215 sym(1).Node = sym(2).Node;
216 program = sym(1).Node;
220 sym(1).Node = sym(2).Node;
221 program = sym(1).Node;
225 sym(1).Node = sym(2).Node;
226 program = sym(1).Node;
230 sym(1).Node = sym(2).Node;
231 program = sym(1).Node;
235 sym(1).UiProgram = new (pool) AST::UiProgram(sym(1).UiImportList,
236 sym(2).UiObjectMemberList->finish());
240 sym(1).Node = sym(1).UiImportList->finish();
244 sym(1).Node = new (pool) AST::UiImportList(sym(1).UiImport);
248 sym(1).Node = new (pool) AST::UiImportList(sym(1).UiImportList, sym(2).UiImport);
252 sym(1).UiImport->semicolonToken = loc(2);
256 sym(1).UiImport->versionToken = loc(2);
257 sym(1).UiImport->semicolonToken = loc(3);
261 sym(1).UiImport->versionToken = loc(2);
262 sym(1).UiImport->asToken = loc(3);
263 sym(1).UiImport->importIdToken = loc(4);
264 sym(1).UiImport->importId = stringRef(4);
265 sym(1).UiImport->semicolonToken = loc(5);
269 sym(1).UiImport->asToken = loc(2);
270 sym(1).UiImport->importIdToken = loc(3);
271 sym(1).UiImport->importId = stringRef(3);
272 sym(1).UiImport->semicolonToken = loc(4);
276 AST::UiImport *node = 0;
278 if (AST::StringLiteral *importIdLiteral = AST::cast<AST::StringLiteral *>(sym(2).Expression)) {
279 node = new (pool) AST::UiImport(importIdLiteral->value);
280 node->fileNameToken = loc(2);
281 } else if (AST::UiQualifiedId *qualifiedId = reparseAsQualifiedId(sym(2).Expression)) {
282 node = new (pool) AST::UiImport(qualifiedId);
283 node->fileNameToken = loc(2);
289 node->importToken = loc(1);
291 diagnostic_messages.append(DiagnosticMessage(DiagnosticMessage::Error, loc(1),
292 QLatin1String("Expected a qualified name id or a string literal")));
294 return false; // ### remove me
303 sym(1).Node = new (pool) AST::UiObjectMemberList(sym(1).UiObjectMember);
307 sym(1).Node = new (pool) AST::UiObjectMemberList(sym(1).UiObjectMember);
311 AST::UiObjectMemberList *node = new (pool) AST:: UiObjectMemberList(
312 sym(1).UiObjectMemberList, sym(2).UiObjectMember);
317 sym(1).Node = new (pool) AST::UiArrayMemberList(sym(1).UiObjectMember);
321 AST::UiArrayMemberList *node = new (pool) AST::UiArrayMemberList(
322 sym(1).UiArrayMemberList, sym(3).UiObjectMember);
323 node->commaToken = loc(2);
328 AST::UiObjectInitializer *node = new (pool) AST::UiObjectInitializer((AST::UiObjectMemberList*)0);
329 node->lbraceToken = loc(1);
330 node->rbraceToken = loc(2);
335 AST::UiObjectInitializer *node = new (pool) AST::UiObjectInitializer(sym(2).UiObjectMemberList->finish());
336 node->lbraceToken = loc(1);
337 node->rbraceToken = loc(3);
342 AST::UiObjectDefinition *node = new (pool) AST::UiObjectDefinition(sym(1).UiQualifiedId,
343 sym(2).UiObjectInitializer);
348 AST::UiArrayBinding *node = new (pool) AST::UiArrayBinding(
349 sym(1).UiQualifiedId, sym(4).UiArrayMemberList->finish());
350 node->colonToken = loc(2);
351 node->lbracketToken = loc(3);
352 node->rbracketToken = loc(5);
357 AST::UiObjectBinding *node = new (pool) AST::UiObjectBinding(
358 sym(1).UiQualifiedId, sym(3).UiQualifiedId, sym(4).UiObjectInitializer);
359 node->colonToken = loc(2);
364 AST::UiObjectBinding *node = new (pool) AST::UiObjectBinding(
365 sym(3).UiQualifiedId, sym(1).UiQualifiedId, sym(4).UiObjectInitializer);
366 node->colonToken = loc(2);
367 node->hasOnToken = true;
373 AST::UiScriptBinding *node = new (pool) AST::UiScriptBinding(
374 sym(1).UiQualifiedId, sym(3).Statement);
375 node->colonToken = loc(2);
384 sym(1).Node = sym(1).UiParameterList->finish ();
388 AST::UiParameterList *node = new (pool) AST::UiParameterList(stringRef(1), stringRef(2));
389 node->identifierToken = loc(2);
394 AST::UiParameterList *node = new (pool) AST::UiParameterList(sym(1).UiParameterList, stringRef(3), stringRef(4));
395 node->commaToken = loc(2);
396 node->identifierToken = loc(4);
401 AST::UiPublicMember *node = new (pool) AST::UiPublicMember(QStringRef(), stringRef(2));
402 node->type = AST::UiPublicMember::Signal;
403 node->propertyToken = loc(1);
404 node->typeToken = loc(2);
405 node->identifierToken = loc(2);
406 node->parameters = sym(4).UiParameterList;
407 node->semicolonToken = loc(6);
412 AST::UiPublicMember *node = new (pool) AST::UiPublicMember(QStringRef(), stringRef(2));
413 node->type = AST::UiPublicMember::Signal;
414 node->propertyToken = loc(1);
415 node->typeToken = loc(2);
416 node->identifierToken = loc(2);
417 node->semicolonToken = loc(3);
422 AST::UiPublicMember *node = new (pool) AST::UiPublicMember(stringRef(4), stringRef(6));
423 node->typeModifier = stringRef(2);
424 node->propertyToken = loc(1);
425 node->typeModifierToken = loc(2);
426 node->typeToken = loc(4);
427 node->identifierToken = loc(6);
428 node->semicolonToken = loc(7);
433 AST::UiPublicMember *node = new (pool) AST::UiPublicMember(stringRef(2), stringRef(3));
434 node->propertyToken = loc(1);
435 node->typeToken = loc(2);
436 node->identifierToken = loc(3);
437 node->semicolonToken = loc(4);
442 AST::UiPublicMember *node = new (pool) AST::UiPublicMember(stringRef(3), stringRef(4));
443 node->isDefaultMember = true;
444 node->defaultToken = loc(1);
445 node->propertyToken = loc(2);
446 node->typeToken = loc(3);
447 node->identifierToken = loc(4);
448 node->semicolonToken = loc(5);
453 AST::UiPublicMember *node = new (pool) AST::UiPublicMember(stringRef(2), stringRef(3),
455 node->propertyToken = loc(1);
456 node->typeToken = loc(2);
457 node->identifierToken = loc(3);
458 node->colonToken = loc(4);
463 AST::UiPublicMember *node = new (pool) AST::UiPublicMember(stringRef(3), stringRef(4),
465 node->isReadonlyMember = true;
466 node->readonlyToken = loc(1);
467 node->propertyToken = loc(2);
468 node->typeToken = loc(3);
469 node->identifierToken = loc(4);
470 node->colonToken = loc(5);
475 AST::UiPublicMember *node = new (pool) AST::UiPublicMember(stringRef(3), stringRef(4),
477 node->isDefaultMember = true;
478 node->defaultToken = loc(1);
479 node->propertyToken = loc(2);
480 node->typeToken = loc(3);
481 node->identifierToken = loc(4);
482 node->colonToken = loc(5);
487 AST::UiPublicMember *node = new (pool) AST::UiPublicMember(stringRef(4), stringRef(6));
488 node->typeModifier = stringRef(2);
489 node->propertyToken = loc(1);
490 node->typeModifierToken = loc(2);
491 node->typeToken = loc(4);
492 node->identifierToken = loc(6);
493 node->semicolonToken = loc(7); // insert a fake ';' before ':'
495 AST::UiQualifiedId *propertyName = new (pool) AST::UiQualifiedId(stringRef(6));
496 propertyName->identifierToken = loc(6);
497 propertyName->next = 0;
499 AST::UiArrayBinding *binding = new (pool) AST::UiArrayBinding(
500 propertyName, sym(9).UiArrayMemberList->finish());
501 binding->colonToken = loc(7);
502 binding->lbracketToken = loc(8);
503 binding->rbracketToken = loc(10);
505 node->binding = binding;
511 AST::UiPublicMember *node = new (pool) AST::UiPublicMember(stringRef(2), stringRef(3));
512 node->propertyToken = loc(1);
513 node->typeToken = loc(2);
514 node->identifierToken = loc(3);
515 node->semicolonToken = loc(4); // insert a fake ';' before ':'
517 AST::UiQualifiedId *propertyName = new (pool) AST::UiQualifiedId(stringRef(3));
518 propertyName->identifierToken = loc(3);
519 propertyName->next = 0;
521 AST::UiObjectBinding *binding = new (pool) AST::UiObjectBinding(
522 propertyName, sym(5).UiQualifiedId, sym(6).UiObjectInitializer);
523 binding->colonToken = loc(4);
525 node->binding = binding;
531 sym(1).Node = new (pool) AST::UiSourceElement(sym(1).Node);
535 sym(1).Node = new (pool) AST::UiSourceElement(sym(1).Node);
539 AST::ThisExpression *node = new (pool) AST::ThisExpression();
540 node->thisToken = loc(1);
545 AST::IdentifierExpression *node = new (pool) AST::IdentifierExpression(stringRef(1));
546 node->identifierToken = loc(1);
551 AST::NullExpression *node = new (pool) AST::NullExpression();
552 node->nullToken = loc(1);
557 AST::TrueLiteral *node = new (pool) AST::TrueLiteral();
558 node->trueToken = loc(1);
563 AST::FalseLiteral *node = new (pool) AST::FalseLiteral();
564 node->falseToken = loc(1);
569 AST::NumericLiteral *node = new (pool) AST::NumericLiteral(sym(1).dval);
570 node->literalToken = loc(1);
575 AST::StringLiteral *node = new (pool) AST::StringLiteral(stringRef(1));
576 node->literalToken = loc(1);
581 bool rx = lexer->scanRegExp(Lexer::NoPrefix);
583 diagnostic_messages.append(DiagnosticMessage(DiagnosticMessage::Error, location(lexer), lexer->errorMessage()));
584 return false; // ### remove me
587 loc(1).length = lexer->tokenLength();
589 AST::RegExpLiteral *node = new (pool) AST::RegExpLiteral(
590 driver->newStringRef(lexer->regExpPattern()), lexer->regExpFlags());
591 node->literalToken = loc(1);
596 bool rx = lexer->scanRegExp(Lexer::EqualPrefix);
598 diagnostic_messages.append(DiagnosticMessage(DiagnosticMessage::Error, location(lexer), lexer->errorMessage()));
602 loc(1).length = lexer->tokenLength();
604 AST::RegExpLiteral *node = new (pool) AST::RegExpLiteral(
605 driver->newStringRef(lexer->regExpPattern()), lexer->regExpFlags());
606 node->literalToken = loc(1);
611 AST::ArrayLiteral *node = new (pool) AST::ArrayLiteral((AST::Elision *) 0);
612 node->lbracketToken = loc(1);
613 node->rbracketToken = loc(2);
618 AST::ArrayLiteral *node = new (pool) AST::ArrayLiteral(sym(2).Elision->finish());
619 node->lbracketToken = loc(1);
620 node->rbracketToken = loc(3);
625 AST::ArrayLiteral *node = new (pool) AST::ArrayLiteral(sym(2).ElementList->finish ());
626 node->lbracketToken = loc(1);
627 node->rbracketToken = loc(3);
632 AST::ArrayLiteral *node = new (pool) AST::ArrayLiteral(sym(2).ElementList->finish (),
634 node->lbracketToken = loc(1);
635 node->commaToken = loc(3);
636 node->rbracketToken = loc(4);
641 AST::ArrayLiteral *node = new (pool) AST::ArrayLiteral(sym(2).ElementList->finish (),
642 sym(4).Elision->finish());
643 node->lbracketToken = loc(1);
644 node->commaToken = loc(3);
645 node->rbracketToken = loc(5);
650 AST::ObjectLiteral *node = 0;
652 node = new (pool) AST::ObjectLiteral(
653 sym(2).PropertyNameAndValueList->finish ());
655 node = new (pool) AST::ObjectLiteral();
656 node->lbraceToken = loc(1);
657 node->rbraceToken = loc(3);
662 AST::ObjectLiteral *node = new (pool) AST::ObjectLiteral(
663 sym(2).PropertyNameAndValueList->finish ());
664 node->lbraceToken = loc(1);
665 node->rbraceToken = loc(4);
670 AST::NestedExpression *node = new (pool) AST::NestedExpression(sym(2).Expression);
671 node->lparenToken = loc(1);
672 node->rparenToken = loc(3);
677 if (AST::ArrayMemberExpression *mem = AST::cast<AST::ArrayMemberExpression *>(sym(1).Expression)) {
678 diagnostic_messages.append(DiagnosticMessage(DiagnosticMessage::Warning, mem->lbracketToken,
679 QLatin1String("Ignored annotation")));
681 sym(1).Expression = mem->base;
684 if (AST::UiQualifiedId *qualifiedId = reparseAsQualifiedId(sym(1).Expression)) {
685 sym(1).UiQualifiedId = qualifiedId;
687 sym(1).UiQualifiedId = 0;
689 diagnostic_messages.append(DiagnosticMessage(DiagnosticMessage::Error, loc(1),
690 QLatin1String("Expected a qualified name id")));
692 return false; // ### recover
697 sym(1).Node = new (pool) AST::ElementList((AST::Elision *) 0, sym(1).Expression);
701 sym(1).Node = new (pool) AST::ElementList(sym(1).Elision->finish(), sym(2).Expression);
705 AST::ElementList *node = new (pool) AST::ElementList(sym(1).ElementList,
706 (AST::Elision *) 0, sym(3).Expression);
707 node->commaToken = loc(2);
712 AST::ElementList *node = new (pool) AST::ElementList(sym(1).ElementList, sym(3).Elision->finish(),
714 node->commaToken = loc(2);
719 AST::Elision *node = new (pool) AST::Elision();
720 node->commaToken = loc(1);
725 AST::Elision *node = new (pool) AST::Elision(sym(1).Elision);
726 node->commaToken = loc(2);
731 AST::PropertyNameAndValueList *node = new (pool) AST::PropertyNameAndValueList(
732 sym(1).PropertyName, sym(3).Expression);
733 node->colonToken = loc(2);
738 AST::PropertyNameAndValueList *node = new (pool) AST::PropertyNameAndValueList(
739 sym(1).PropertyNameAndValueList, sym(3).PropertyName, sym(5).Expression);
740 node->commaToken = loc(2);
741 node->colonToken = loc(4);
746 AST::IdentifierPropertyName *node = new (pool) AST::IdentifierPropertyName(stringRef(1));
747 node->propertyNameToken = loc(1);
752 AST::IdentifierPropertyName *node = new (pool) AST::IdentifierPropertyName(stringRef(1));
753 node->propertyNameToken = loc(1);
758 AST::StringLiteralPropertyName *node = new (pool) AST::StringLiteralPropertyName(stringRef(1));
759 node->propertyNameToken = loc(1);
764 AST::NumericLiteralPropertyName *node = new (pool) AST::NumericLiteralPropertyName(sym(1).dval);
765 node->propertyNameToken = loc(1);
770 AST::IdentifierPropertyName *node = new (pool) AST::IdentifierPropertyName(stringRef(1));
771 node->propertyNameToken = loc(1);
776 AST::ArrayMemberExpression *node = new (pool) AST::ArrayMemberExpression(sym(1).Expression, sym(3).Expression);
777 node->lbracketToken = loc(2);
778 node->rbracketToken = loc(4);
783 AST::FieldMemberExpression *node = new (pool) AST::FieldMemberExpression(sym(1).Expression, stringRef(3));
784 node->dotToken = loc(2);
785 node->identifierToken = loc(3);
790 AST::NewMemberExpression *node = new (pool) AST::NewMemberExpression(sym(2).Expression, sym(4).ArgumentList);
791 node->newToken = loc(1);
792 node->lparenToken = loc(3);
793 node->rparenToken = loc(5);
798 AST::NewExpression *node = new (pool) AST::NewExpression(sym(2).Expression);
799 node->newToken = loc(1);
804 AST::CallExpression *node = new (pool) AST::CallExpression(sym(1).Expression, sym(3).ArgumentList);
805 node->lparenToken = loc(2);
806 node->rparenToken = loc(4);
811 AST::CallExpression *node = new (pool) AST::CallExpression(sym(1).Expression, sym(3).ArgumentList);
812 node->lparenToken = loc(2);
813 node->rparenToken = loc(4);
818 AST::ArrayMemberExpression *node = new (pool) AST::ArrayMemberExpression(sym(1).Expression, sym(3).Expression);
819 node->lbracketToken = loc(2);
820 node->rbracketToken = loc(4);
825 AST::FieldMemberExpression *node = new (pool) AST::FieldMemberExpression(sym(1).Expression, stringRef(3));
826 node->dotToken = loc(2);
827 node->identifierToken = loc(3);
836 sym(1).Node = sym(1).ArgumentList->finish();
840 sym(1).Node = new (pool) AST::ArgumentList(sym(1).Expression);
844 AST::ArgumentList *node = new (pool) AST::ArgumentList(sym(1).ArgumentList, sym(3).Expression);
845 node->commaToken = loc(2);
850 AST::PostIncrementExpression *node = new (pool) AST::PostIncrementExpression(sym(1).Expression);
851 node->incrementToken = loc(2);
856 AST::PostDecrementExpression *node = new (pool) AST::PostDecrementExpression(sym(1).Expression);
857 node->decrementToken = loc(2);
862 AST::DeleteExpression *node = new (pool) AST::DeleteExpression(sym(2).Expression);
863 node->deleteToken = loc(1);
868 AST::VoidExpression *node = new (pool) AST::VoidExpression(sym(2).Expression);
869 node->voidToken = loc(1);
874 AST::TypeOfExpression *node = new (pool) AST::TypeOfExpression(sym(2).Expression);
875 node->typeofToken = loc(1);
880 AST::PreIncrementExpression *node = new (pool) AST::PreIncrementExpression(sym(2).Expression);
881 node->incrementToken = loc(1);
886 AST::PreDecrementExpression *node = new (pool) AST::PreDecrementExpression(sym(2).Expression);
887 node->decrementToken = loc(1);
892 AST::UnaryPlusExpression *node = new (pool) AST::UnaryPlusExpression(sym(2).Expression);
893 node->plusToken = loc(1);
898 AST::UnaryMinusExpression *node = new (pool) AST::UnaryMinusExpression(sym(2).Expression);
899 node->minusToken = loc(1);
904 AST::TildeExpression *node = new (pool) AST::TildeExpression(sym(2).Expression);
905 node->tildeToken = loc(1);
910 AST::NotExpression *node = new (pool) AST::NotExpression(sym(2).Expression);
911 node->notToken = loc(1);
916 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
917 QSOperator::Mul, sym(3).Expression);
918 node->operatorToken = loc(2);
923 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
924 QSOperator::Div, sym(3).Expression);
925 node->operatorToken = loc(2);
930 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
931 QSOperator::Mod, sym(3).Expression);
932 node->operatorToken = loc(2);
937 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
938 QSOperator::Add, sym(3).Expression);
939 node->operatorToken = loc(2);
944 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
945 QSOperator::Sub, sym(3).Expression);
946 node->operatorToken = loc(2);
951 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
952 QSOperator::LShift, sym(3).Expression);
953 node->operatorToken = loc(2);
958 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
959 QSOperator::RShift, sym(3).Expression);
960 node->operatorToken = loc(2);
965 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
966 QSOperator::URShift, sym(3).Expression);
967 node->operatorToken = loc(2);
972 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
973 QSOperator::Lt, sym(3).Expression);
974 node->operatorToken = loc(2);
979 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
980 QSOperator::Gt, sym(3).Expression);
981 node->operatorToken = loc(2);
986 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
987 QSOperator::Le, sym(3).Expression);
988 node->operatorToken = loc(2);
993 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
994 QSOperator::Ge, sym(3).Expression);
995 node->operatorToken = loc(2);
1000 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1001 QSOperator::InstanceOf, sym(3).Expression);
1002 node->operatorToken = loc(2);
1007 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1008 QSOperator::In, sym(3).Expression);
1009 node->operatorToken = loc(2);
1014 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1015 QSOperator::Lt, sym(3).Expression);
1016 node->operatorToken = loc(2);
1021 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1022 QSOperator::Gt, sym(3).Expression);
1023 node->operatorToken = loc(2);
1028 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1029 QSOperator::Le, sym(3).Expression);
1030 node->operatorToken = loc(2);
1035 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1036 QSOperator::Ge, sym(3).Expression);
1037 node->operatorToken = loc(2);
1042 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1043 QSOperator::InstanceOf, sym(3).Expression);
1044 node->operatorToken = loc(2);
1049 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1050 QSOperator::Equal, sym(3).Expression);
1051 node->operatorToken = loc(2);
1056 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1057 QSOperator::NotEqual, sym(3).Expression);
1058 node->operatorToken = loc(2);
1063 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1064 QSOperator::StrictEqual, sym(3).Expression);
1065 node->operatorToken = loc(2);
1070 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1071 QSOperator::StrictNotEqual, sym(3).Expression);
1072 node->operatorToken = loc(2);
1077 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1078 QSOperator::Equal, sym(3).Expression);
1079 node->operatorToken = loc(2);
1084 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1085 QSOperator::NotEqual, sym(3).Expression);
1086 node->operatorToken = loc(2);
1091 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1092 QSOperator::StrictEqual, sym(3).Expression);
1093 node->operatorToken = loc(2);
1098 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1099 QSOperator::StrictNotEqual, sym(3).Expression);
1100 node->operatorToken = loc(2);
1105 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1106 QSOperator::BitAnd, sym(3).Expression);
1107 node->operatorToken = loc(2);
1112 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1113 QSOperator::BitAnd, sym(3).Expression);
1114 node->operatorToken = loc(2);
1119 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1120 QSOperator::BitXor, sym(3).Expression);
1121 node->operatorToken = loc(2);
1126 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1127 QSOperator::BitXor, sym(3).Expression);
1128 node->operatorToken = loc(2);
1133 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1134 QSOperator::BitOr, sym(3).Expression);
1135 node->operatorToken = loc(2);
1140 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1141 QSOperator::BitOr, sym(3).Expression);
1142 node->operatorToken = loc(2);
1147 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1148 QSOperator::And, sym(3).Expression);
1149 node->operatorToken = loc(2);
1154 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1155 QSOperator::And, sym(3).Expression);
1156 node->operatorToken = loc(2);
1161 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1162 QSOperator::Or, sym(3).Expression);
1163 node->operatorToken = loc(2);
1168 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1169 QSOperator::Or, sym(3).Expression);
1170 node->operatorToken = loc(2);
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::ConditionalExpression *node = new (pool) AST::ConditionalExpression(sym(1).Expression,
1184 sym(3).Expression, sym(5).Expression);
1185 node->questionToken = loc(2);
1186 node->colonToken = loc(4);
1191 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1192 sym(2).ival, sym(3).Expression);
1193 node->operatorToken = loc(2);
1198 AST::BinaryExpression *node = new (pool) AST::BinaryExpression(sym(1).Expression,
1199 sym(2).ival, sym(3).Expression);
1200 node->operatorToken = loc(2);
1205 sym(1).ival = QSOperator::Assign;
1209 sym(1).ival = QSOperator::InplaceMul;
1213 sym(1).ival = QSOperator::InplaceDiv;
1217 sym(1).ival = QSOperator::InplaceMod;
1221 sym(1).ival = QSOperator::InplaceAdd;
1225 sym(1).ival = QSOperator::InplaceSub;
1229 sym(1).ival = QSOperator::InplaceLeftShift;
1233 sym(1).ival = QSOperator::InplaceRightShift;
1237 sym(1).ival = QSOperator::InplaceURightShift;
1241 sym(1).ival = QSOperator::InplaceAnd;
1245 sym(1).ival = QSOperator::InplaceXor;
1249 sym(1).ival = QSOperator::InplaceOr;
1253 AST::Expression *node = new (pool) AST::Expression(sym(1).Expression, sym(3).Expression);
1254 node->commaToken = loc(2);
1263 AST::Expression *node = new (pool) AST::Expression(sym(1).Expression, sym(3).Expression);
1264 node->commaToken = loc(2);
1273 AST::Block *node = new (pool) AST::Block(sym(2).StatementList);
1274 node->lbraceToken = loc(1);
1275 node->rbraceToken = loc(3);
1280 sym(1).Node = new (pool) AST::StatementList(sym(1).Statement);
1284 sym(1).Node = new (pool) AST::StatementList(sym(1).StatementList, sym(2).Statement);
1292 sym(1).Node = sym(1).StatementList->finish ();
1296 AST::VariableStatement *node = new (pool) AST::VariableStatement(
1297 sym(2).VariableDeclarationList->finish (/*readOnly=*/sym(1).ival == T_CONST));
1298 node->declarationKindToken = loc(1);
1299 node->semicolonToken = loc(3);
1304 sym(1).ival = T_CONST;
1308 sym(1).ival = T_VAR;
1312 sym(1).Node = new (pool) AST::VariableDeclarationList(sym(1).VariableDeclaration);
1316 AST::VariableDeclarationList *node = new (pool) AST::VariableDeclarationList(
1317 sym(1).VariableDeclarationList, sym(3).VariableDeclaration);
1318 node->commaToken = loc(2);
1323 sym(1).Node = new (pool) AST::VariableDeclarationList(sym(1).VariableDeclaration);
1327 sym(1).Node = new (pool) AST::VariableDeclarationList(sym(1).VariableDeclarationList, sym(3).VariableDeclaration);
1331 AST::VariableDeclaration *node = new (pool) AST::VariableDeclaration(stringRef(1), sym(2).Expression);
1332 node->identifierToken = loc(1);
1337 AST::VariableDeclaration *node = new (pool) AST::VariableDeclaration(stringRef(1), sym(2).Expression);
1338 node->identifierToken = loc(1);
1343 // ### TODO: AST for initializer
1352 // ### TODO: AST for initializer
1361 AST::EmptyStatement *node = new (pool) AST::EmptyStatement();
1362 node->semicolonToken = loc(1);
1367 AST::ExpressionStatement *node = new (pool) AST::ExpressionStatement(sym(1).Expression);
1368 node->semicolonToken = loc(2);
1373 AST::IfStatement *node = new (pool) AST::IfStatement(sym(3).Expression, sym(5).Statement, sym(7).Statement);
1374 node->ifToken = loc(1);
1375 node->lparenToken = loc(2);
1376 node->rparenToken = loc(4);
1377 node->elseToken = loc(6);
1382 AST::IfStatement *node = new (pool) AST::IfStatement(sym(3).Expression, sym(5).Statement);
1383 node->ifToken = loc(1);
1384 node->lparenToken = loc(2);
1385 node->rparenToken = loc(4);
1390 AST::DoWhileStatement *node = new (pool) AST::DoWhileStatement(sym(2).Statement, sym(5).Expression);
1391 node->doToken = loc(1);
1392 node->whileToken = loc(3);
1393 node->lparenToken = loc(4);
1394 node->rparenToken = loc(6);
1395 node->semicolonToken = loc(7);
1400 AST::WhileStatement *node = new (pool) AST::WhileStatement(sym(3).Expression, sym(5).Statement);
1401 node->whileToken = loc(1);
1402 node->lparenToken = loc(2);
1403 node->rparenToken = loc(4);
1408 AST::ForStatement *node = new (pool) AST::ForStatement(sym(3).Expression,
1409 sym(5).Expression, sym(7).Expression, sym(9).Statement);
1410 node->forToken = loc(1);
1411 node->lparenToken = loc(2);
1412 node->firstSemicolonToken = loc(4);
1413 node->secondSemicolonToken = loc(6);
1414 node->rparenToken = loc(8);
1419 AST::LocalForStatement *node = new (pool) AST::LocalForStatement(
1420 sym(4).VariableDeclarationList->finish (/*readOnly=*/false), sym(6).Expression,
1421 sym(8).Expression, sym(10).Statement);
1422 node->forToken = loc(1);
1423 node->lparenToken = loc(2);
1424 node->varToken = loc(3);
1425 node->firstSemicolonToken = loc(5);
1426 node->secondSemicolonToken = loc(7);
1427 node->rparenToken = loc(9);
1432 AST:: ForEachStatement *node = new (pool) AST::ForEachStatement(sym(3).Expression,
1433 sym(5).Expression, sym(7).Statement);
1434 node->forToken = loc(1);
1435 node->lparenToken = loc(2);
1436 node->inToken = loc(4);
1437 node->rparenToken = loc(6);
1442 AST::LocalForEachStatement *node = new (pool) AST::LocalForEachStatement(
1443 sym(4).VariableDeclaration, sym(6).Expression, sym(8).Statement);
1444 node->forToken = loc(1);
1445 node->lparenToken = loc(2);
1446 node->varToken = loc(3);
1447 node->inToken = loc(5);
1448 node->rparenToken = loc(7);
1453 AST::ContinueStatement *node = new (pool) AST::ContinueStatement();
1454 node->continueToken = loc(1);
1455 node->semicolonToken = loc(2);
1460 AST::ContinueStatement *node = new (pool) AST::ContinueStatement(stringRef(2));
1461 node->continueToken = loc(1);
1462 node->identifierToken = loc(2);
1463 node->semicolonToken = loc(3);
1468 AST::BreakStatement *node = new (pool) AST::BreakStatement(QStringRef());
1469 node->breakToken = loc(1);
1470 node->semicolonToken = loc(2);
1475 AST::BreakStatement *node = new (pool) AST::BreakStatement(stringRef(2));
1476 node->breakToken = loc(1);
1477 node->identifierToken = loc(2);
1478 node->semicolonToken = loc(3);
1483 AST::ReturnStatement *node = new (pool) AST::ReturnStatement(sym(2).Expression);
1484 node->returnToken = loc(1);
1485 node->semicolonToken = loc(3);
1490 AST::WithStatement *node = new (pool) AST::WithStatement(sym(3).Expression, sym(5).Statement);
1491 node->withToken = loc(1);
1492 node->lparenToken = loc(2);
1493 node->rparenToken = loc(4);
1498 AST::SwitchStatement *node = new (pool) AST::SwitchStatement(sym(3).Expression, sym(5).CaseBlock);
1499 node->switchToken = loc(1);
1500 node->lparenToken = loc(2);
1501 node->rparenToken = loc(4);
1506 AST::CaseBlock *node = new (pool) AST::CaseBlock(sym(2).CaseClauses);
1507 node->lbraceToken = loc(1);
1508 node->rbraceToken = loc(3);
1513 AST::CaseBlock *node = new (pool) AST::CaseBlock(sym(2).CaseClauses, sym(3).DefaultClause, sym(4).CaseClauses);
1514 node->lbraceToken = loc(1);
1515 node->rbraceToken = loc(5);
1520 sym(1).Node = new (pool) AST::CaseClauses(sym(1).CaseClause);
1524 sym(1).Node = new (pool) AST::CaseClauses(sym(1).CaseClauses, sym(2).CaseClause);
1532 sym(1).Node = sym(1).CaseClauses->finish ();
1536 AST::CaseClause *node = new (pool) AST::CaseClause(sym(2).Expression, sym(4).StatementList);
1537 node->caseToken = loc(1);
1538 node->colonToken = loc(3);
1543 AST::DefaultClause *node = new (pool) AST::DefaultClause(sym(3).StatementList);
1544 node->defaultToken = loc(1);
1545 node->colonToken = loc(2);
1550 AST::LabelledStatement *node = new (pool) AST::LabelledStatement(stringRef(1), sym(3).Statement);
1551 node->identifierToken = loc(1);
1552 node->colonToken = loc(2);
1557 AST::LabelledStatement *node = new (pool) AST::LabelledStatement(stringRef(1), sym(3).Statement);
1558 node->identifierToken = loc(1);
1559 node->colonToken = loc(2);
1564 AST::ThrowStatement *node = new (pool) AST::ThrowStatement(sym(2).Expression);
1565 node->throwToken = loc(1);
1566 node->semicolonToken = loc(3);
1571 AST::TryStatement *node = new (pool) AST::TryStatement(sym(2).Statement, sym(3).Catch);
1572 node->tryToken = loc(1);
1577 AST::TryStatement *node = new (pool) AST::TryStatement(sym(2).Statement, sym(3).Finally);
1578 node->tryToken = loc(1);
1583 AST::TryStatement *node = new (pool) AST::TryStatement(sym(2).Statement, sym(3).Catch, sym(4).Finally);
1584 node->tryToken = loc(1);
1589 AST::Catch *node = new (pool) AST::Catch(stringRef(3), sym(5).Block);
1590 node->catchToken = loc(1);
1591 node->lparenToken = loc(2);
1592 node->identifierToken = loc(3);
1593 node->rparenToken = loc(4);
1598 AST::Finally *node = new (pool) AST::Finally(sym(2).Block);
1599 node->finallyToken = loc(1);
1604 AST::DebuggerStatement *node = new (pool) AST::DebuggerStatement();
1605 node->debuggerToken = loc(1);
1606 node->semicolonToken = loc(2);
1611 AST::FunctionDeclaration *node = new (pool) AST::FunctionDeclaration(stringRef(2), sym(4).FormalParameterList, sym(7).FunctionBody);
1612 node->functionToken = loc(1);
1613 node->identifierToken = loc(2);
1614 node->lparenToken = loc(3);
1615 node->rparenToken = loc(5);
1616 node->lbraceToken = loc(6);
1617 node->rbraceToken = loc(8);
1622 AST::FunctionExpression *node = new (pool) AST::FunctionExpression(stringRef(2), sym(4).FormalParameterList, sym(7).FunctionBody);
1623 node->functionToken = loc(1);
1624 if (! stringRef(2).isNull())
1625 node->identifierToken = loc(2);
1626 node->lparenToken = loc(3);
1627 node->rparenToken = loc(5);
1628 node->lbraceToken = loc(6);
1629 node->rbraceToken = loc(8);
1634 AST::FormalParameterList *node = new (pool) AST::FormalParameterList(stringRef(1));
1635 node->identifierToken = loc(1);
1640 AST::FormalParameterList *node = new (pool) AST::FormalParameterList(sym(1).FormalParameterList, stringRef(3));
1641 node->commaToken = loc(2);
1642 node->identifierToken = loc(3);
1651 sym(1).Node = sym(1).FormalParameterList->finish ();
1659 sym(1).Node = new (pool) AST::FunctionBody(sym(1).SourceElements->finish ());
1663 sym(1).Node = new (pool) AST::Program(sym(1).SourceElements->finish ());
1667 sym(1).Node = new (pool) AST::SourceElements(sym(1).SourceElement);
1671 sym(1).Node = new (pool) AST::SourceElements(sym(1).SourceElements, sym(2).SourceElement);
1675 sym(1).Node = new (pool) AST::StatementSourceElement(sym(1).Statement);
1679 sym(1).Node = new (pool) AST::FunctionSourceElement(sym(1).FunctionDeclaration);
1683 stringRef(1) = QStringRef();
1691 action = nt_action(state_stack[tos], lhs[r] - TERMINAL_COUNT);
1693 } while (action != 0);
1695 if (first_token == last_token) {
1696 const int errorState = state_stack[tos];
1698 // automatic insertion of `;'
1699 if (yytoken != -1 && t_action(errorState, T_AUTOMATIC_SEMICOLON) && automatic(driver, yytoken)) {
1700 SavedToken &tk = token_buffer[0];
1703 tk.spell = yytokenspell;
1706 yylloc = yyprevlloc;
1707 yylloc.offset += yylloc.length;
1708 yylloc.startColumn += yylloc.length;
1711 //const QString msg = qApp->translate("QDeclarativeParser", "Missing `;'");
1712 //diagnostic_messages.append(DiagnosticMessage(DiagnosticMessage::Warning, yylloc, msg));
1714 first_token = &token_buffer[0];
1715 last_token = &token_buffer[1];
1717 yytoken = T_SEMICOLON;
1720 action = errorState;
1727 token_buffer[0].token = yytoken;
1728 token_buffer[0].dval = yylval;
1729 token_buffer[0].spell = yytokenspell;
1730 token_buffer[0].loc = yylloc;
1732 token_buffer[1].token = yytoken = lexer->lex();
1733 token_buffer[1].dval = yylval = lexer->tokenValue();
1734 token_buffer[1].spell = yytokenspell = lexer->tokenSpell();
1735 token_buffer[1].loc = yylloc = location(lexer);
1737 if (t_action(errorState, yytoken)) {
1739 int token = token_buffer[0].token;
1740 if (token < 0 || token >= TERMINAL_COUNT)
1741 msg = qApp->translate("QDeclarativeParser", "Syntax error");
1743 msg = qApp->translate("QDeclarativeParser", "Unexpected token `%1'").arg(QLatin1String(spell[token]));
1744 diagnostic_messages.append(DiagnosticMessage(DiagnosticMessage::Error, token_buffer[0].loc, msg));
1746 action = errorState;
1750 static int tokens[] = {
1758 T_RPAREN, T_RBRACKET, T_RBRACE,
1763 T_LPAREN, T_LBRACKET, T_LBRACE,
1768 for (int *tk = tokens; *tk != EOF_SYMBOL; ++tk) {
1769 int a = t_action(errorState, *tk);
1770 if (a > 0 && t_action(a, yytoken)) {
1771 const QString msg = qApp->translate("QDeclarativeParser", "Expected token `%1'").arg(QLatin1String(spell[*tk]));
1772 diagnostic_messages.append(DiagnosticMessage(DiagnosticMessage::Error, token_buffer[0].loc, msg));
1776 yylloc = token_buffer[0].loc;
1779 first_token = &token_buffer[0];
1780 last_token = &token_buffer[2];
1782 action = errorState;
1787 for (int tk = 1; tk < TERMINAL_COUNT; ++tk) {
1788 if (tk == T_AUTOMATIC_SEMICOLON || tk == T_FEED_UI_PROGRAM ||
1789 tk == T_FEED_JS_STATEMENT || tk == T_FEED_JS_EXPRESSION ||
1790 tk == T_FEED_JS_SOURCE_ELEMENT)
1793 int a = t_action(errorState, tk);
1794 if (a > 0 && t_action(a, yytoken)) {
1795 const QString msg = qApp->translate("QDeclarativeParser", "Expected token `%1'").arg(QLatin1String(spell[tk]));
1796 diagnostic_messages.append(DiagnosticMessage(DiagnosticMessage::Error, token_buffer[0].loc, msg));
1800 yylloc = token_buffer[0].loc;
1803 action = errorState;
1808 const QString msg = qApp->translate("QDeclarativeParser", "Syntax error");
1809 diagnostic_messages.append(DiagnosticMessage(DiagnosticMessage::Error, token_buffer[0].loc, msg));
1815 QT_QML_END_NAMESPACE