1 ----------------------------------------------------------------------------
3 -- This file is part of Qt Creator
5 -- Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies).
7 -- Contact: Nokia Corporation (info@qt.nokia.com)
9 -- 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 file.
14 -- Please review the following information to ensure the GNU Lesser General
15 -- 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.
24 -- Alternatively, this file may be used in accordance with the terms and
25 -- conditions contained in a signed written agreement between you and Nokia.
27 -- If you have questions regarding the use of this file, please contact
28 -- Nokia at qt-info@nokia.com.
30 ----------------------------------------------------------------------------
38 %token T_AND "&" T_AND_AND "&&" T_AND_EQ "&="
39 %token T_BREAK "break" T_CASE "case" T_CATCH "catch"
40 %token T_COLON ":" T_COMMA ";" T_CONTINUE "continue"
41 %token T_DEFAULT "default" T_DELETE "delete" T_DIVIDE_ "/"
42 %token T_DIVIDE_EQ "/=" T_DO "do" T_DOT "."
43 %token T_ELSE "else" T_EQ "=" T_EQ_EQ "=="
44 %token T_EQ_EQ_EQ "===" T_FINALLY "finally" T_FOR "for"
45 %token T_FUNCTION "function" T_GE ">=" T_GT ">"
46 %token T_GT_GT ">>" T_GT_GT_EQ ">>=" T_GT_GT_GT ">>>"
47 %token T_GT_GT_GT_EQ ">>>=" T_IDENTIFIER "identifier" T_IF "if"
48 %token T_IN "in" T_INSTANCEOF "instanceof" T_LBRACE "{"
49 %token T_LBRACKET "[" T_LE "<=" T_LPAREN "("
50 %token T_LT "<" T_LT_LT "<<" T_LT_LT_EQ "<<="
51 %token T_MINUS "-" T_MINUS_EQ "-=" T_MINUS_MINUS "--"
52 %token T_NEW "new" T_NOT "!" T_NOT_EQ "!="
53 %token T_NOT_EQ_EQ "!==" T_NUMERIC_LITERAL "numeric literal" T_OR "|"
54 %token T_OR_EQ "|=" T_OR_OR "||" T_PLUS "+"
55 %token T_PLUS_EQ "+=" T_PLUS_PLUS "++" T_QUESTION "?"
56 %token T_RBRACE "}" T_RBRACKET "]" T_REMAINDER "%"
57 %token T_REMAINDER_EQ "%=" T_RETURN "return" T_RPAREN ")"
58 %token T_SEMICOLON ";" T_AUTOMATIC_SEMICOLON T_STAR "*"
59 %token T_STAR_EQ "*=" T_STRING_LITERAL "string literal"
60 %token T_PROPERTY "property" T_SIGNAL "signal" T_READONLY "readonly"
61 %token T_SWITCH "switch" T_THIS "this" T_THROW "throw"
62 %token T_TILDE "~" T_TRY "try" T_TYPEOF "typeof"
63 %token T_VAR "var" T_VOID "void" T_WHILE "while"
64 %token T_WITH "with" T_XOR "^" T_XOR_EQ "^="
65 %token T_NULL "null" T_TRUE "true" T_FALSE "false"
66 %token T_CONST "const"
67 %token T_DEBUGGER "debugger"
68 %token T_RESERVED_WORD "reserved word"
69 %token T_MULTILINE_STRING_LITERAL "multiline string literal"
70 %token T_COMMENT "comment"
73 %token T_PUBLIC "public"
74 %token T_IMPORT "import"
79 %token T_FEED_UI_PROGRAM
80 %token T_FEED_UI_OBJECT_MEMBER
81 %token T_FEED_JS_STATEMENT
82 %token T_FEED_JS_EXPRESSION
83 %token T_FEED_JS_SOURCE_ELEMENT
84 %token T_FEED_JS_PROGRAM
87 %nonassoc T_IDENTIFIER T_COLON T_SIGNAL T_PROPERTY T_READONLY
92 /./**************************************************************************
94 ** This file is part of Qt Creator
96 ** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies).
98 ** Contact: Nokia Corporation (info@qt.nokia.com)
100 ** GNU Lesser General Public License Usage
102 ** This file may be used under the terms of the GNU Lesser General Public
103 ** License version 2.1 as published by the Free Software Foundation and
104 ** appearing in the file LICENSE.LGPL included in the packaging of this file.
105 ** Please review the following information to ensure the GNU Lesser General
106 ** Public License version 2.1 requirements will be met:
107 ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
109 ** In addition, as a special exception, Nokia gives you certain additional
110 ** rights. These rights are described in the Nokia Qt LGPL Exception
111 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
115 ** Alternatively, this file may be used in accordance with the terms and
116 ** conditions contained in a signed written agreement between you and Nokia.
118 ** If you have questions regarding the use of this file, please contact
119 ** Nokia at qt-info@nokia.com.
121 **************************************************************************/
124 #include <QtCore/QtDebug>
125 #include <QtGui/QApplication>
129 #include "qmljsengine_p.h"
130 #include "qmljslexer_p.h"
131 #include "qmljsast_p.h"
132 #include "qmljsnodepool_p.h"
136 /:/**************************************************************************
138 ** This file is part of Qt Creator
140 ** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies).
142 ** Contact: Nokia Corporation (info@qt.nokia.com)
144 ** GNU Lesser General Public License Usage
146 ** This file may be used under the terms of the GNU Lesser General Public
147 ** License version 2.1 as published by the Free Software Foundation and
148 ** appearing in the file LICENSE.LGPL included in the packaging of this file.
149 ** Please review the following information to ensure the GNU Lesser General
150 ** Public License version 2.1 requirements will be met:
151 ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
153 ** In addition, as a special exception, Nokia gives you certain additional
154 ** rights. These rights are described in the Nokia Qt LGPL Exception
155 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
159 ** Alternatively, this file may be used in accordance with the terms and
160 ** conditions contained in a signed written agreement between you and Nokia.
162 ** If you have questions regarding the use of this file, please contact
163 ** Nokia at qt-info@nokia.com.
165 **************************************************************************/
173 // This file is not part of the Qt API. It exists purely as an
174 // implementation detail. This header file may change from version to
175 // version without notice, or even be removed.
181 // This file is automatically generated from qmljs.g.
182 // Changes will be lost.
185 #ifndef QMLJSPARSER_P_H
186 #define QMLJSPARSER_P_H
188 #include "qmljsglobal_p.h"
189 #include "qmljsgrammar_p.h"
190 #include "qmljsast_p.h"
191 #include "qmljsengine_p.h"
193 #include <QtCore/QList>
194 #include <QtCore/QString>
196 QT_QML_BEGIN_NAMESPACE
203 class QML_PARSER_EXPORT Parser: protected $table
210 AST::ArgumentList *ArgumentList;
211 AST::CaseBlock *CaseBlock;
212 AST::CaseClause *CaseClause;
213 AST::CaseClauses *CaseClauses;
215 AST::DefaultClause *DefaultClause;
216 AST::ElementList *ElementList;
217 AST::Elision *Elision;
218 AST::ExpressionNode *Expression;
219 AST::Finally *Finally;
220 AST::FormalParameterList *FormalParameterList;
221 AST::FunctionBody *FunctionBody;
222 AST::FunctionDeclaration *FunctionDeclaration;
224 AST::PropertyName *PropertyName;
225 AST::PropertyNameAndValueList *PropertyNameAndValueList;
226 AST::SourceElement *SourceElement;
227 AST::SourceElements *SourceElements;
228 AST::Statement *Statement;
229 AST::StatementList *StatementList;
231 AST::VariableDeclaration *VariableDeclaration;
232 AST::VariableDeclarationList *VariableDeclarationList;
234 AST::UiProgram *UiProgram;
235 AST::UiImportList *UiImportList;
236 AST::UiImport *UiImport;
237 AST::UiParameterList *UiParameterList;
238 AST::UiPublicMember *UiPublicMember;
239 AST::UiObjectDefinition *UiObjectDefinition;
240 AST::UiObjectInitializer *UiObjectInitializer;
241 AST::UiObjectBinding *UiObjectBinding;
242 AST::UiScriptBinding *UiScriptBinding;
243 AST::UiArrayBinding *UiArrayBinding;
244 AST::UiObjectMember *UiObjectMember;
245 AST::UiObjectMemberList *UiObjectMemberList;
246 AST::UiArrayMemberList *UiArrayMemberList;
247 AST::UiQualifiedId *UiQualifiedId;
248 AST::UiSignature *UiSignature;
249 AST::UiFormalList *UiFormalList;
250 AST::UiFormal *UiFormal;
254 Parser(Engine *engine);
257 // parse a UI program
258 bool parse() { return parse(T_FEED_UI_PROGRAM); }
259 bool parseStatement() { return parse(T_FEED_JS_STATEMENT); }
260 bool parseExpression() { return parse(T_FEED_JS_EXPRESSION); }
261 bool parseSourceElement() { return parse(T_FEED_JS_SOURCE_ELEMENT); }
262 bool parseUiObjectMember() { return parse(T_FEED_UI_OBJECT_MEMBER); }
263 bool parseProgram() { return parse(T_FEED_JS_PROGRAM); }
265 AST::UiProgram *ast() const
266 { return AST::cast<AST::UiProgram *>(program); }
268 AST::Statement *statement() const
273 return program->statementCast();
276 AST::ExpressionNode *expression() const
281 return program->expressionCast();
284 AST::UiObjectMember *uiObjectMember() const
289 return program->uiObjectMemberCast();
292 AST::Node *rootNode() const
295 QList<DiagnosticMessage> diagnosticMessages() const
296 { return diagnostic_messages; }
298 inline DiagnosticMessage diagnosticMessage() const
300 foreach (const DiagnosticMessage &d, diagnostic_messages) {
301 if (! d.kind == DiagnosticMessage::Warning)
305 return DiagnosticMessage();
308 inline QString errorMessage() const
309 { return diagnosticMessage().message; }
311 inline int errorLineNumber() const
312 { return diagnosticMessage().loc.startLine; }
314 inline int errorColumnNumber() const
315 { return diagnosticMessage().loc.startColumn; }
318 bool parse(int startToken);
320 void reallocateStack();
322 inline Value &sym(int index)
323 { return sym_stack [tos + index - 1]; }
325 inline AST::SourceLocation &loc(int index)
326 { return location_stack [tos + index - 1]; }
328 AST::UiQualifiedId *reparseAsQualifiedId(AST::ExpressionNode *expr);
336 AST::SourceLocation *location_stack;
341 enum { TOKEN_BUFFER_SIZE = 3 };
346 AST::SourceLocation loc;
350 AST::SourceLocation yylloc;
351 AST::SourceLocation yyprevlloc;
353 SavedToken token_buffer[TOKEN_BUFFER_SIZE];
354 SavedToken *first_token;
355 SavedToken *last_token;
357 QList<DiagnosticMessage> diagnostic_messages;
360 } // end of namespace QmlJS
368 #include "qmljsparser_p.h"
369 #include <QVarLengthArray>
372 // This file is automatically generated from qmljs.g.
373 // Changes will be lost.
376 using namespace QmlJS;
378 QT_QML_BEGIN_NAMESPACE
380 void Parser::reallocateStack()
387 sym_stack = reinterpret_cast<Value*> (qRealloc(sym_stack, stack_size * sizeof(Value)));
388 state_stack = reinterpret_cast<int*> (qRealloc(state_stack, stack_size * sizeof(int)));
389 location_stack = reinterpret_cast<AST::SourceLocation*> (qRealloc(location_stack, stack_size * sizeof(AST::SourceLocation)));
392 inline static bool automatic(Engine *driver, int token)
394 return token == $table::T_RBRACE
396 || driver->lexer()->prevTerminator();
400 Parser::Parser(Engine *engine):
417 qFree(location_stack);
421 static inline AST::SourceLocation location(Lexer *lexer)
423 AST::SourceLocation loc;
424 loc.offset = lexer->tokenOffset();
425 loc.length = lexer->tokenLength();
426 loc.startLine = lexer->startLineNo();
427 loc.startColumn = lexer->startColumnNo();
431 AST::UiQualifiedId *Parser::reparseAsQualifiedId(AST::ExpressionNode *expr)
433 QVarLengthArray<NameId *, 4> nameIds;
434 QVarLengthArray<AST::SourceLocation, 4> locations;
436 AST::ExpressionNode *it = expr;
437 while (AST::FieldMemberExpression *m = AST::cast<AST::FieldMemberExpression *>(it)) {
438 nameIds.append(m->name);
439 locations.append(m->identifierToken);
443 if (AST::IdentifierExpression *idExpr = AST::cast<AST::IdentifierExpression *>(it)) {
444 AST::UiQualifiedId *q = makeAstNode<AST::UiQualifiedId>(driver->nodePool(), idExpr->name);
445 q->identifierToken = idExpr->identifierToken;
447 AST::UiQualifiedId *currentId = q;
448 for (int i = nameIds.size() - 1; i != -1; --i) {
449 currentId = makeAstNode<AST::UiQualifiedId>(driver->nodePool(), currentId, nameIds[i]);
450 currentId->identifierToken = locations[i];
453 return currentId->finish();
459 bool Parser::parse(int startToken)
461 Lexer *lexer = driver->lexer();
462 bool hadErrors = false;
466 token_buffer[0].token = startToken;
467 first_token = &token_buffer[0];
468 last_token = &token_buffer[1];
474 if (++tos == stack_size)
477 state_stack[tos] = action;
480 if (yytoken == -1 && -TERMINAL_COUNT != action_index[action]) {
483 if (first_token == last_token) {
484 yytoken = lexer->lex();
485 yylval = lexer->dval();
486 yylloc = location(lexer);
488 yytoken = first_token->token;
489 yylval = first_token->dval;
490 yylloc = first_token->loc;
495 action = t_action(action, yytoken);
497 if (action != ACCEPT_STATE) {
499 sym(1).dval = yylval;
505 } else if (action < 0) {
506 const int r = -action - 1;
512 --------------------------------------------------------------------------------------------------------
514 --------------------------------------------------------------------------------------------------------
516 TopLevel: T_FEED_UI_PROGRAM UiProgram ;
519 sym(1).Node = sym(2).Node;
520 program = sym(1).Node;
524 TopLevel: T_FEED_JS_STATEMENT Statement ;
527 sym(1).Node = sym(2).Node;
528 program = sym(1).Node;
532 TopLevel: T_FEED_JS_EXPRESSION Expression ;
535 sym(1).Node = sym(2).Node;
536 program = sym(1).Node;
540 TopLevel: T_FEED_JS_SOURCE_ELEMENT SourceElement ;
543 sym(1).Node = sym(2).Node;
544 program = sym(1).Node;
548 TopLevel: T_FEED_UI_OBJECT_MEMBER UiObjectMember ;
551 sym(1).Node = sym(2).Node;
552 program = sym(1).Node;
556 TopLevel: T_FEED_JS_PROGRAM Program ;
559 sym(1).Node = sym(2).Node;
560 program = sym(1).Node;
564 UiProgram: UiImportListOpt UiRootMember ;
567 sym(1).UiProgram = makeAstNode<AST::UiProgram> (driver->nodePool(), sym(1).UiImportList,
568 sym(2).UiObjectMemberList->finish());
572 UiImportListOpt: Empty ;
573 UiImportListOpt: UiImportList ;
576 sym(1).Node = sym(1).UiImportList->finish();
580 UiImportList: UiImport ;
583 sym(1).Node = makeAstNode<AST::UiImportList> (driver->nodePool(), sym(1).UiImport);
587 UiImportList: UiImportList UiImport ;
590 sym(1).Node = makeAstNode<AST::UiImportList> (driver->nodePool(),
591 sym(1).UiImportList, sym(2).UiImport);
595 ImportId: MemberExpression ;
597 UiImport: UiImportHead T_AUTOMATIC_SEMICOLON ;
598 UiImport: UiImportHead T_SEMICOLON ;
601 sym(1).UiImport->semicolonToken = loc(2);
605 UiImport: UiImportHead T_NUMERIC_LITERAL T_AUTOMATIC_SEMICOLON ;
606 UiImport: UiImportHead T_NUMERIC_LITERAL T_SEMICOLON ;
609 sym(1).UiImport->versionToken = loc(2);
610 sym(1).UiImport->semicolonToken = loc(3);
614 UiImport: UiImportHead T_NUMERIC_LITERAL T_AS JsIdentifier T_AUTOMATIC_SEMICOLON ;
615 UiImport: UiImportHead T_NUMERIC_LITERAL T_AS JsIdentifier T_SEMICOLON ;
618 sym(1).UiImport->versionToken = loc(2);
619 sym(1).UiImport->asToken = loc(3);
620 sym(1).UiImport->importIdToken = loc(4);
621 sym(1).UiImport->importId = sym(4).sval;
622 sym(1).UiImport->semicolonToken = loc(5);
626 UiImport: UiImportHead T_AS JsIdentifier T_AUTOMATIC_SEMICOLON ;
627 UiImport: UiImportHead T_AS JsIdentifier T_SEMICOLON ;
630 sym(1).UiImport->asToken = loc(2);
631 sym(1).UiImport->importIdToken = loc(3);
632 sym(1).UiImport->importId = sym(3).sval;
633 sym(1).UiImport->semicolonToken = loc(4);
638 UiImportHead: T_IMPORT ImportId ;
641 AST::UiImport *node = 0;
643 if (AST::StringLiteral *importIdLiteral = AST::cast<AST::StringLiteral *>(sym(2).Expression)) {
644 node = makeAstNode<AST::UiImport>(driver->nodePool(), importIdLiteral->value);
645 node->fileNameToken = loc(2);
646 } else if (AST::UiQualifiedId *qualifiedId = reparseAsQualifiedId(sym(2).Expression)) {
647 node = makeAstNode<AST::UiImport>(driver->nodePool(), qualifiedId);
648 node->fileNameToken = loc(2);
654 node->importToken = loc(1);
656 diagnostic_messages.append(DiagnosticMessage(DiagnosticMessage::Error, loc(1),
657 QLatin1String("Expected a qualified name id or a string literal")));
659 return false; // ### remove me
671 UiRootMember: UiObjectDefinition ;
674 sym(1).Node = makeAstNode<AST::UiObjectMemberList> (driver->nodePool(), sym(1).UiObjectMember);
678 UiObjectMemberList: UiObjectMember ;
681 sym(1).Node = makeAstNode<AST::UiObjectMemberList> (driver->nodePool(), sym(1).UiObjectMember);
685 UiObjectMemberList: UiObjectMemberList UiObjectMember ;
688 AST::UiObjectMemberList *node = makeAstNode<AST:: UiObjectMemberList> (driver->nodePool(),
689 sym(1).UiObjectMemberList, sym(2).UiObjectMember);
694 UiArrayMemberList: UiObjectDefinition ;
697 sym(1).Node = makeAstNode<AST::UiArrayMemberList> (driver->nodePool(), sym(1).UiObjectMember);
701 UiArrayMemberList: UiArrayMemberList T_COMMA UiObjectDefinition ;
704 AST::UiArrayMemberList *node = makeAstNode<AST::UiArrayMemberList> (driver->nodePool(),
705 sym(1).UiArrayMemberList, sym(3).UiObjectMember);
706 node->commaToken = loc(2);
711 UiObjectInitializer: T_LBRACE T_RBRACE ;
714 AST::UiObjectInitializer *node = makeAstNode<AST::UiObjectInitializer> (driver->nodePool(), (AST::UiObjectMemberList*)0);
715 node->lbraceToken = loc(1);
716 node->rbraceToken = loc(2);
721 UiObjectInitializer: T_LBRACE UiObjectMemberList T_RBRACE ;
724 AST::UiObjectInitializer *node = makeAstNode<AST::UiObjectInitializer> (driver->nodePool(), sym(2).UiObjectMemberList->finish());
725 node->lbraceToken = loc(1);
726 node->rbraceToken = loc(3);
731 UiObjectDefinition: UiQualifiedId UiObjectInitializer ;
734 AST::UiObjectDefinition *node = makeAstNode<AST::UiObjectDefinition> (driver->nodePool(), sym(1).UiQualifiedId,
735 sym(2).UiObjectInitializer);
740 UiObjectMember: UiObjectDefinition ;
742 UiObjectMember: UiQualifiedId T_COLON T_LBRACKET UiArrayMemberList T_RBRACKET ;
745 AST::UiArrayBinding *node = makeAstNode<AST::UiArrayBinding> (driver->nodePool(),
746 sym(1).UiQualifiedId, sym(4).UiArrayMemberList->finish());
747 node->colonToken = loc(2);
748 node->lbracketToken = loc(3);
749 node->rbracketToken = loc(5);
754 UiObjectMember: UiQualifiedId T_COLON UiQualifiedId UiObjectInitializer ;
757 AST::UiObjectBinding *node = makeAstNode<AST::UiObjectBinding> (driver->nodePool(),
758 sym(1).UiQualifiedId, sym(3).UiQualifiedId, sym(4).UiObjectInitializer);
759 node->colonToken = loc(2);
764 UiObjectMember: UiQualifiedId T_ON UiQualifiedId UiObjectInitializer ;
767 AST::UiObjectBinding *node = makeAstNode<AST::UiObjectBinding> (driver->nodePool(),
768 sym(3).UiQualifiedId, sym(1).UiQualifiedId, sym(4).UiObjectInitializer);
769 node->colonToken = loc(2);
770 node->hasOnToken = true;
775 UiObjectMember: UiQualifiedId T_COLON Block ;
776 /.case $rule_number:./
778 UiObjectMember: UiQualifiedId T_COLON EmptyStatement ;
779 /.case $rule_number:./
781 UiObjectMember: UiQualifiedId T_COLON ExpressionStatement ;
782 /.case $rule_number:./
784 UiObjectMember: UiQualifiedId T_COLON IfStatement ; --- ### do we really want if statement in a binding?
785 /.case $rule_number:./
789 AST::UiScriptBinding *node = makeAstNode<AST::UiScriptBinding> (driver->nodePool(),
790 sym(1).UiQualifiedId, sym(3).Statement);
791 node->colonToken = loc(2);
796 UiPropertyType: T_VAR ;
800 UiPropertyType: T_RESERVED_WORD ;
803 sym(1).sval = driver->intern(lexer->characterBuffer(), lexer->characterCount());
808 UiPropertyType: T_IDENTIFIER ;
810 UiParameterListOpt: ;
817 UiParameterListOpt: UiParameterList ;
820 sym(1).Node = sym(1).UiParameterList->finish ();
824 UiParameterList: UiPropertyType JsIdentifier ;
827 AST::UiParameterList *node = makeAstNode<AST::UiParameterList> (driver->nodePool(), sym(1).sval, sym(2).sval);
828 node->identifierToken = loc(2);
833 UiParameterList: UiParameterList T_COMMA UiPropertyType JsIdentifier ;
836 AST::UiParameterList *node = makeAstNode<AST::UiParameterList> (driver->nodePool(), sym(1).UiParameterList, sym(3).sval, sym(4).sval);
837 node->commaToken = loc(2);
838 node->identifierToken = loc(4);
843 UiObjectMember: T_SIGNAL T_IDENTIFIER T_LPAREN UiParameterListOpt T_RPAREN T_AUTOMATIC_SEMICOLON ;
844 UiObjectMember: T_SIGNAL T_IDENTIFIER T_LPAREN UiParameterListOpt T_RPAREN T_SEMICOLON ;
847 AST::UiPublicMember *node = makeAstNode<AST::UiPublicMember> (driver->nodePool(), (NameId *)0, sym(2).sval);
848 node->type = AST::UiPublicMember::Signal;
849 node->propertyToken = loc(1);
850 node->typeToken = loc(2);
851 node->identifierToken = loc(2);
852 node->parameters = sym(4).UiParameterList;
853 node->semicolonToken = loc(6);
858 UiObjectMember: T_SIGNAL T_IDENTIFIER T_AUTOMATIC_SEMICOLON ;
859 UiObjectMember: T_SIGNAL T_IDENTIFIER T_SEMICOLON ;
862 AST::UiPublicMember *node = makeAstNode<AST::UiPublicMember> (driver->nodePool(), (NameId *)0, sym(2).sval);
863 node->type = AST::UiPublicMember::Signal;
864 node->propertyToken = loc(1);
865 node->typeToken = loc(2);
866 node->identifierToken = loc(2);
867 node->semicolonToken = loc(3);
872 UiObjectMember: T_PROPERTY T_IDENTIFIER T_LT UiPropertyType T_GT JsIdentifier T_AUTOMATIC_SEMICOLON ;
873 UiObjectMember: T_PROPERTY T_IDENTIFIER T_LT UiPropertyType T_GT JsIdentifier T_SEMICOLON ;
876 AST::UiPublicMember *node = makeAstNode<AST::UiPublicMember> (driver->nodePool(), sym(4).sval, sym(6).sval);
877 node->typeModifier = sym(2).sval;
878 node->propertyToken = loc(1);
879 node->typeModifierToken = loc(2);
880 node->typeToken = loc(4);
881 node->identifierToken = loc(6);
882 node->semicolonToken = loc(7);
887 UiObjectMember: T_PROPERTY UiPropertyType JsIdentifier T_AUTOMATIC_SEMICOLON ;
888 UiObjectMember: T_PROPERTY UiPropertyType JsIdentifier T_SEMICOLON ;
891 AST::UiPublicMember *node = makeAstNode<AST::UiPublicMember> (driver->nodePool(), sym(2).sval, sym(3).sval);
892 node->propertyToken = loc(1);
893 node->typeToken = loc(2);
894 node->identifierToken = loc(3);
895 node->semicolonToken = loc(4);
900 UiObjectMember: T_DEFAULT T_PROPERTY UiPropertyType JsIdentifier T_AUTOMATIC_SEMICOLON ;
901 UiObjectMember: T_DEFAULT T_PROPERTY UiPropertyType JsIdentifier T_SEMICOLON ;
904 AST::UiPublicMember *node = makeAstNode<AST::UiPublicMember> (driver->nodePool(), sym(3).sval, sym(4).sval);
905 node->isDefaultMember = true;
906 node->defaultToken = loc(1);
907 node->propertyToken = loc(2);
908 node->typeToken = loc(3);
909 node->identifierToken = loc(4);
910 node->semicolonToken = loc(5);
915 UiObjectMember: T_PROPERTY UiPropertyType JsIdentifier T_COLON Expression T_AUTOMATIC_SEMICOLON ;
916 UiObjectMember: T_PROPERTY UiPropertyType JsIdentifier T_COLON Expression T_SEMICOLON ;
919 AST::UiPublicMember *node = makeAstNode<AST::UiPublicMember> (driver->nodePool(), sym(2).sval, sym(3).sval,
921 node->propertyToken = loc(1);
922 node->typeToken = loc(2);
923 node->identifierToken = loc(3);
924 node->colonToken = loc(4);
925 node->semicolonToken = loc(6);
930 UiObjectMember: T_READONLY T_PROPERTY UiPropertyType JsIdentifier T_COLON Expression T_AUTOMATIC_SEMICOLON ;
931 UiObjectMember: T_READONLY T_PROPERTY UiPropertyType JsIdentifier T_COLON Expression T_SEMICOLON ;
934 AST::UiPublicMember *node = makeAstNode<AST::UiPublicMember> (driver->nodePool(), sym(3).sval, sym(4).sval,
936 node->isReadonlyMember = true;
937 node->readonlyToken = loc(1);
938 node->propertyToken = loc(2);
939 node->typeToken = loc(3);
940 node->identifierToken = loc(4);
941 node->colonToken = loc(5);
942 node->semicolonToken = loc(7);
947 UiObjectMember: T_DEFAULT T_PROPERTY UiPropertyType JsIdentifier T_COLON Expression T_AUTOMATIC_SEMICOLON ;
948 UiObjectMember: T_DEFAULT T_PROPERTY UiPropertyType JsIdentifier T_COLON Expression T_SEMICOLON ;
951 AST::UiPublicMember *node = makeAstNode<AST::UiPublicMember> (driver->nodePool(), sym(3).sval, sym(4).sval,
953 node->isDefaultMember = true;
954 node->defaultToken = loc(1);
955 node->propertyToken = loc(2);
956 node->typeToken = loc(3);
957 node->identifierToken = loc(4);
958 node->colonToken = loc(5);
959 node->semicolonToken = loc(7);
964 UiObjectMember: T_PROPERTY T_IDENTIFIER T_LT UiPropertyType T_GT JsIdentifier T_COLON T_LBRACKET UiArrayMemberList T_RBRACKET ;
967 AST::UiPublicMember *node = makeAstNode<AST::UiPublicMember> (driver->nodePool(), sym(4).sval, sym(6).sval);
968 node->typeModifier = sym(2).sval;
969 node->propertyToken = loc(1);
970 node->typeModifierToken = loc(2);
971 node->typeToken = loc(4);
972 node->identifierToken = loc(6);
973 node->semicolonToken = loc(7); // insert a fake ';' before ':'
975 AST::UiQualifiedId *propertyName = makeAstNode<AST::UiQualifiedId>(driver->nodePool(), sym(6).sval);
976 propertyName->identifierToken = loc(6);
977 propertyName->next = 0;
979 AST::UiArrayBinding *binding = makeAstNode<AST::UiArrayBinding> (driver->nodePool(),
980 propertyName, sym(9).UiArrayMemberList->finish());
981 binding->colonToken = loc(7);
982 binding->lbracketToken = loc(8);
983 binding->rbracketToken = loc(10);
985 node->binding = binding;
991 UiObjectMember: T_PROPERTY UiPropertyType JsIdentifier T_COLON UiQualifiedId UiObjectInitializer ;
994 AST::UiPublicMember *node = makeAstNode<AST::UiPublicMember> (driver->nodePool(), sym(2).sval, sym(3).sval);
995 node->propertyToken = loc(1);
996 node->typeToken = loc(2);
997 node->identifierToken = loc(3);
998 node->semicolonToken = loc(4); // insert a fake ';' before ':'
1000 AST::UiQualifiedId *propertyName = makeAstNode<AST::UiQualifiedId>(driver->nodePool(), sym(3).sval);
1001 propertyName->identifierToken = loc(3);
1002 propertyName->next = 0;
1004 AST::UiObjectBinding *binding = makeAstNode<AST::UiObjectBinding> (driver->nodePool(),
1005 propertyName, sym(5).UiQualifiedId, sym(6).UiObjectInitializer);
1006 binding->colonToken = loc(4);
1008 node->binding = binding;
1014 UiObjectMember: FunctionDeclaration ;
1016 case $rule_number: {
1017 sym(1).Node = makeAstNode<AST::UiSourceElement>(driver->nodePool(), sym(1).Node);
1021 UiObjectMember: VariableStatement ;
1023 case $rule_number: {
1024 sym(1).Node = makeAstNode<AST::UiSourceElement>(driver->nodePool(), sym(1).Node);
1028 JsIdentifier: T_IDENTIFIER;
1030 JsIdentifier: T_PROPERTY ;
1032 case $rule_number: {
1033 QString s = QLatin1String(QmlJSGrammar::spell[T_PROPERTY]);
1034 sym(1).sval = driver->intern(s.constData(), s.length());
1039 JsIdentifier: T_SIGNAL ;
1041 case $rule_number: {
1042 QString s = QLatin1String(QmlJSGrammar::spell[T_SIGNAL]);
1043 sym(1).sval = driver->intern(s.constData(), s.length());
1048 JsIdentifier: T_READONLY ;
1050 case $rule_number: {
1051 QString s = QLatin1String(QmlJSGrammar::spell[T_READONLY]);
1052 sym(1).sval = driver->intern(s.constData(), s.length());
1057 JsIdentifier: T_ON ;
1059 case $rule_number: {
1060 QString s = QLatin1String(QmlJSGrammar::spell[T_ON]);
1061 sym(1).sval = driver->intern(s.constData(), s.length());
1066 --------------------------------------------------------------------------------------------------------
1068 --------------------------------------------------------------------------------------------------------
1070 PrimaryExpression: T_THIS ;
1072 case $rule_number: {
1073 AST::ThisExpression *node = makeAstNode<AST::ThisExpression> (driver->nodePool());
1074 node->thisToken = loc(1);
1079 PrimaryExpression: JsIdentifier ;
1081 case $rule_number: {
1082 AST::IdentifierExpression *node = makeAstNode<AST::IdentifierExpression> (driver->nodePool(), sym(1).sval);
1083 node->identifierToken = loc(1);
1088 PrimaryExpression: T_NULL ;
1090 case $rule_number: {
1091 AST::NullExpression *node = makeAstNode<AST::NullExpression> (driver->nodePool());
1092 node->nullToken = loc(1);
1097 PrimaryExpression: T_TRUE ;
1099 case $rule_number: {
1100 AST::TrueLiteral *node = makeAstNode<AST::TrueLiteral> (driver->nodePool());
1101 node->trueToken = loc(1);
1106 PrimaryExpression: T_FALSE ;
1108 case $rule_number: {
1109 AST::FalseLiteral *node = makeAstNode<AST::FalseLiteral> (driver->nodePool());
1110 node->falseToken = loc(1);
1115 PrimaryExpression: T_NUMERIC_LITERAL ;
1117 case $rule_number: {
1118 AST::NumericLiteral *node = makeAstNode<AST::NumericLiteral> (driver->nodePool(), sym(1).dval);
1119 node->literalToken = loc(1);
1124 PrimaryExpression: T_MULTILINE_STRING_LITERAL ;
1125 /.case $rule_number:./
1127 PrimaryExpression: T_STRING_LITERAL ;
1129 case $rule_number: {
1130 AST::StringLiteral *node = makeAstNode<AST::StringLiteral> (driver->nodePool(), sym(1).sval);
1131 node->literalToken = loc(1);
1136 PrimaryExpression: T_DIVIDE_ ;
1138 #define J_SCRIPT_REGEXPLITERAL_RULE1 $rule_number
1141 case $rule_number: {
1142 bool rx = lexer->scanRegExp(Lexer::NoPrefix);
1144 diagnostic_messages.append(DiagnosticMessage(DiagnosticMessage::Error, location(lexer), lexer->errorMessage()));
1145 return false; // ### remove me
1148 loc(1).length = lexer->tokenLength();
1150 AST::RegExpLiteral *node = makeAstNode<AST::RegExpLiteral> (driver->nodePool(), lexer->pattern, lexer->flags);
1151 node->literalToken = loc(1);
1156 PrimaryExpression: T_DIVIDE_EQ ;
1158 #define J_SCRIPT_REGEXPLITERAL_RULE2 $rule_number
1161 case $rule_number: {
1162 bool rx = lexer->scanRegExp(Lexer::EqualPrefix);
1164 diagnostic_messages.append(DiagnosticMessage(DiagnosticMessage::Error, location(lexer), lexer->errorMessage()));
1168 loc(1).length = lexer->tokenLength();
1170 AST::RegExpLiteral *node = makeAstNode<AST::RegExpLiteral> (driver->nodePool(), lexer->pattern, lexer->flags);
1171 node->literalToken = loc(1);
1176 PrimaryExpression: T_LBRACKET T_RBRACKET ;
1178 case $rule_number: {
1179 AST::ArrayLiteral *node = makeAstNode<AST::ArrayLiteral> (driver->nodePool(), (AST::Elision *) 0);
1180 node->lbracketToken = loc(1);
1181 node->rbracketToken = loc(2);
1186 PrimaryExpression: T_LBRACKET Elision T_RBRACKET ;
1188 case $rule_number: {
1189 AST::ArrayLiteral *node = makeAstNode<AST::ArrayLiteral> (driver->nodePool(), sym(2).Elision->finish());
1190 node->lbracketToken = loc(1);
1191 node->rbracketToken = loc(3);
1196 PrimaryExpression: T_LBRACKET ElementList T_RBRACKET ;
1198 case $rule_number: {
1199 AST::ArrayLiteral *node = makeAstNode<AST::ArrayLiteral> (driver->nodePool(), sym(2).ElementList->finish ());
1200 node->lbracketToken = loc(1);
1201 node->rbracketToken = loc(3);
1206 PrimaryExpression: T_LBRACKET ElementList T_COMMA T_RBRACKET ;
1208 case $rule_number: {
1209 AST::ArrayLiteral *node = makeAstNode<AST::ArrayLiteral> (driver->nodePool(), sym(2).ElementList->finish (),
1210 (AST::Elision *) 0);
1211 node->lbracketToken = loc(1);
1212 node->commaToken = loc(3);
1213 node->rbracketToken = loc(4);
1218 PrimaryExpression: T_LBRACKET ElementList T_COMMA Elision T_RBRACKET ;
1220 case $rule_number: {
1221 AST::ArrayLiteral *node = makeAstNode<AST::ArrayLiteral> (driver->nodePool(), sym(2).ElementList->finish (),
1222 sym(4).Elision->finish());
1223 node->lbracketToken = loc(1);
1224 node->commaToken = loc(3);
1225 node->rbracketToken = loc(5);
1230 -- PrimaryExpression: T_LBRACE T_RBRACE ;
1232 -- case $rule_number: {
1233 -- sym(1).Node = makeAstNode<AST::ObjectLiteral> (driver->nodePool());
1237 PrimaryExpression: T_LBRACE PropertyNameAndValueListOpt T_RBRACE ;
1239 case $rule_number: {
1240 AST::ObjectLiteral *node = 0;
1242 node = makeAstNode<AST::ObjectLiteral> (driver->nodePool(),
1243 sym(2).PropertyNameAndValueList->finish ());
1245 node = makeAstNode<AST::ObjectLiteral> (driver->nodePool());
1246 node->lbraceToken = loc(1);
1247 node->rbraceToken = loc(3);
1252 PrimaryExpression: T_LBRACE PropertyNameAndValueList T_COMMA T_RBRACE ;
1254 case $rule_number: {
1255 AST::ObjectLiteral *node = makeAstNode<AST::ObjectLiteral> (driver->nodePool(),
1256 sym(2).PropertyNameAndValueList->finish ());
1257 node->lbraceToken = loc(1);
1258 node->rbraceToken = loc(4);
1263 PrimaryExpression: T_LPAREN Expression T_RPAREN ;
1265 case $rule_number: {
1266 AST::NestedExpression *node = makeAstNode<AST::NestedExpression>(driver->nodePool(), sym(2).Expression);
1267 node->lparenToken = loc(1);
1268 node->rparenToken = loc(3);
1273 UiQualifiedId: MemberExpression ;
1275 case $rule_number: {
1276 if (AST::ArrayMemberExpression *mem = AST::cast<AST::ArrayMemberExpression *>(sym(1).Expression)) {
1277 diagnostic_messages.append(DiagnosticMessage(DiagnosticMessage::Warning, mem->lbracketToken,
1278 QLatin1String("Ignored annotation")));
1280 sym(1).Expression = mem->base;
1283 if (AST::UiQualifiedId *qualifiedId = reparseAsQualifiedId(sym(1).Expression)) {
1284 sym(1).UiQualifiedId = qualifiedId;
1286 sym(1).UiQualifiedId = 0;
1288 diagnostic_messages.append(DiagnosticMessage(DiagnosticMessage::Error, loc(1),
1289 QLatin1String("Expected a qualified name id")));
1291 return false; // ### recover
1296 ElementList: AssignmentExpression ;
1298 case $rule_number: {
1299 sym(1).Node = makeAstNode<AST::ElementList> (driver->nodePool(), (AST::Elision *) 0, sym(1).Expression);
1303 ElementList: Elision AssignmentExpression ;
1305 case $rule_number: {
1306 sym(1).Node = makeAstNode<AST::ElementList> (driver->nodePool(), sym(1).Elision->finish(), sym(2).Expression);
1310 ElementList: ElementList T_COMMA AssignmentExpression ;
1312 case $rule_number: {
1313 AST::ElementList *node = makeAstNode<AST::ElementList> (driver->nodePool(), sym(1).ElementList,
1314 (AST::Elision *) 0, sym(3).Expression);
1315 node->commaToken = loc(2);
1320 ElementList: ElementList T_COMMA Elision AssignmentExpression ;
1322 case $rule_number: {
1323 AST::ElementList *node = makeAstNode<AST::ElementList> (driver->nodePool(), sym(1).ElementList, sym(3).Elision->finish(),
1325 node->commaToken = loc(2);
1332 case $rule_number: {
1333 AST::Elision *node = makeAstNode<AST::Elision> (driver->nodePool());
1334 node->commaToken = loc(1);
1339 Elision: Elision T_COMMA ;
1341 case $rule_number: {
1342 AST::Elision *node = makeAstNode<AST::Elision> (driver->nodePool(), sym(1).Elision);
1343 node->commaToken = loc(2);
1348 PropertyNameAndValueList: PropertyName T_COLON AssignmentExpression ;
1350 case $rule_number: {
1351 AST::PropertyNameAndValueList *node = makeAstNode<AST::PropertyNameAndValueList> (driver->nodePool(),
1352 sym(1).PropertyName, sym(3).Expression);
1353 node->colonToken = loc(2);
1358 PropertyNameAndValueList: PropertyNameAndValueList T_COMMA PropertyName T_COLON AssignmentExpression ;
1360 case $rule_number: {
1361 AST::PropertyNameAndValueList *node = makeAstNode<AST::PropertyNameAndValueList> (driver->nodePool(),
1362 sym(1).PropertyNameAndValueList, sym(3).PropertyName, sym(5).Expression);
1363 node->commaToken = loc(2);
1364 node->colonToken = loc(4);
1369 PropertyName: T_IDENTIFIER %prec SHIFT_THERE ;
1371 case $rule_number: {
1372 AST::IdentifierPropertyName *node = makeAstNode<AST::IdentifierPropertyName> (driver->nodePool(), sym(1).sval);
1373 node->propertyNameToken = loc(1);
1378 PropertyName: T_SIGNAL ;
1379 /.case $rule_number:./
1381 PropertyName: T_PROPERTY ;
1383 case $rule_number: {
1384 AST::IdentifierPropertyName *node = makeAstNode<AST::IdentifierPropertyName> (driver->nodePool(), driver->intern(lexer->characterBuffer(), lexer->characterCount()));
1385 node->propertyNameToken = loc(1);
1390 PropertyName: T_STRING_LITERAL ;
1392 case $rule_number: {
1393 AST::StringLiteralPropertyName *node = makeAstNode<AST::StringLiteralPropertyName> (driver->nodePool(), sym(1).sval);
1394 node->propertyNameToken = loc(1);
1399 PropertyName: T_NUMERIC_LITERAL ;
1401 case $rule_number: {
1402 AST::NumericLiteralPropertyName *node = makeAstNode<AST::NumericLiteralPropertyName> (driver->nodePool(), sym(1).dval);
1403 node->propertyNameToken = loc(1);
1408 PropertyName: ReservedIdentifier ;
1410 case $rule_number: {
1411 AST::IdentifierPropertyName *node = makeAstNode<AST::IdentifierPropertyName> (driver->nodePool(), sym(1).sval);
1412 node->propertyNameToken = loc(1);
1417 ReservedIdentifier: T_BREAK ;
1421 ReservedIdentifier: T_CASE ;
1425 ReservedIdentifier: T_CATCH ;
1429 ReservedIdentifier: T_CONTINUE ;
1433 ReservedIdentifier: T_DEFAULT ;
1437 ReservedIdentifier: T_DELETE ;
1441 ReservedIdentifier: T_DO ;
1445 ReservedIdentifier: T_ELSE ;
1449 ReservedIdentifier: T_FALSE ;
1453 ReservedIdentifier: T_FINALLY ;
1457 ReservedIdentifier: T_FOR ;
1461 ReservedIdentifier: T_FUNCTION ;
1465 ReservedIdentifier: T_IF ;
1469 ReservedIdentifier: T_IN ;
1473 ReservedIdentifier: T_INSTANCEOF ;
1477 ReservedIdentifier: T_NEW ;
1481 ReservedIdentifier: T_NULL ;
1485 ReservedIdentifier: T_RETURN ;
1489 ReservedIdentifier: T_SWITCH ;
1493 ReservedIdentifier: T_THIS ;
1497 ReservedIdentifier: T_THROW ;
1501 ReservedIdentifier: T_TRUE ;
1505 ReservedIdentifier: T_TRY ;
1509 ReservedIdentifier: T_TYPEOF ;
1513 ReservedIdentifier: T_VAR ;
1517 ReservedIdentifier: T_VOID ;
1521 ReservedIdentifier: T_WHILE ;
1525 ReservedIdentifier: T_CONST ;
1529 ReservedIdentifier: T_DEBUGGER ;
1533 ReservedIdentifier: T_RESERVED_WORD ;
1537 ReservedIdentifier: T_WITH ;
1541 sym(1).sval = driver->intern(lexer->characterBuffer(), lexer->characterCount());
1545 PropertyIdentifier: JsIdentifier ;
1546 PropertyIdentifier: ReservedIdentifier ;
1548 MemberExpression: PrimaryExpression ;
1549 MemberExpression: FunctionExpression ;
1551 MemberExpression: MemberExpression T_LBRACKET Expression T_RBRACKET ;
1553 case $rule_number: {
1554 AST::ArrayMemberExpression *node = makeAstNode<AST::ArrayMemberExpression> (driver->nodePool(), sym(1).Expression, sym(3).Expression);
1555 node->lbracketToken = loc(2);
1556 node->rbracketToken = loc(4);
1561 MemberExpression: MemberExpression T_DOT PropertyIdentifier ;
1563 case $rule_number: {
1564 AST::FieldMemberExpression *node = makeAstNode<AST::FieldMemberExpression> (driver->nodePool(), sym(1).Expression, sym(3).sval);
1565 node->dotToken = loc(2);
1566 node->identifierToken = loc(3);
1571 MemberExpression: T_NEW MemberExpression T_LPAREN ArgumentListOpt T_RPAREN ;
1573 case $rule_number: {
1574 AST::NewMemberExpression *node = makeAstNode<AST::NewMemberExpression> (driver->nodePool(), sym(2).Expression, sym(4).ArgumentList);
1575 node->newToken = loc(1);
1576 node->lparenToken = loc(3);
1577 node->rparenToken = loc(5);
1582 NewExpression: MemberExpression ;
1584 NewExpression: T_NEW NewExpression ;
1586 case $rule_number: {
1587 AST::NewExpression *node = makeAstNode<AST::NewExpression> (driver->nodePool(), sym(2).Expression);
1588 node->newToken = loc(1);
1593 CallExpression: MemberExpression T_LPAREN ArgumentListOpt T_RPAREN ;
1595 case $rule_number: {
1596 AST::CallExpression *node = makeAstNode<AST::CallExpression> (driver->nodePool(), sym(1).Expression, sym(3).ArgumentList);
1597 node->lparenToken = loc(2);
1598 node->rparenToken = loc(4);
1603 CallExpression: CallExpression T_LPAREN ArgumentListOpt T_RPAREN ;
1605 case $rule_number: {
1606 AST::CallExpression *node = makeAstNode<AST::CallExpression> (driver->nodePool(), sym(1).Expression, sym(3).ArgumentList);
1607 node->lparenToken = loc(2);
1608 node->rparenToken = loc(4);
1613 CallExpression: CallExpression T_LBRACKET Expression T_RBRACKET ;
1615 case $rule_number: {
1616 AST::ArrayMemberExpression *node = makeAstNode<AST::ArrayMemberExpression> (driver->nodePool(), sym(1).Expression, sym(3).Expression);
1617 node->lbracketToken = loc(2);
1618 node->rbracketToken = loc(4);
1623 CallExpression: CallExpression T_DOT PropertyIdentifier ;
1625 case $rule_number: {
1626 AST::FieldMemberExpression *node = makeAstNode<AST::FieldMemberExpression> (driver->nodePool(), sym(1).Expression, sym(3).sval);
1627 node->dotToken = loc(2);
1628 node->identifierToken = loc(3);
1635 case $rule_number: {
1640 ArgumentListOpt: ArgumentList ;
1642 case $rule_number: {
1643 sym(1).Node = sym(1).ArgumentList->finish();
1647 ArgumentList: AssignmentExpression ;
1649 case $rule_number: {
1650 sym(1).Node = makeAstNode<AST::ArgumentList> (driver->nodePool(), sym(1).Expression);
1654 ArgumentList: ArgumentList T_COMMA AssignmentExpression ;
1656 case $rule_number: {
1657 AST::ArgumentList *node = makeAstNode<AST::ArgumentList> (driver->nodePool(), sym(1).ArgumentList, sym(3).Expression);
1658 node->commaToken = loc(2);
1663 LeftHandSideExpression: NewExpression ;
1664 LeftHandSideExpression: CallExpression ;
1665 PostfixExpression: LeftHandSideExpression ;
1667 PostfixExpression: LeftHandSideExpression T_PLUS_PLUS ;
1669 case $rule_number: {
1670 AST::PostIncrementExpression *node = makeAstNode<AST::PostIncrementExpression> (driver->nodePool(), sym(1).Expression);
1671 node->incrementToken = loc(2);
1676 PostfixExpression: LeftHandSideExpression T_MINUS_MINUS ;
1678 case $rule_number: {
1679 AST::PostDecrementExpression *node = makeAstNode<AST::PostDecrementExpression> (driver->nodePool(), sym(1).Expression);
1680 node->decrementToken = loc(2);
1685 UnaryExpression: PostfixExpression ;
1687 UnaryExpression: T_DELETE UnaryExpression ;
1689 case $rule_number: {
1690 AST::DeleteExpression *node = makeAstNode<AST::DeleteExpression> (driver->nodePool(), sym(2).Expression);
1691 node->deleteToken = loc(1);
1696 UnaryExpression: T_VOID UnaryExpression ;
1698 case $rule_number: {
1699 AST::VoidExpression *node = makeAstNode<AST::VoidExpression> (driver->nodePool(), sym(2).Expression);
1700 node->voidToken = loc(1);
1705 UnaryExpression: T_TYPEOF UnaryExpression ;
1707 case $rule_number: {
1708 AST::TypeOfExpression *node = makeAstNode<AST::TypeOfExpression> (driver->nodePool(), sym(2).Expression);
1709 node->typeofToken = loc(1);
1714 UnaryExpression: T_PLUS_PLUS UnaryExpression ;
1716 case $rule_number: {
1717 AST::PreIncrementExpression *node = makeAstNode<AST::PreIncrementExpression> (driver->nodePool(), sym(2).Expression);
1718 node->incrementToken = loc(1);
1723 UnaryExpression: T_MINUS_MINUS UnaryExpression ;
1725 case $rule_number: {
1726 AST::PreDecrementExpression *node = makeAstNode<AST::PreDecrementExpression> (driver->nodePool(), sym(2).Expression);
1727 node->decrementToken = loc(1);
1732 UnaryExpression: T_PLUS UnaryExpression ;
1734 case $rule_number: {
1735 AST::UnaryPlusExpression *node = makeAstNode<AST::UnaryPlusExpression> (driver->nodePool(), sym(2).Expression);
1736 node->plusToken = loc(1);
1741 UnaryExpression: T_MINUS UnaryExpression ;
1743 case $rule_number: {
1744 AST::UnaryMinusExpression *node = makeAstNode<AST::UnaryMinusExpression> (driver->nodePool(), sym(2).Expression);
1745 node->minusToken = loc(1);
1750 UnaryExpression: T_TILDE UnaryExpression ;
1752 case $rule_number: {
1753 AST::TildeExpression *node = makeAstNode<AST::TildeExpression> (driver->nodePool(), sym(2).Expression);
1754 node->tildeToken = loc(1);
1759 UnaryExpression: T_NOT UnaryExpression ;
1761 case $rule_number: {
1762 AST::NotExpression *node = makeAstNode<AST::NotExpression> (driver->nodePool(), sym(2).Expression);
1763 node->notToken = loc(1);
1768 MultiplicativeExpression: UnaryExpression ;
1770 MultiplicativeExpression: MultiplicativeExpression T_STAR UnaryExpression ;
1772 case $rule_number: {
1773 AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
1774 QSOperator::Mul, sym(3).Expression);
1775 node->operatorToken = loc(2);
1780 MultiplicativeExpression: MultiplicativeExpression T_DIVIDE_ UnaryExpression ;
1782 case $rule_number: {
1783 AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
1784 QSOperator::Div, sym(3).Expression);
1785 node->operatorToken = loc(2);
1790 MultiplicativeExpression: MultiplicativeExpression T_REMAINDER UnaryExpression ;
1792 case $rule_number: {
1793 AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
1794 QSOperator::Mod, sym(3).Expression);
1795 node->operatorToken = loc(2);
1800 AdditiveExpression: MultiplicativeExpression ;
1802 AdditiveExpression: AdditiveExpression T_PLUS MultiplicativeExpression ;
1804 case $rule_number: {
1805 AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
1806 QSOperator::Add, sym(3).Expression);
1807 node->operatorToken = loc(2);
1812 AdditiveExpression: AdditiveExpression T_MINUS MultiplicativeExpression ;
1814 case $rule_number: {
1815 AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
1816 QSOperator::Sub, sym(3).Expression);
1817 node->operatorToken = loc(2);
1822 ShiftExpression: AdditiveExpression ;
1824 ShiftExpression: ShiftExpression T_LT_LT AdditiveExpression ;
1826 case $rule_number: {
1827 AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
1828 QSOperator::LShift, sym(3).Expression);
1829 node->operatorToken = loc(2);
1834 ShiftExpression: ShiftExpression T_GT_GT AdditiveExpression ;
1836 case $rule_number: {
1837 AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
1838 QSOperator::RShift, sym(3).Expression);
1839 node->operatorToken = loc(2);
1844 ShiftExpression: ShiftExpression T_GT_GT_GT AdditiveExpression ;
1846 case $rule_number: {
1847 AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
1848 QSOperator::URShift, sym(3).Expression);
1849 node->operatorToken = loc(2);
1854 RelationalExpression: ShiftExpression ;
1856 RelationalExpression: RelationalExpression T_LT ShiftExpression ;
1858 case $rule_number: {
1859 AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
1860 QSOperator::Lt, sym(3).Expression);
1861 node->operatorToken = loc(2);
1866 RelationalExpression: RelationalExpression T_GT ShiftExpression ;
1868 case $rule_number: {
1869 AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
1870 QSOperator::Gt, sym(3).Expression);
1871 node->operatorToken = loc(2);
1876 RelationalExpression: RelationalExpression T_LE ShiftExpression ;
1878 case $rule_number: {
1879 AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
1880 QSOperator::Le, sym(3).Expression);
1881 node->operatorToken = loc(2);
1886 RelationalExpression: RelationalExpression T_GE ShiftExpression ;
1888 case $rule_number: {
1889 AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
1890 QSOperator::Ge, sym(3).Expression);
1891 node->operatorToken = loc(2);
1896 RelationalExpression: RelationalExpression T_INSTANCEOF ShiftExpression ;
1898 case $rule_number: {
1899 AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
1900 QSOperator::InstanceOf, sym(3).Expression);
1901 node->operatorToken = loc(2);
1906 RelationalExpression: RelationalExpression T_IN ShiftExpression ;
1908 case $rule_number: {
1909 AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
1910 QSOperator::In, sym(3).Expression);
1911 node->operatorToken = loc(2);
1916 RelationalExpressionNotIn: ShiftExpression ;
1918 RelationalExpressionNotIn: RelationalExpressionNotIn T_LT ShiftExpression ;
1920 case $rule_number: {
1921 AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
1922 QSOperator::Lt, sym(3).Expression);
1923 node->operatorToken = loc(2);
1928 RelationalExpressionNotIn: RelationalExpressionNotIn T_GT ShiftExpression ;
1930 case $rule_number: {
1931 AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
1932 QSOperator::Gt, sym(3).Expression);
1933 node->operatorToken = loc(2);
1938 RelationalExpressionNotIn: RelationalExpressionNotIn T_LE ShiftExpression ;
1940 case $rule_number: {
1941 AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
1942 QSOperator::Le, sym(3).Expression);
1943 node->operatorToken = loc(2);
1948 RelationalExpressionNotIn: RelationalExpressionNotIn T_GE ShiftExpression ;
1950 case $rule_number: {
1951 AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
1952 QSOperator::Ge, sym(3).Expression);
1953 node->operatorToken = loc(2);
1958 RelationalExpressionNotIn: RelationalExpressionNotIn T_INSTANCEOF ShiftExpression ;
1960 case $rule_number: {
1961 AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
1962 QSOperator::InstanceOf, sym(3).Expression);
1963 node->operatorToken = loc(2);
1968 EqualityExpression: RelationalExpression ;
1970 EqualityExpression: EqualityExpression T_EQ_EQ RelationalExpression ;
1972 case $rule_number: {
1973 AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
1974 QSOperator::Equal, sym(3).Expression);
1975 node->operatorToken = loc(2);
1980 EqualityExpression: EqualityExpression T_NOT_EQ RelationalExpression ;
1982 case $rule_number: {
1983 AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
1984 QSOperator::NotEqual, sym(3).Expression);
1985 node->operatorToken = loc(2);
1990 EqualityExpression: EqualityExpression T_EQ_EQ_EQ RelationalExpression ;
1992 case $rule_number: {
1993 AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
1994 QSOperator::StrictEqual, sym(3).Expression);
1995 node->operatorToken = loc(2);
2000 EqualityExpression: EqualityExpression T_NOT_EQ_EQ RelationalExpression ;
2002 case $rule_number: {
2003 AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
2004 QSOperator::StrictNotEqual, sym(3).Expression);
2005 node->operatorToken = loc(2);
2010 EqualityExpressionNotIn: RelationalExpressionNotIn ;
2012 EqualityExpressionNotIn: EqualityExpressionNotIn T_EQ_EQ RelationalExpressionNotIn ;
2014 case $rule_number: {
2015 AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
2016 QSOperator::Equal, sym(3).Expression);
2017 node->operatorToken = loc(2);
2022 EqualityExpressionNotIn: EqualityExpressionNotIn T_NOT_EQ RelationalExpressionNotIn;
2024 case $rule_number: {
2025 AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
2026 QSOperator::NotEqual, sym(3).Expression);
2027 node->operatorToken = loc(2);
2032 EqualityExpressionNotIn: EqualityExpressionNotIn T_EQ_EQ_EQ RelationalExpressionNotIn ;
2034 case $rule_number: {
2035 AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
2036 QSOperator::StrictEqual, sym(3).Expression);
2037 node->operatorToken = loc(2);
2042 EqualityExpressionNotIn: EqualityExpressionNotIn T_NOT_EQ_EQ RelationalExpressionNotIn ;
2044 case $rule_number: {
2045 AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
2046 QSOperator::StrictNotEqual, sym(3).Expression);
2047 node->operatorToken = loc(2);
2052 BitwiseANDExpression: EqualityExpression ;
2054 BitwiseANDExpression: BitwiseANDExpression T_AND EqualityExpression ;
2056 case $rule_number: {
2057 AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
2058 QSOperator::BitAnd, sym(3).Expression);
2059 node->operatorToken = loc(2);
2064 BitwiseANDExpressionNotIn: EqualityExpressionNotIn ;
2066 BitwiseANDExpressionNotIn: BitwiseANDExpressionNotIn T_AND EqualityExpressionNotIn ;
2068 case $rule_number: {
2069 AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
2070 QSOperator::BitAnd, sym(3).Expression);
2071 node->operatorToken = loc(2);
2076 BitwiseXORExpression: BitwiseANDExpression ;
2078 BitwiseXORExpression: BitwiseXORExpression T_XOR BitwiseANDExpression ;
2080 case $rule_number: {
2081 AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
2082 QSOperator::BitXor, sym(3).Expression);
2083 node->operatorToken = loc(2);
2088 BitwiseXORExpressionNotIn: BitwiseANDExpressionNotIn ;
2090 BitwiseXORExpressionNotIn: BitwiseXORExpressionNotIn T_XOR BitwiseANDExpressionNotIn ;
2092 case $rule_number: {
2093 AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
2094 QSOperator::BitXor, sym(3).Expression);
2095 node->operatorToken = loc(2);
2100 BitwiseORExpression: BitwiseXORExpression ;
2102 BitwiseORExpression: BitwiseORExpression T_OR BitwiseXORExpression ;
2104 case $rule_number: {
2105 AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
2106 QSOperator::BitOr, sym(3).Expression);
2107 node->operatorToken = loc(2);
2112 BitwiseORExpressionNotIn: BitwiseXORExpressionNotIn ;
2114 BitwiseORExpressionNotIn: BitwiseORExpressionNotIn T_OR BitwiseXORExpressionNotIn ;
2116 case $rule_number: {
2117 AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
2118 QSOperator::BitOr, sym(3).Expression);
2119 node->operatorToken = loc(2);
2124 LogicalANDExpression: BitwiseORExpression ;
2126 LogicalANDExpression: LogicalANDExpression T_AND_AND BitwiseORExpression ;
2128 case $rule_number: {
2129 AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
2130 QSOperator::And, sym(3).Expression);
2131 node->operatorToken = loc(2);
2136 LogicalANDExpressionNotIn: BitwiseORExpressionNotIn ;
2138 LogicalANDExpressionNotIn: LogicalANDExpressionNotIn T_AND_AND BitwiseORExpressionNotIn ;
2140 case $rule_number: {
2141 AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
2142 QSOperator::And, sym(3).Expression);
2143 node->operatorToken = loc(2);
2148 LogicalORExpression: LogicalANDExpression ;
2150 LogicalORExpression: LogicalORExpression T_OR_OR LogicalANDExpression ;
2152 case $rule_number: {
2153 AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
2154 QSOperator::Or, sym(3).Expression);
2155 node->operatorToken = loc(2);
2160 LogicalORExpressionNotIn: LogicalANDExpressionNotIn ;
2162 LogicalORExpressionNotIn: LogicalORExpressionNotIn T_OR_OR LogicalANDExpressionNotIn ;
2164 case $rule_number: {
2165 AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
2166 QSOperator::Or, sym(3).Expression);
2167 node->operatorToken = loc(2);
2172 ConditionalExpression: LogicalORExpression ;
2174 ConditionalExpression: LogicalORExpression T_QUESTION AssignmentExpression T_COLON AssignmentExpression ;
2176 case $rule_number: {
2177 AST::ConditionalExpression *node = makeAstNode<AST::ConditionalExpression> (driver->nodePool(), sym(1).Expression,
2178 sym(3).Expression, sym(5).Expression);
2179 node->questionToken = loc(2);
2180 node->colonToken = loc(4);
2185 ConditionalExpressionNotIn: LogicalORExpressionNotIn ;
2187 ConditionalExpressionNotIn: LogicalORExpressionNotIn T_QUESTION AssignmentExpressionNotIn T_COLON AssignmentExpressionNotIn ;
2189 case $rule_number: {
2190 AST::ConditionalExpression *node = makeAstNode<AST::ConditionalExpression> (driver->nodePool(), sym(1).Expression,
2191 sym(3).Expression, sym(5).Expression);
2192 node->questionToken = loc(2);
2193 node->colonToken = loc(4);
2198 AssignmentExpression: ConditionalExpression ;
2200 AssignmentExpression: LeftHandSideExpression AssignmentOperator AssignmentExpression ;
2202 case $rule_number: {
2203 AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
2204 sym(2).ival, sym(3).Expression);
2205 node->operatorToken = loc(2);
2210 AssignmentExpressionNotIn: ConditionalExpressionNotIn ;
2212 AssignmentExpressionNotIn: LeftHandSideExpression AssignmentOperator AssignmentExpressionNotIn ;
2214 case $rule_number: {
2215 AST::BinaryExpression *node = makeAstNode<AST::BinaryExpression> (driver->nodePool(), sym(1).Expression,
2216 sym(2).ival, sym(3).Expression);
2217 node->operatorToken = loc(2);
2222 AssignmentOperator: T_EQ ;
2224 case $rule_number: {
2225 sym(1).ival = QSOperator::Assign;
2229 AssignmentOperator: T_STAR_EQ ;
2231 case $rule_number: {
2232 sym(1).ival = QSOperator::InplaceMul;
2236 AssignmentOperator: T_DIVIDE_EQ ;
2238 case $rule_number: {
2239 sym(1).ival = QSOperator::InplaceDiv;
2243 AssignmentOperator: T_REMAINDER_EQ ;
2245 case $rule_number: {
2246 sym(1).ival = QSOperator::InplaceMod;
2250 AssignmentOperator: T_PLUS_EQ ;
2252 case $rule_number: {
2253 sym(1).ival = QSOperator::InplaceAdd;
2257 AssignmentOperator: T_MINUS_EQ ;
2259 case $rule_number: {
2260 sym(1).ival = QSOperator::InplaceSub;
2264 AssignmentOperator: T_LT_LT_EQ ;
2266 case $rule_number: {
2267 sym(1).ival = QSOperator::InplaceLeftShift;
2271 AssignmentOperator: T_GT_GT_EQ ;
2273 case $rule_number: {
2274 sym(1).ival = QSOperator::InplaceRightShift;
2278 AssignmentOperator: T_GT_GT_GT_EQ ;
2280 case $rule_number: {
2281 sym(1).ival = QSOperator::InplaceURightShift;
2285 AssignmentOperator: T_AND_EQ ;
2287 case $rule_number: {
2288 sym(1).ival = QSOperator::InplaceAnd;
2292 AssignmentOperator: T_XOR_EQ ;
2294 case $rule_number: {
2295 sym(1).ival = QSOperator::InplaceXor;
2299 AssignmentOperator: T_OR_EQ ;
2301 case $rule_number: {
2302 sym(1).ival = QSOperator::InplaceOr;
2306 Expression: AssignmentExpression ;
2308 Expression: Expression T_COMMA AssignmentExpression ;
2310 case $rule_number: {
2311 AST::Expression *node = makeAstNode<AST::Expression> (driver->nodePool(), sym(1).Expression, sym(3).Expression);
2312 node->commaToken = loc(2);
2319 case $rule_number: {
2324 ExpressionOpt: Expression ;
2326 ExpressionNotIn: AssignmentExpressionNotIn ;
2328 ExpressionNotIn: ExpressionNotIn T_COMMA AssignmentExpressionNotIn ;
2330 case $rule_number: {
2331 AST::Expression *node = makeAstNode<AST::Expression> (driver->nodePool(), sym(1).Expression, sym(3).Expression);
2332 node->commaToken = loc(2);
2337 ExpressionNotInOpt: ;
2339 case $rule_number: {
2344 ExpressionNotInOpt: ExpressionNotIn ;
2347 Statement: VariableStatement ;
2348 Statement: EmptyStatement ;
2349 Statement: ExpressionStatement ;
2350 Statement: IfStatement ;
2351 Statement: IterationStatement ;
2352 Statement: ContinueStatement ;
2353 Statement: BreakStatement ;
2354 Statement: ReturnStatement ;
2355 Statement: WithStatement ;
2356 Statement: LabelledStatement ;
2357 Statement: SwitchStatement ;
2358 Statement: ThrowStatement ;
2359 Statement: TryStatement ;
2360 Statement: DebuggerStatement ;
2363 Block: T_LBRACE StatementListOpt T_RBRACE ;
2365 case $rule_number: {
2366 AST::Block *node = makeAstNode<AST::Block> (driver->nodePool(), sym(2).StatementList);
2367 node->lbraceToken = loc(1);
2368 node->rbraceToken = loc(3);
2373 StatementList: Statement ;
2375 case $rule_number: {
2376 sym(1).Node = makeAstNode<AST::StatementList> (driver->nodePool(), sym(1).Statement);
2380 StatementList: StatementList Statement ;
2382 case $rule_number: {
2383 sym(1).Node = makeAstNode<AST::StatementList> (driver->nodePool(), sym(1).StatementList, sym(2).Statement);
2389 case $rule_number: {
2394 StatementListOpt: StatementList ;
2396 case $rule_number: {
2397 sym(1).Node = sym(1).StatementList->finish ();
2401 VariableStatement: VariableDeclarationKind VariableDeclarationList T_AUTOMATIC_SEMICOLON ; -- automatic semicolon
2402 VariableStatement: VariableDeclarationKind VariableDeclarationList T_SEMICOLON ;
2404 case $rule_number: {
2405 AST::VariableStatement *node = makeAstNode<AST::VariableStatement> (driver->nodePool(),
2406 sym(2).VariableDeclarationList->finish (/*readOnly=*/sym(1).ival == T_CONST));
2407 node->declarationKindToken = loc(1);
2408 node->semicolonToken = loc(3);
2413 VariableDeclarationKind: T_CONST ;
2415 case $rule_number: {
2416 sym(1).ival = T_CONST;
2420 VariableDeclarationKind: T_VAR ;
2422 case $rule_number: {
2423 sym(1).ival = T_VAR;
2427 VariableDeclarationList: VariableDeclaration ;
2429 case $rule_number: {
2430 sym(1).Node = makeAstNode<AST::VariableDeclarationList> (driver->nodePool(), sym(1).VariableDeclaration);
2434 VariableDeclarationList: VariableDeclarationList T_COMMA VariableDeclaration ;
2436 case $rule_number: {
2437 AST::VariableDeclarationList *node = makeAstNode<AST::VariableDeclarationList> (driver->nodePool(),
2438 sym(1).VariableDeclarationList, sym(3).VariableDeclaration);
2439 node->commaToken = loc(2);
2444 VariableDeclarationListNotIn: VariableDeclarationNotIn ;
2446 case $rule_number: {
2447 sym(1).Node = makeAstNode<AST::VariableDeclarationList> (driver->nodePool(), sym(1).VariableDeclaration);
2451 VariableDeclarationListNotIn: VariableDeclarationListNotIn T_COMMA VariableDeclarationNotIn ;
2453 case $rule_number: {
2454 sym(1).Node = makeAstNode<AST::VariableDeclarationList> (driver->nodePool(), sym(1).VariableDeclarationList, sym(3).VariableDeclaration);
2458 VariableDeclaration: JsIdentifier InitialiserOpt ;
2460 case $rule_number: {
2461 AST::VariableDeclaration *node = makeAstNode<AST::VariableDeclaration> (driver->nodePool(), sym(1).sval, sym(2).Expression);
2462 node->identifierToken = loc(1);
2467 VariableDeclarationNotIn: JsIdentifier InitialiserNotInOpt ;
2469 case $rule_number: {
2470 AST::VariableDeclaration *node = makeAstNode<AST::VariableDeclaration> (driver->nodePool(), sym(1).sval, sym(2).Expression);
2471 node->identifierToken = loc(1);
2476 Initialiser: T_EQ AssignmentExpression ;
2478 case $rule_number: {
2479 // ### TODO: AST for initializer
2486 case $rule_number: {
2491 InitialiserOpt: Initialiser ;
2493 InitialiserNotIn: T_EQ AssignmentExpressionNotIn ;
2495 case $rule_number: {
2496 // ### TODO: AST for initializer
2501 InitialiserNotInOpt: ;
2503 case $rule_number: {
2508 InitialiserNotInOpt: InitialiserNotIn ;
2510 EmptyStatement: T_SEMICOLON ;
2512 case $rule_number: {
2513 AST::EmptyStatement *node = makeAstNode<AST::EmptyStatement> (driver->nodePool());
2514 node->semicolonToken = loc(1);
2519 ExpressionStatement: Expression T_AUTOMATIC_SEMICOLON ; -- automatic semicolon
2520 ExpressionStatement: Expression T_SEMICOLON ;
2522 case $rule_number: {
2523 AST::ExpressionStatement *node = makeAstNode<AST::ExpressionStatement> (driver->nodePool(), sym(1).Expression);
2524 node->semicolonToken = loc(2);
2529 IfStatement: T_IF T_LPAREN Expression T_RPAREN Statement T_ELSE Statement ;
2531 case $rule_number: {
2532 AST::IfStatement *node = makeAstNode<AST::IfStatement> (driver->nodePool(), sym(3).Expression, sym(5).Statement, sym(7).Statement);
2533 node->ifToken = loc(1);
2534 node->lparenToken = loc(2);
2535 node->rparenToken = loc(4);
2536 node->elseToken = loc(5);
2541 IfStatement: T_IF T_LPAREN Expression T_RPAREN Statement ;
2543 case $rule_number: {
2544 AST::IfStatement *node = makeAstNode<AST::IfStatement> (driver->nodePool(), sym(3).Expression, sym(5).Statement);
2545 node->ifToken = loc(1);
2546 node->lparenToken = loc(2);
2547 node->rparenToken = loc(4);
2553 IterationStatement: T_DO Statement T_WHILE T_LPAREN Expression T_RPAREN T_AUTOMATIC_SEMICOLON ; -- automatic semicolon
2554 IterationStatement: T_DO Statement T_WHILE T_LPAREN Expression T_RPAREN T_SEMICOLON ;
2556 case $rule_number: {
2557 AST::DoWhileStatement *node = makeAstNode<AST::DoWhileStatement> (driver->nodePool(), sym(2).Statement, sym(5).Expression);
2558 node->doToken = loc(1);
2559 node->whileToken = loc(3);
2560 node->lparenToken = loc(4);
2561 node->rparenToken = loc(6);
2562 node->semicolonToken = loc(7);
2567 IterationStatement: T_WHILE T_LPAREN Expression T_RPAREN Statement ;
2569 case $rule_number: {
2570 AST::WhileStatement *node = makeAstNode<AST::WhileStatement> (driver->nodePool(), sym(3).Expression, sym(5).Statement);
2571 node->whileToken = loc(1);
2572 node->lparenToken = loc(2);
2573 node->rparenToken = loc(4);
2578 IterationStatement: T_FOR T_LPAREN ExpressionNotInOpt T_SEMICOLON ExpressionOpt T_SEMICOLON ExpressionOpt T_RPAREN Statement ;
2580 case $rule_number: {
2581 AST::ForStatement *node = makeAstNode<AST::ForStatement> (driver->nodePool(), sym(3).Expression,
2582 sym(5).Expression, sym(7).Expression, sym(9).Statement);
2583 node->forToken = loc(1);
2584 node->lparenToken = loc(2);
2585 node->firstSemicolonToken = loc(4);
2586 node->secondSemicolonToken = loc(6);
2587 node->rparenToken = loc(8);
2592 IterationStatement: T_FOR T_LPAREN T_VAR VariableDeclarationListNotIn T_SEMICOLON ExpressionOpt T_SEMICOLON ExpressionOpt T_RPAREN Statement ;
2594 case $rule_number: {
2595 AST::LocalForStatement *node = makeAstNode<AST::LocalForStatement> (driver->nodePool(),
2596 sym(4).VariableDeclarationList->finish (/*readOnly=*/false), sym(6).Expression,
2597 sym(8).Expression, sym(10).Statement);
2598 node->forToken = loc(1);
2599 node->lparenToken = loc(2);
2600 node->varToken = loc(3);
2601 node->firstSemicolonToken = loc(5);
2602 node->secondSemicolonToken = loc(7);
2603 node->rparenToken = loc(9);
2608 IterationStatement: T_FOR T_LPAREN LeftHandSideExpression T_IN Expression T_RPAREN Statement ;
2610 case $rule_number: {
2611 AST:: ForEachStatement *node = makeAstNode<AST::ForEachStatement> (driver->nodePool(), sym(3).Expression,
2612 sym(5).Expression, sym(7).Statement);
2613 node->forToken = loc(1);
2614 node->lparenToken = loc(2);
2615 node->inToken = loc(4);
2616 node->rparenToken = loc(6);
2621 IterationStatement: T_FOR T_LPAREN T_VAR VariableDeclarationNotIn T_IN Expression T_RPAREN Statement ;
2623 case $rule_number: {
2624 AST::LocalForEachStatement *node = makeAstNode<AST::LocalForEachStatement> (driver->nodePool(),
2625 sym(4).VariableDeclaration, sym(6).Expression, sym(8).Statement);
2626 node->forToken = loc(1);
2627 node->lparenToken = loc(2);
2628 node->varToken = loc(3);
2629 node->inToken = loc(5);
2630 node->rparenToken = loc(7);
2635 ContinueStatement: T_CONTINUE T_AUTOMATIC_SEMICOLON ; -- automatic semicolon
2636 ContinueStatement: T_CONTINUE T_SEMICOLON ;
2638 case $rule_number: {
2639 AST::ContinueStatement *node = makeAstNode<AST::ContinueStatement> (driver->nodePool());
2640 node->continueToken = loc(1);
2641 node->semicolonToken = loc(2);
2646 ContinueStatement: T_CONTINUE JsIdentifier T_AUTOMATIC_SEMICOLON ; -- automatic semicolon
2647 ContinueStatement: T_CONTINUE JsIdentifier T_SEMICOLON ;
2649 case $rule_number: {
2650 AST::ContinueStatement *node = makeAstNode<AST::ContinueStatement> (driver->nodePool(), sym(2).sval);
2651 node->continueToken = loc(1);
2652 node->identifierToken = loc(2);
2653 node->semicolonToken = loc(3);
2658 BreakStatement: T_BREAK T_AUTOMATIC_SEMICOLON ; -- automatic semicolon
2659 BreakStatement: T_BREAK T_SEMICOLON ;
2661 case $rule_number: {
2662 AST::BreakStatement *node = makeAstNode<AST::BreakStatement> (driver->nodePool());
2663 node->breakToken = loc(1);
2664 node->semicolonToken = loc(2);
2669 BreakStatement: T_BREAK JsIdentifier T_AUTOMATIC_SEMICOLON ; -- automatic semicolon
2670 BreakStatement: T_BREAK JsIdentifier T_SEMICOLON ;
2672 case $rule_number: {
2673 AST::BreakStatement *node = makeAstNode<AST::BreakStatement> (driver->nodePool(), sym(2).sval);
2674 node->breakToken = loc(1);
2675 node->identifierToken = loc(2);
2676 node->semicolonToken = loc(3);
2681 ReturnStatement: T_RETURN ExpressionOpt T_AUTOMATIC_SEMICOLON ; -- automatic semicolon
2682 ReturnStatement: T_RETURN ExpressionOpt T_SEMICOLON ;
2684 case $rule_number: {
2685 AST::ReturnStatement *node = makeAstNode<AST::ReturnStatement> (driver->nodePool(), sym(2).Expression);
2686 node->returnToken = loc(1);
2687 node->semicolonToken = loc(3);
2692 WithStatement: T_WITH T_LPAREN Expression T_RPAREN Statement ;
2694 case $rule_number: {
2695 AST::WithStatement *node = makeAstNode<AST::WithStatement> (driver->nodePool(), sym(3).Expression, sym(5).Statement);
2696 node->withToken = loc(1);
2697 node->lparenToken = loc(2);
2698 node->rparenToken = loc(4);
2703 SwitchStatement: T_SWITCH T_LPAREN Expression T_RPAREN CaseBlock ;
2705 case $rule_number: {
2706 AST::SwitchStatement *node = makeAstNode<AST::SwitchStatement> (driver->nodePool(), sym(3).Expression, sym(5).CaseBlock);
2707 node->switchToken = loc(1);
2708 node->lparenToken = loc(2);
2709 node->rparenToken = loc(4);
2714 CaseBlock: T_LBRACE CaseClausesOpt T_RBRACE ;
2716 case $rule_number: {
2717 AST::CaseBlock *node = makeAstNode<AST::CaseBlock> (driver->nodePool(), sym(2).CaseClauses);
2718 node->lbraceToken = loc(1);
2719 node->rbraceToken = loc(3);
2724 CaseBlock: T_LBRACE CaseClausesOpt DefaultClause CaseClausesOpt T_RBRACE ;
2726 case $rule_number: {
2727 AST::CaseBlock *node = makeAstNode<AST::CaseBlock> (driver->nodePool(), sym(2).CaseClauses, sym(3).DefaultClause, sym(4).CaseClauses);
2728 node->lbraceToken = loc(1);
2729 node->rbraceToken = loc(5);
2734 CaseClauses: CaseClause ;
2736 case $rule_number: {
2737 sym(1).Node = makeAstNode<AST::CaseClauses> (driver->nodePool(), sym(1).CaseClause);
2741 CaseClauses: CaseClauses CaseClause ;
2743 case $rule_number: {
2744 sym(1).Node = makeAstNode<AST::CaseClauses> (driver->nodePool(), sym(1).CaseClauses, sym(2).CaseClause);
2750 case $rule_number: {
2755 CaseClausesOpt: CaseClauses ;
2757 case $rule_number: {
2758 sym(1).Node = sym(1).CaseClauses->finish ();
2762 CaseClause: T_CASE Expression T_COLON StatementListOpt ;
2764 case $rule_number: {
2765 AST::CaseClause *node = makeAstNode<AST::CaseClause> (driver->nodePool(), sym(2).Expression, sym(4).StatementList);
2766 node->caseToken = loc(1);
2767 node->colonToken = loc(3);
2772 DefaultClause: T_DEFAULT T_COLON StatementListOpt ;
2774 case $rule_number: {
2775 AST::DefaultClause *node = makeAstNode<AST::DefaultClause> (driver->nodePool(), sym(3).StatementList);
2776 node->defaultToken = loc(1);
2777 node->colonToken = loc(2);
2782 LabelledStatement: T_SIGNAL T_COLON Statement ;
2783 /.case $rule_number:./
2785 LabelledStatement: T_PROPERTY T_COLON Statement ;
2787 case $rule_number: {
2788 AST::LabelledStatement *node = makeAstNode<AST::LabelledStatement> (driver->nodePool(), driver->intern(lexer->characterBuffer(), lexer->characterCount()), sym(3).Statement);
2789 node->identifierToken = loc(1);
2790 node->colonToken = loc(2);
2795 LabelledStatement: T_IDENTIFIER T_COLON Statement ;
2797 case $rule_number: {
2798 AST::LabelledStatement *node = makeAstNode<AST::LabelledStatement> (driver->nodePool(), sym(1).sval, sym(3).Statement);
2799 node->identifierToken = loc(1);
2800 node->colonToken = loc(2);
2805 ThrowStatement: T_THROW Expression T_AUTOMATIC_SEMICOLON ; -- automatic semicolon
2806 ThrowStatement: T_THROW Expression T_SEMICOLON ;
2808 case $rule_number: {
2809 AST::ThrowStatement *node = makeAstNode<AST::ThrowStatement> (driver->nodePool(), sym(2).Expression);
2810 node->throwToken = loc(1);
2811 node->semicolonToken = loc(3);
2816 TryStatement: T_TRY Block Catch ;
2818 case $rule_number: {
2819 AST::TryStatement *node = makeAstNode<AST::TryStatement> (driver->nodePool(), sym(2).Statement, sym(3).Catch);
2820 node->tryToken = loc(1);
2825 TryStatement: T_TRY Block Finally ;
2827 case $rule_number: {
2828 AST::TryStatement *node = makeAstNode<AST::TryStatement> (driver->nodePool(), sym(2).Statement, sym(3).Finally);
2829 node->tryToken = loc(1);
2834 TryStatement: T_TRY Block Catch Finally ;
2836 case $rule_number: {
2837 AST::TryStatement *node = makeAstNode<AST::TryStatement> (driver->nodePool(), sym(2).Statement, sym(3).Catch, sym(4).Finally);
2838 node->tryToken = loc(1);
2843 Catch: T_CATCH T_LPAREN JsIdentifier T_RPAREN Block ;
2845 case $rule_number: {
2846 AST::Catch *node = makeAstNode<AST::Catch> (driver->nodePool(), sym(3).sval, sym(5).Block);
2847 node->catchToken = loc(1);
2848 node->lparenToken = loc(2);
2849 node->identifierToken = loc(3);
2850 node->rparenToken = loc(4);
2855 Finally: T_FINALLY Block ;
2857 case $rule_number: {
2858 AST::Finally *node = makeAstNode<AST::Finally> (driver->nodePool(), sym(2).Block);
2859 node->finallyToken = loc(1);
2864 DebuggerStatement: T_DEBUGGER T_AUTOMATIC_SEMICOLON ; -- automatic semicolon
2865 DebuggerStatement: T_DEBUGGER T_SEMICOLON ;
2867 case $rule_number: {
2868 AST::DebuggerStatement *node = makeAstNode<AST::DebuggerStatement> (driver->nodePool());
2869 node->debuggerToken = loc(1);
2870 node->semicolonToken = loc(2);
2875 FunctionDeclaration: T_FUNCTION JsIdentifier T_LPAREN FormalParameterListOpt T_RPAREN T_LBRACE FunctionBodyOpt T_RBRACE ;
2877 case $rule_number: {
2878 AST::FunctionDeclaration *node = makeAstNode<AST::FunctionDeclaration> (driver->nodePool(), sym(2).sval, sym(4).FormalParameterList, sym(7).FunctionBody);
2879 node->functionToken = loc(1);
2880 node->identifierToken = loc(2);
2881 node->lparenToken = loc(3);
2882 node->rparenToken = loc(5);
2883 node->lbraceToken = loc(6);
2884 node->rbraceToken = loc(8);
2889 FunctionExpression: T_FUNCTION IdentifierOpt T_LPAREN FormalParameterListOpt T_RPAREN T_LBRACE FunctionBodyOpt T_RBRACE ;
2891 case $rule_number: {
2892 AST::FunctionExpression *node = makeAstNode<AST::FunctionExpression> (driver->nodePool(), sym(2).sval, sym(4).FormalParameterList, sym(7).FunctionBody);
2893 node->functionToken = loc(1);
2895 node->identifierToken = loc(2);
2896 node->lparenToken = loc(3);
2897 node->rparenToken = loc(5);
2898 node->lbraceToken = loc(6);
2899 node->rbraceToken = loc(8);
2904 FormalParameterList: JsIdentifier ;
2906 case $rule_number: {
2907 AST::FormalParameterList *node = makeAstNode<AST::FormalParameterList> (driver->nodePool(), sym(1).sval);
2908 node->identifierToken = loc(1);
2913 FormalParameterList: FormalParameterList T_COMMA JsIdentifier ;
2915 case $rule_number: {
2916 AST::FormalParameterList *node = makeAstNode<AST::FormalParameterList> (driver->nodePool(), sym(1).FormalParameterList, sym(3).sval);
2917 node->commaToken = loc(2);
2918 node->identifierToken = loc(3);
2923 FormalParameterListOpt: ;
2925 case $rule_number: {
2930 FormalParameterListOpt: FormalParameterList ;
2932 case $rule_number: {
2933 sym(1).Node = sym(1).FormalParameterList->finish ();
2939 case $rule_number: {
2944 FunctionBodyOpt: FunctionBody ;
2946 FunctionBody: SourceElements ;
2948 case $rule_number: {
2949 sym(1).Node = makeAstNode<AST::FunctionBody> (driver->nodePool(), sym(1).SourceElements->finish ());
2953 Program: SourceElements ;
2955 case $rule_number: {
2956 sym(1).Node = makeAstNode<AST::Program> (driver->nodePool(), sym(1).SourceElements->finish ());
2960 SourceElements: SourceElement ;
2962 case $rule_number: {
2963 sym(1).Node = makeAstNode<AST::SourceElements> (driver->nodePool(), sym(1).SourceElement);
2967 SourceElements: SourceElements SourceElement ;
2969 case $rule_number: {
2970 sym(1).Node = makeAstNode<AST::SourceElements> (driver->nodePool(), sym(1).SourceElements, sym(2).SourceElement);
2974 SourceElement: Statement ;
2976 case $rule_number: {
2977 sym(1).Node = makeAstNode<AST::StatementSourceElement> (driver->nodePool(), sym(1).Statement);
2981 SourceElement: FunctionDeclaration ;
2983 case $rule_number: {
2984 sym(1).Node = makeAstNode<AST::FunctionSourceElement> (driver->nodePool(), sym(1).FunctionDeclaration);
2990 case $rule_number: {
2995 IdentifierOpt: JsIdentifier ;
2997 PropertyNameAndValueListOpt: ;
2999 case $rule_number: {
3004 PropertyNameAndValueListOpt: PropertyNameAndValueList ;
3008 action = nt_action(state_stack[tos], lhs[r] - TERMINAL_COUNT);
3010 } while (action != 0);
3012 if (first_token == last_token) {
3013 const int errorState = state_stack[tos];
3015 // automatic insertion of `;'
3016 if (yytoken != -1 && t_action(errorState, T_AUTOMATIC_SEMICOLON) && automatic(driver, yytoken)) {
3017 SavedToken &tk = token_buffer[0];
3022 yylloc = yyprevlloc;
3023 yylloc.offset += yylloc.length;
3024 yylloc.startColumn += yylloc.length;
3027 //const QString msg = qApp->translate("QmlParser", "Missing `;'");
3028 //diagnostic_messages.append(DiagnosticMessage(DiagnosticMessage::Warning, yylloc, msg));
3030 first_token = &token_buffer[0];
3031 last_token = &token_buffer[1];
3033 yytoken = T_SEMICOLON;
3036 action = errorState;
3043 token_buffer[0].token = yytoken;
3044 token_buffer[0].dval = yylval;
3045 token_buffer[0].loc = yylloc;
3047 token_buffer[1].token = yytoken = lexer->lex();
3048 token_buffer[1].dval = yylval = lexer->dval();
3049 token_buffer[1].loc = yylloc = location(lexer);
3051 if (t_action(errorState, yytoken)) {
3053 int token = token_buffer[0].token;
3054 if (token < 0 || token >= TERMINAL_COUNT)
3055 msg = qApp->translate("QmlParser", "Syntax error");
3057 msg = qApp->translate("QmlParser", "Unexpected token `%1'").arg(QLatin1String(spell[token]));
3058 diagnostic_messages.append(DiagnosticMessage(DiagnosticMessage::Error, token_buffer[0].loc, msg));
3060 action = errorState;
3064 static int tokens[] = {
3072 T_RPAREN, T_RBRACKET, T_RBRACE,
3077 T_LPAREN, T_LBRACKET, T_LBRACE,
3082 for (int *tk = tokens; *tk != EOF_SYMBOL; ++tk) {
3083 int a = t_action(errorState, *tk);
3084 if (a > 0 && t_action(a, yytoken)) {
3085 const QString msg = qApp->translate("QmlParser", "Expected token `%1'").arg(QLatin1String(spell[*tk]));
3086 diagnostic_messages.append(DiagnosticMessage(DiagnosticMessage::Error, token_buffer[0].loc, msg));
3090 yylloc = token_buffer[0].loc;
3093 first_token = &token_buffer[0];
3094 last_token = &token_buffer[2];
3096 action = errorState;
3101 for (int tk = 1; tk < TERMINAL_COUNT; ++tk) {
3102 if (tk == T_AUTOMATIC_SEMICOLON || tk == T_FEED_UI_PROGRAM ||
3103 tk == T_FEED_JS_STATEMENT || tk == T_FEED_JS_EXPRESSION ||
3104 tk == T_FEED_JS_SOURCE_ELEMENT)
3107 int a = t_action(errorState, tk);
3108 if (a > 0 && t_action(a, yytoken)) {
3109 const QString msg = qApp->translate("QmlParser", "Expected token `%1'").arg(QLatin1String(spell[tk]));
3110 diagnostic_messages.append(DiagnosticMessage(DiagnosticMessage::Error, token_buffer[0].loc, msg));
3114 yylloc = token_buffer[0].loc;
3117 action = errorState;
3122 const QString msg = qApp->translate("QmlParser", "Syntax error");
3123 diagnostic_messages.append(DiagnosticMessage(DiagnosticMessage::Error, token_buffer[0].loc, msg));
3129 QT_QML_END_NAMESPACE
3134 QT_QML_END_NAMESPACE
3138 #endif // QMLJSPARSER_P_H