1
/****************************************************************************
3
** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
4
** Contact: http://www.qt-project.org/
6
** This file is part of the QtQml module of the Qt Toolkit.
8
** $QT_BEGIN_LICENSE:LGPL$
9
** GNU Lesser General Public License Usage
10
** This file may be used under the terms of the GNU Lesser General Public
11
** License version 2.1 as published by the Free Software Foundation and
12
** appearing in the file LICENSE.LGPL included in the packaging of this
13
** file. Please review the following information to ensure the GNU Lesser
14
** General Public License version 2.1 requirements will be met:
15
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
17
** In addition, as a special exception, Nokia gives you certain additional
18
** rights. These rights are described in the Nokia Qt LGPL Exception
19
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
21
** GNU General Public License Usage
22
** Alternatively, this file may be used under the terms of the GNU General
23
** Public License version 3.0 as published by the Free Software Foundation
24
** and appearing in the file LICENSE.GPL included in the packaging of this
25
** file. Please review the following information to ensure the GNU General
26
** Public License version 3.0 requirements will be met:
27
** http://www.gnu.org/copyleft/gpl.html.
30
** Alternatively, this file may be used in accordance with the terms and
31
** conditions contained in a signed written agreement between you and Nokia.
40
****************************************************************************/
42
#include <QtCore/QtDebug>
43
#include <QtCore/QCoreApplication>
47
#include "qqmljsengine_p.h"
48
#include "qqmljslexer_p.h"
49
#include "qqmljsast_p.h"
50
#include "qqmljsmemorypool_p.h"
54
#include "qqmljsparser_p.h"
55
#include <QVarLengthArray>
58
// This file is automatically generated from qmljs.g.
59
// Changes will be lost.
62
using namespace QQmlJS;
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("QQmlParser", "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("QQmlParser", "Syntax error");
1738
msg = qApp->translate("QQmlParser", "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("QQmlParser", "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("QQmlParser", "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("QQmlParser", "Syntax error");
1804
diagnostic_messages.append(DiagnosticMessage(DiagnosticMessage::Error, token_buffer[0].loc, msg));
1810
QT_QML_END_NAMESPACE