source: trunk/src/script/qscriptast_p.h@ 447

Last change on this file since 447 was 2, checked in by Dmitry A. Kuminov, 16 years ago

Initially imported qt-all-opensource-src-4.5.1 from Trolltech.

File size: 32.6 KB
Line 
1/****************************************************************************
2**
3** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
4** Contact: Qt Software Information ([email protected])
5**
6** This file is part of the QtScript module of the Qt Toolkit.
7**
8** $QT_BEGIN_LICENSE:LGPL$
9** Commercial Usage
10** Licensees holding valid Qt Commercial licenses may use this file in
11** accordance with the Qt Commercial License Agreement provided with the
12** Software or, alternatively, in accordance with the terms contained in
13** a written agreement between you and Nokia.
14**
15** GNU Lesser General Public License Usage
16** Alternatively, this file may be used under the terms of the GNU Lesser
17** General Public License version 2.1 as published by the Free Software
18** Foundation and appearing in the file LICENSE.LGPL included in the
19** packaging of this file. Please review the following information to
20** ensure the GNU Lesser General Public License version 2.1 requirements
21** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
22**
23** In addition, as a special exception, Nokia gives you certain
24** additional rights. These rights are described in the Nokia Qt LGPL
25** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
26** package.
27**
28** GNU General Public License Usage
29** Alternatively, this file may be used under the terms of the GNU
30** General Public License version 3.0 as published by the Free Software
31** Foundation and appearing in the file LICENSE.GPL included in the
32** packaging of this file. Please review the following information to
33** ensure the GNU General Public License version 3.0 requirements will be
34** met: http://www.gnu.org/copyleft/gpl.html.
35**
36** If you are unsure which license is appropriate for your use, please
37** contact the sales department at [email protected].
38** $QT_END_LICENSE$
39**
40****************************************************************************/
41
42#ifndef QSCRIPTAST_P_H
43#define QSCRIPTAST_P_H
44
45//
46// W A R N I N G
47// -------------
48//
49// This file is not part of the Qt API. It exists purely as an
50// implementation detail. This header file may change from version to
51// version without notice, or even be removed.
52//
53// We mean it.
54//
55
56#include <QtCore/QString>
57
58#ifndef QT_NO_SCRIPT
59
60#include "qscriptastvisitor_p.h"
61
62QT_BEGIN_NAMESPACE
63
64class QScriptNameIdImpl;
65
66namespace QSOperator // ### rename
67{
68
69enum Op {
70 Add,
71 And,
72 InplaceAnd,
73 Assign,
74 BitAnd,
75 BitOr,
76 BitXor,
77 InplaceSub,
78 Div,
79 InplaceDiv,
80 Equal,
81 Ge,
82 Gt,
83 In,
84 InplaceAdd,
85 InstanceOf,
86 Le,
87 LShift,
88 InplaceLeftShift,
89 Lt,
90 Mod,
91 InplaceMod,
92 Mul,
93 InplaceMul,
94 NotEqual,
95 Or,
96 InplaceOr,
97 RShift,
98 InplaceRightShift,
99 StrictEqual,
100 StrictNotEqual,
101 Sub,
102 URShift,
103 InplaceURightShift,
104 InplaceXor
105};
106
107} // namespace QSOperator
108
109namespace QScript { namespace AST {
110
111class Node
112{
113public:
114 enum Kind {
115 Kind_Node,
116 Kind_ExpressionNode,
117 Kind_Statement,
118 Kind_ThisExpression,
119 Kind_IdentifierExpression,
120 Kind_NullExpression,
121 Kind_TrueLiteral,
122 Kind_FalseLiteral,
123 Kind_NumericLiteral,
124 Kind_StringLiteral,
125 Kind_RegExpLiteral,
126 Kind_ArrayLiteral,
127 Kind_ObjectLiteral,
128 Kind_ElementList,
129 Kind_Elision,
130 Kind_PropertyNameAndValueList,
131 Kind_PropertyName,
132 Kind_IdentifierPropertyName,
133 Kind_StringLiteralPropertyName,
134 Kind_NumericLiteralPropertyName,
135 Kind_ArrayMemberExpression,
136 Kind_FieldMemberExpression,
137 Kind_NewMemberExpression,
138 Kind_NewExpression,
139 Kind_CallExpression,
140 Kind_ArgumentList,
141 Kind_PostIncrementExpression,
142 Kind_PostDecrementExpression,
143 Kind_DeleteExpression,
144 Kind_VoidExpression,
145 Kind_TypeOfExpression,
146 Kind_PreIncrementExpression,
147 Kind_PreDecrementExpression,
148 Kind_UnaryPlusExpression,
149 Kind_UnaryMinusExpression,
150 Kind_TildeExpression,
151 Kind_NotExpression,
152 Kind_BinaryExpression,
153 Kind_ConditionalExpression,
154 Kind_Expression,
155 Kind_Block,
156 Kind_StatementList,
157 Kind_VariableStatement,
158 Kind_VariableDeclarationList,
159 Kind_VariableDeclaration,
160 Kind_EmptyStatement,
161 Kind_ExpressionStatement,
162 Kind_IfStatement,
163 Kind_DoWhileStatement,
164 Kind_WhileStatement,
165 Kind_ForStatement,
166 Kind_LocalForStatement,
167 Kind_ForEachStatement,
168 Kind_LocalForEachStatement,
169 Kind_ContinueStatement,
170 Kind_BreakStatement,
171 Kind_ReturnStatement,
172 Kind_WithStatement,
173 Kind_SwitchStatement,
174 Kind_CaseBlock,
175 Kind_CaseClauses,
176 Kind_CaseClause,
177 Kind_DefaultClause,
178 Kind_LabelledStatement,
179 Kind_ThrowStatement,
180 Kind_TryStatement,
181 Kind_Catch,
182 Kind_Finally,
183 Kind_FunctionDeclaration,
184 Kind_FunctionExpression,
185 Kind_FormalParameterList,
186 Kind_FunctionBody,
187 Kind_Program,
188 Kind_SourceElements,
189 Kind_SourceElement,
190 Kind_FunctionSourceElement,
191 Kind_StatementSourceElement,
192 Kind_DebuggerStatement
193 };
194
195 inline Node():
196 startLine(0), startColumn(0),
197 endLine(0), endColumn(0), kind(Kind_Node) {}
198
199 virtual ~Node() {}
200
201 virtual ExpressionNode *expressionCast();
202 virtual BinaryExpression *binaryExpressionCast();
203 virtual Statement *statementCast();
204
205 inline void accept(Visitor *visitor)
206 {
207 if (visitor->preVisit(this)) {
208 accept0(visitor);
209 visitor->postVisit(this);
210 }
211 }
212
213 static void acceptChild(Node *node, Visitor *visitor)
214 {
215 if (node)
216 node->accept(visitor);
217 }
218
219 virtual void accept0(Visitor *visitor) = 0;
220
221 int startLine;
222 int startColumn;
223 int endLine;
224 int endColumn;
225 Kind kind;
226};
227
228class ExpressionNode: public Node
229{
230public:
231 ExpressionNode() { kind = Kind_ExpressionNode; }
232 virtual ~ExpressionNode() {}
233
234 virtual ExpressionNode *expressionCast();
235};
236
237class Statement: public Node
238{
239public:
240 Statement() { kind = Kind_Statement; }
241 virtual ~Statement() {}
242
243 virtual Statement *statementCast();
244};
245
246class ThisExpression: public ExpressionNode
247{
248public:
249 ThisExpression() { kind = Kind_ThisExpression; }
250 virtual ~ThisExpression() {}
251
252 virtual void accept0(Visitor *visitor);
253};
254
255class IdentifierExpression: public ExpressionNode
256{
257public:
258 IdentifierExpression(QScriptNameIdImpl *n):
259 name (n) { kind = Kind_IdentifierExpression; }
260
261 virtual ~IdentifierExpression() {}
262
263 virtual void accept0(Visitor *visitor);
264
265// attributes
266 QScriptNameIdImpl *name;
267};
268
269class NullExpression: public ExpressionNode
270{
271public:
272 NullExpression() { kind = Kind_NullExpression; }
273 virtual ~NullExpression() {}
274
275 virtual void accept0(Visitor *visitor);
276};
277
278class TrueLiteral: public ExpressionNode
279{
280public:
281 TrueLiteral() { kind = Kind_TrueLiteral; }
282 virtual ~TrueLiteral() {}
283
284 virtual void accept0(Visitor *visitor);
285};
286
287class FalseLiteral: public ExpressionNode
288{
289public:
290 FalseLiteral() { kind = Kind_FalseLiteral; }
291 virtual ~FalseLiteral() {}
292
293 virtual void accept0(Visitor *visitor);
294};
295
296class NumericLiteral: public ExpressionNode
297{
298public:
299 NumericLiteral(double v):
300 value (v) { kind = Kind_NumericLiteral; }
301 virtual ~NumericLiteral() {}
302
303 virtual void accept0(Visitor *visitor);
304
305// attributes:
306 double value;
307};
308
309class StringLiteral: public ExpressionNode
310{
311public:
312 StringLiteral(QScriptNameIdImpl *v):
313 value (v) { kind = Kind_StringLiteral; }
314
315 virtual ~StringLiteral() {}
316
317 virtual void accept0(Visitor *visitor);
318
319// attributes:
320 QScriptNameIdImpl *value;
321};
322
323class RegExpLiteral: public ExpressionNode
324{
325public:
326 RegExpLiteral(QScriptNameIdImpl *p, int f):
327 pattern (p), flags (f) { kind = Kind_RegExpLiteral; }
328
329 virtual ~RegExpLiteral() {}
330
331 virtual void accept0(Visitor *visitor);
332
333// attributes:
334 QScriptNameIdImpl *pattern;
335 int flags;
336};
337
338class ArrayLiteral: public ExpressionNode
339{
340public:
341 ArrayLiteral(Elision *e):
342 elements (0), elision (e)
343 { kind = Kind_ArrayLiteral; }
344
345 ArrayLiteral(ElementList *elts):
346 elements (elts), elision (0)
347 { kind = Kind_ArrayLiteral; }
348
349 ArrayLiteral(ElementList *elts, Elision *e):
350 elements (elts), elision (e)
351 { kind = Kind_ArrayLiteral; }
352
353 virtual ~ArrayLiteral() {}
354
355 virtual void accept0(Visitor *visitor);
356
357// attributes
358 ElementList *elements;
359 Elision *elision;
360};
361
362class ObjectLiteral: public ExpressionNode
363{
364public:
365 ObjectLiteral():
366 properties (0) { kind = Kind_ObjectLiteral; }
367
368 ObjectLiteral(PropertyNameAndValueList *plist):
369 properties (plist) { kind = Kind_ObjectLiteral; }
370
371 virtual ~ObjectLiteral() {}
372
373 virtual void accept0(Visitor *visitor);
374
375// attributes
376 PropertyNameAndValueList *properties;
377};
378
379class ElementList: public Node
380{
381public:
382 ElementList(Elision *e, ExpressionNode *expr):
383 elision (e), expression (expr), next (this)
384 { kind = Kind_ElementList; }
385
386 ElementList(ElementList *previous, Elision *e, ExpressionNode *expr):
387 elision (e), expression (expr)
388 {
389 kind = Kind_ElementList;
390 next = previous->next;
391 previous->next = this;
392 }
393
394 virtual ~ElementList() {}
395
396 inline ElementList *finish ()
397 {
398 ElementList *front = next;
399 next = 0;
400 return front;
401 }
402
403 virtual void accept0(Visitor *visitor);
404
405// attributes
406 Elision *elision;
407 ExpressionNode *expression;
408 ElementList *next;
409};
410
411class Elision: public Node
412{
413public:
414 Elision():
415 next (this) { kind = Kind_Elision; }
416
417 Elision(Elision *previous)
418 {
419 kind = Kind_Elision;
420 next = previous->next;
421 previous->next = this;
422 }
423
424 virtual ~Elision() {}
425
426 virtual void accept0(Visitor *visitor);
427
428 inline Elision *finish ()
429 {
430 Elision *front = next;
431 next = 0;
432 return front;
433 }
434
435// attributes
436 Elision *next;
437};
438
439class PropertyNameAndValueList: public Node
440{
441public:
442 PropertyNameAndValueList(PropertyName *n, ExpressionNode *v):
443 name (n), value (v), next (this)
444 { kind = Kind_PropertyNameAndValueList; }
445
446 PropertyNameAndValueList(PropertyNameAndValueList *previous, PropertyName *n, ExpressionNode *v):
447 name (n), value (v)
448 {
449 kind = Kind_PropertyNameAndValueList;
450 next = previous->next;
451 previous->next = this;
452 }
453
454 virtual ~PropertyNameAndValueList() {}
455
456 virtual void accept0(Visitor *visitor);
457
458 inline PropertyNameAndValueList *finish ()
459 {
460 PropertyNameAndValueList *front = next;
461 next = 0;
462 return front;
463 }
464
465// attributes
466 PropertyName *name;
467 ExpressionNode *value;
468 PropertyNameAndValueList *next;
469};
470
471class PropertyName: public Node
472{
473public:
474 PropertyName() { kind = Kind_PropertyName; }
475 virtual ~PropertyName() {}
476};
477
478class IdentifierPropertyName: public PropertyName
479{
480public:
481 IdentifierPropertyName(QScriptNameIdImpl *n):
482 id (n) { kind = Kind_IdentifierPropertyName; }
483
484 virtual ~IdentifierPropertyName() {}
485
486 virtual void accept0(Visitor *visitor);
487
488// attributes
489 QScriptNameIdImpl *id;
490};
491
492class StringLiteralPropertyName: public PropertyName
493{
494public:
495 StringLiteralPropertyName(QScriptNameIdImpl *n):
496 id (n) { kind = Kind_StringLiteralPropertyName; }
497 virtual ~StringLiteralPropertyName() {}
498
499 virtual void accept0(Visitor *visitor);
500
501// attributes
502 QScriptNameIdImpl *id;
503};
504
505class NumericLiteralPropertyName: public PropertyName
506{
507public:
508 NumericLiteralPropertyName(double n):
509 id (n) { kind = Kind_NumericLiteralPropertyName; }
510 virtual ~NumericLiteralPropertyName() {}
511
512 virtual void accept0(Visitor *visitor);
513
514// attributes
515 double id;
516};
517
518class ArrayMemberExpression: public ExpressionNode
519{
520public:
521 ArrayMemberExpression(ExpressionNode *b, ExpressionNode *e):
522 base (b), expression (e)
523 { kind = Kind_ArrayMemberExpression; }
524
525 virtual ~ArrayMemberExpression() {}
526
527 virtual void accept0(Visitor *visitor);
528
529// attributes
530 ExpressionNode *base;
531 ExpressionNode *expression;
532};
533
534class FieldMemberExpression: public ExpressionNode
535{
536public:
537 FieldMemberExpression(ExpressionNode *b, QScriptNameIdImpl *n):
538 base (b), name (n)
539 { kind = Kind_FieldMemberExpression; }
540
541 virtual ~FieldMemberExpression() {}
542
543 virtual void accept0(Visitor *visitor);
544
545// attributes
546 ExpressionNode *base;
547 QScriptNameIdImpl *name;
548};
549
550class NewMemberExpression: public ExpressionNode
551{
552public:
553 NewMemberExpression(ExpressionNode *b, ArgumentList *a):
554 base (b), arguments (a)
555 { kind = Kind_NewMemberExpression; }
556
557 virtual ~NewMemberExpression() {}
558
559 virtual void accept0(Visitor *visitor);
560
561// attributes
562 ExpressionNode *base;
563 ArgumentList *arguments;
564};
565
566class NewExpression: public ExpressionNode
567{
568public:
569 NewExpression(ExpressionNode *e):
570 expression (e) { kind = Kind_NewExpression; }
571
572 virtual ~NewExpression() {}
573
574 virtual void accept0(Visitor *visitor);
575
576// attributes
577 ExpressionNode *expression;
578};
579
580class CallExpression: public ExpressionNode
581{
582public:
583 CallExpression(ExpressionNode *b, ArgumentList *a):
584 base (b), arguments (a)
585 { kind = Kind_CallExpression; }
586
587 virtual ~CallExpression() {}
588
589 virtual void accept0(Visitor *visitor);
590
591// attributes
592 ExpressionNode *base;
593 ArgumentList *arguments;
594};
595
596class ArgumentList: public Node
597{
598public:
599 ArgumentList(ExpressionNode *e):
600 expression (e), next (this)
601 { kind = Kind_ArgumentList; }
602
603 ArgumentList(ArgumentList *previous, ExpressionNode *e):
604 expression (e)
605 {
606 kind = Kind_ArgumentList;
607 next = previous->next;
608 previous->next = this;
609 }
610
611 virtual ~ArgumentList() {}
612
613 virtual void accept0(Visitor *visitor);
614
615 inline ArgumentList *finish ()
616 {
617 ArgumentList *front = next;
618 next = 0;
619 return front;
620 }
621
622// attributes
623 ExpressionNode *expression;
624 ArgumentList *next;
625};
626
627class PostIncrementExpression: public ExpressionNode
628{
629public:
630 PostIncrementExpression(ExpressionNode *b):
631 base (b) { kind = Kind_PostIncrementExpression; }
632
633 virtual ~PostIncrementExpression() {}
634
635 virtual void accept0(Visitor *visitor);
636
637// attributes
638 ExpressionNode *base;
639};
640
641class PostDecrementExpression: public ExpressionNode
642{
643public:
644 PostDecrementExpression(ExpressionNode *b):
645 base (b) { kind = Kind_PostDecrementExpression; }
646
647 virtual ~PostDecrementExpression() {}
648
649 virtual void accept0(Visitor *visitor);
650
651// attributes
652 ExpressionNode *base;
653};
654
655class DeleteExpression: public ExpressionNode
656{
657public:
658 DeleteExpression(ExpressionNode *e):
659 expression (e) { kind = Kind_DeleteExpression; }
660 virtual ~DeleteExpression() {}
661
662 virtual void accept0(Visitor *visitor);
663
664// attributes
665 ExpressionNode *expression;
666};
667
668class VoidExpression: public ExpressionNode
669{
670public:
671 VoidExpression(ExpressionNode *e):
672 expression (e) { kind = Kind_VoidExpression; }
673
674 virtual ~VoidExpression() {}
675
676 virtual void accept0(Visitor *visitor);
677
678// attributes
679 ExpressionNode *expression;
680};
681
682class TypeOfExpression: public ExpressionNode
683{
684public:
685 TypeOfExpression(ExpressionNode *e):
686 expression (e) { kind = Kind_TypeOfExpression; }
687
688 virtual ~TypeOfExpression() {}
689
690 virtual void accept0(Visitor *visitor);
691
692// attributes
693 ExpressionNode *expression;
694};
695
696class PreIncrementExpression: public ExpressionNode
697{
698public:
699 PreIncrementExpression(ExpressionNode *e):
700 expression (e) { kind = Kind_PreIncrementExpression; }
701
702 virtual ~PreIncrementExpression() {}
703
704 virtual void accept0(Visitor *visitor);
705
706// attributes
707 ExpressionNode *expression;
708};
709
710class PreDecrementExpression: public ExpressionNode
711{
712public:
713 PreDecrementExpression(ExpressionNode *e):
714 expression (e) { kind = Kind_PreDecrementExpression; }
715
716 virtual ~PreDecrementExpression() {}
717
718 virtual void accept0(Visitor *visitor);
719
720// attributes
721 ExpressionNode *expression;
722};
723
724class UnaryPlusExpression: public ExpressionNode
725{
726public:
727 UnaryPlusExpression(ExpressionNode *e):
728 expression (e) { kind = Kind_UnaryPlusExpression; }
729
730 virtual ~UnaryPlusExpression() {}
731
732 virtual void accept0(Visitor *visitor);
733
734// attributes
735 ExpressionNode *expression;
736};
737
738class UnaryMinusExpression: public ExpressionNode
739{
740public:
741 UnaryMinusExpression(ExpressionNode *e):
742 expression (e) { kind = Kind_UnaryMinusExpression; }
743
744 virtual ~UnaryMinusExpression() {}
745
746 virtual void accept0(Visitor *visitor);
747
748// attributes
749 ExpressionNode *expression;
750};
751
752class TildeExpression: public ExpressionNode
753{
754public:
755 TildeExpression(ExpressionNode *e):
756 expression (e) { kind = Kind_TildeExpression; }
757
758 virtual ~TildeExpression() {}
759
760 virtual void accept0(Visitor *visitor);
761
762// attributes
763 ExpressionNode *expression;
764};
765
766class NotExpression: public ExpressionNode
767{
768public:
769 NotExpression(ExpressionNode *e):
770 expression (e) { kind = Kind_NotExpression; }
771
772 virtual ~NotExpression() {}
773
774 virtual void accept0(Visitor *visitor);
775
776// attributes
777 ExpressionNode *expression;
778};
779
780class BinaryExpression: public ExpressionNode
781{
782public:
783 BinaryExpression(ExpressionNode *l, int o, ExpressionNode *r):
784 left (l), op (o), right (r)
785 { kind = Kind_BinaryExpression; }
786
787 virtual ~BinaryExpression() {}
788
789 virtual BinaryExpression *binaryExpressionCast();
790
791 virtual void accept0(Visitor *visitor);
792
793// attributes
794 ExpressionNode *left;
795 int op;
796 ExpressionNode *right;
797};
798
799class ConditionalExpression: public ExpressionNode
800{
801public:
802 ConditionalExpression(ExpressionNode *e, ExpressionNode *t, ExpressionNode *f):
803 expression (e), ok (t), ko (f)
804 { kind = Kind_ConditionalExpression; }
805
806 virtual ~ConditionalExpression() {}
807
808 virtual void accept0(Visitor *visitor);
809
810// attributes
811 ExpressionNode *expression;
812 ExpressionNode *ok;
813 ExpressionNode *ko;
814};
815
816class Expression: public ExpressionNode // ### rename
817{
818public:
819 Expression(ExpressionNode *l, ExpressionNode *r):
820 left (l), right (r) { kind = Kind_Expression; }
821
822 virtual ~Expression() {}
823
824 virtual void accept0(Visitor *visitor);
825
826// attributes
827 ExpressionNode *left;
828 ExpressionNode *right;
829};
830
831class Block: public Statement
832{
833public:
834 Block(StatementList *slist):
835 statements (slist) { kind = Kind_Block; }
836
837 virtual ~Block() {}
838
839 virtual void accept0(Visitor *visitor);
840
841// attributes
842 StatementList *statements;
843};
844
845class StatementList: public Node
846{
847public:
848 StatementList(Statement *stmt):
849 statement (stmt), next (this)
850 { kind = Kind_StatementList; }
851
852 StatementList(StatementList *previous, Statement *stmt):
853 statement (stmt)
854 {
855 kind = Kind_StatementList;
856 next = previous->next;
857 previous->next = this;
858 }
859
860 virtual ~StatementList() {}
861
862 virtual void accept0(Visitor *visitor);
863
864 inline StatementList *finish ()
865 {
866 StatementList *front = next;
867 next = 0;
868 return front;
869 }
870
871// attributes
872 Statement *statement;
873 StatementList *next;
874};
875
876class VariableStatement: public Statement
877{
878public:
879 VariableStatement(VariableDeclarationList *vlist):
880 declarations (vlist)
881 { kind = Kind_VariableStatement; }
882
883 virtual ~VariableStatement() {}
884
885 virtual void accept0(Visitor *visitor);
886
887// attributes
888 VariableDeclarationList *declarations;
889};
890
891class VariableDeclaration: public Node
892{
893public:
894 VariableDeclaration(QScriptNameIdImpl *n, ExpressionNode *e):
895 name (n), expression (e), readOnly(false)
896 { kind = Kind_VariableDeclaration; }
897
898 virtual ~VariableDeclaration() {}
899
900 virtual void accept0(Visitor *visitor);
901
902// attributes
903 QScriptNameIdImpl *name;
904 ExpressionNode *expression;
905 bool readOnly;
906};
907
908class VariableDeclarationList: public Node
909{
910public:
911 VariableDeclarationList(VariableDeclaration *decl):
912 declaration (decl), next (this)
913 { kind = Kind_VariableDeclarationList; }
914
915 VariableDeclarationList(VariableDeclarationList *previous, VariableDeclaration *decl):
916 declaration (decl)
917 {
918 kind = Kind_VariableDeclarationList;
919 next = previous->next;
920 previous->next = this;
921 }
922
923 virtual ~VariableDeclarationList() {}
924
925 virtual void accept0(Visitor *visitor);
926
927 inline VariableDeclarationList *finish (bool readOnly)
928 {
929 VariableDeclarationList *front = next;
930 next = 0;
931 if (readOnly) {
932 VariableDeclarationList *vdl;
933 for (vdl = front; vdl != 0; vdl = vdl->next)
934 vdl->declaration->readOnly = true;
935 }
936 return front;
937 }
938
939// attributes
940 VariableDeclaration *declaration;
941 VariableDeclarationList *next;
942};
943
944class EmptyStatement: public Statement
945{
946public:
947 EmptyStatement() { kind = Kind_EmptyStatement; }
948 virtual ~EmptyStatement() {}
949
950 virtual void accept0(Visitor *visitor);
951};
952
953class ExpressionStatement: public Statement
954{
955public:
956 ExpressionStatement(ExpressionNode *e):
957 expression (e) { kind = Kind_ExpressionStatement; }
958
959 virtual ~ExpressionStatement() {}
960
961 virtual void accept0(Visitor *visitor);
962
963// attributes
964 ExpressionNode *expression;
965};
966
967class IfStatement: public Statement
968{
969public:
970 IfStatement(ExpressionNode *e, Statement *t, Statement *f = 0):
971 expression (e), ok (t), ko (f)
972 { kind = Kind_IfStatement; }
973
974 virtual ~IfStatement() {}
975
976 virtual void accept0(Visitor *visitor);
977
978// attributes
979 ExpressionNode *expression;
980 Statement *ok;
981 Statement *ko;
982};
983
984class DoWhileStatement: public Statement
985{
986public:
987 DoWhileStatement(Statement *stmt, ExpressionNode *e):
988 statement (stmt), expression (e)
989 { kind = Kind_DoWhileStatement; }
990
991 virtual ~DoWhileStatement() {}
992
993 virtual void accept0(Visitor *visitor);
994
995// attributes
996 Statement *statement;
997 ExpressionNode *expression;
998};
999
1000class WhileStatement: public Statement
1001{
1002public:
1003 WhileStatement(ExpressionNode *e, Statement *stmt):
1004 expression (e), statement (stmt)
1005 { kind = Kind_WhileStatement; }
1006
1007 virtual ~WhileStatement() {}
1008
1009 virtual void accept0(Visitor *visitor);
1010
1011// attributes
1012 ExpressionNode *expression;
1013 Statement *statement;
1014};
1015
1016class ForStatement: public Statement
1017{
1018public:
1019 ForStatement(ExpressionNode *i, ExpressionNode *c, ExpressionNode *e, Statement *stmt):
1020 initialiser (i), condition (c), expression (e), statement (stmt)
1021 { kind = Kind_ForStatement; }
1022
1023 virtual ~ForStatement() {}
1024
1025 virtual void accept0(Visitor *visitor);
1026
1027// attributes
1028 ExpressionNode *initialiser;
1029 ExpressionNode *condition;
1030 ExpressionNode *expression;
1031 Statement *statement;
1032};
1033
1034class LocalForStatement: public Statement
1035{
1036public:
1037 LocalForStatement(VariableDeclarationList *vlist, ExpressionNode *c, ExpressionNode *e, Statement *stmt):
1038 declarations (vlist), condition (c), expression (e), statement (stmt)
1039 { kind = Kind_LocalForStatement; }
1040
1041 virtual ~LocalForStatement() {}
1042
1043 virtual void accept0(Visitor *visitor);
1044
1045// attributes
1046 VariableDeclarationList *declarations;
1047 ExpressionNode *condition;
1048 ExpressionNode *expression;
1049 Statement *statement;
1050};
1051
1052class ForEachStatement: public Statement
1053{
1054public:
1055 ForEachStatement(ExpressionNode *i, ExpressionNode *e, Statement *stmt):
1056 initialiser (i), expression (e), statement (stmt)
1057 { kind = Kind_ForEachStatement; }
1058
1059 virtual ~ForEachStatement() {}
1060
1061 virtual void accept0(Visitor *visitor);
1062
1063// attributes
1064 ExpressionNode *initialiser;
1065 ExpressionNode *expression;
1066 Statement *statement;
1067};
1068
1069class LocalForEachStatement: public Statement
1070{
1071public:
1072 LocalForEachStatement(VariableDeclaration *v, ExpressionNode *e, Statement *stmt):
1073 declaration (v), expression (e), statement (stmt)
1074 { kind = Kind_LocalForEachStatement; }
1075
1076 virtual ~LocalForEachStatement() {}
1077
1078 virtual void accept0(Visitor *visitor);
1079
1080// attributes
1081 VariableDeclaration *declaration;
1082 ExpressionNode *expression;
1083 Statement *statement;
1084};
1085
1086class ContinueStatement: public Statement
1087{
1088public:
1089 ContinueStatement(QScriptNameIdImpl *l = 0):
1090 label (l) { kind = Kind_ContinueStatement; }
1091
1092 virtual ~ContinueStatement() {}
1093
1094 virtual void accept0(Visitor *visitor);
1095
1096// attributes
1097 QScriptNameIdImpl *label;
1098};
1099
1100class BreakStatement: public Statement
1101{
1102public:
1103 BreakStatement(QScriptNameIdImpl *l = 0):
1104 label (l) { kind = Kind_BreakStatement; }
1105
1106 virtual ~BreakStatement() {}
1107
1108 virtual void accept0(Visitor *visitor);
1109
1110// attributes
1111 QScriptNameIdImpl *label;
1112};
1113
1114class ReturnStatement: public Statement
1115{
1116public:
1117 ReturnStatement(ExpressionNode *e):
1118 expression (e) { kind = Kind_ReturnStatement; }
1119
1120 virtual ~ReturnStatement() {}
1121
1122 virtual void accept0(Visitor *visitor);
1123
1124// attributes
1125 ExpressionNode *expression;
1126};
1127
1128class WithStatement: public Statement
1129{
1130public:
1131 WithStatement(ExpressionNode *e, Statement *stmt):
1132 expression (e), statement (stmt)
1133 { kind = Kind_WithStatement; }
1134
1135 virtual ~WithStatement() {}
1136
1137 virtual void accept0(Visitor *visitor);
1138
1139// attributes
1140 ExpressionNode *expression;
1141 Statement *statement;
1142};
1143
1144class SwitchStatement: public Statement
1145{
1146public:
1147 SwitchStatement(ExpressionNode *e, CaseBlock *b):
1148 expression (e), block (b)
1149 { kind = Kind_SwitchStatement; }
1150
1151 virtual ~SwitchStatement() {}
1152
1153 virtual void accept0(Visitor *visitor);
1154
1155// attributes
1156 ExpressionNode *expression;
1157 CaseBlock *block;
1158};
1159
1160class CaseBlock: public Node
1161{
1162public:
1163 CaseBlock(CaseClauses *c, DefaultClause *d = 0, CaseClauses *r = 0):
1164 clauses (c), defaultClause (d), moreClauses (r)
1165 { kind = Kind_CaseBlock; }
1166
1167 virtual ~CaseBlock() {}
1168
1169 virtual void accept0(Visitor *visitor);
1170
1171// attributes
1172 CaseClauses *clauses;
1173 DefaultClause *defaultClause;
1174 CaseClauses *moreClauses;
1175};
1176
1177class CaseClauses: public Node
1178{
1179public:
1180 CaseClauses(CaseClause *c):
1181 clause (c), next (this)
1182 { kind = Kind_CaseClauses; }
1183
1184 CaseClauses(CaseClauses *previous, CaseClause *c):
1185 clause (c)
1186 {
1187 kind = Kind_CaseClauses;
1188 next = previous->next;
1189 previous->next = this;
1190 }
1191
1192 virtual ~CaseClauses() {}
1193
1194 virtual void accept0(Visitor *visitor);
1195
1196 inline CaseClauses *finish ()
1197 {
1198 CaseClauses *front = next;
1199 next = 0;
1200 return front;
1201 }
1202
1203//attributes
1204 CaseClause *clause;
1205 CaseClauses *next;
1206};
1207
1208class CaseClause: public Node
1209{
1210public:
1211 CaseClause(ExpressionNode *e, StatementList *slist):
1212 expression (e), statements (slist)
1213 { kind = Kind_CaseClause; }
1214
1215 virtual ~CaseClause() {}
1216
1217 virtual void accept0(Visitor *visitor);
1218
1219// attributes
1220 ExpressionNode *expression;
1221 StatementList *statements;
1222};
1223
1224class DefaultClause: public Node
1225{
1226public:
1227 DefaultClause(StatementList *slist):
1228 statements (slist)
1229 { kind = Kind_DefaultClause; }
1230
1231 virtual ~DefaultClause() {}
1232
1233 virtual void accept0(Visitor *visitor);
1234
1235// attributes
1236 StatementList *statements;
1237};
1238
1239class LabelledStatement: public Statement
1240{
1241public:
1242 LabelledStatement(QScriptNameIdImpl *l, Statement *stmt):
1243 label (l), statement (stmt)
1244 { kind = Kind_LabelledStatement; }
1245
1246 virtual ~LabelledStatement() {}
1247
1248 virtual void accept0(Visitor *visitor);
1249
1250// attributes
1251 QScriptNameIdImpl *label;
1252 Statement *statement;
1253};
1254
1255class ThrowStatement: public Statement
1256{
1257public:
1258 ThrowStatement(ExpressionNode *e):
1259 expression (e) { kind = Kind_ThrowStatement; }
1260
1261 virtual ~ThrowStatement() {}
1262
1263 virtual void accept0(Visitor *visitor);
1264
1265// attributes
1266 ExpressionNode *expression;
1267};
1268
1269class TryStatement: public Statement
1270{
1271public:
1272 TryStatement(Statement *stmt, Catch *c, Finally *f):
1273 statement (stmt), catchExpression (c), finallyExpression (f)
1274 { kind = Kind_TryStatement; }
1275
1276 TryStatement(Statement *stmt, Finally *f):
1277 statement (stmt), catchExpression (0), finallyExpression (f)
1278 { kind = Kind_TryStatement; }
1279
1280 TryStatement(Statement *stmt, Catch *c):
1281 statement (stmt), catchExpression (c), finallyExpression (0)
1282 { kind = Kind_TryStatement; }
1283
1284 virtual ~TryStatement() {}
1285
1286 virtual void accept0(Visitor *visitor);
1287
1288// attributes
1289 Statement *statement;
1290 Catch *catchExpression;
1291 Finally *finallyExpression;
1292};
1293
1294class Catch: public Node
1295{
1296public:
1297 Catch(QScriptNameIdImpl *n, Statement *stmt):
1298 name (n), statement (stmt)
1299 { kind = Kind_Catch; }
1300
1301 virtual ~Catch() {}
1302
1303 virtual void accept0(Visitor *visitor);
1304
1305// attributes
1306 QScriptNameIdImpl *name;
1307 Statement *statement;
1308};
1309
1310class Finally: public Node
1311{
1312public:
1313 Finally(Statement *stmt):
1314 statement (stmt)
1315 { kind = Kind_Finally; }
1316
1317 virtual ~Finally() {}
1318
1319 virtual void accept0(Visitor *visitor);
1320
1321// attributes
1322 Statement *statement;
1323};
1324
1325class FunctionExpression: public ExpressionNode
1326{
1327public:
1328 FunctionExpression(QScriptNameIdImpl *n, FormalParameterList *f, FunctionBody *b):
1329 name (n), formals (f), body (b)
1330 { kind = Kind_FunctionExpression; }
1331
1332 virtual ~FunctionExpression() {}
1333
1334 virtual void accept0(Visitor *visitor);
1335
1336// attributes
1337 QScriptNameIdImpl *name;
1338 FormalParameterList *formals;
1339 FunctionBody *body;
1340};
1341
1342class FunctionDeclaration: public FunctionExpression
1343{
1344public:
1345 FunctionDeclaration(QScriptNameIdImpl *n, FormalParameterList *f, FunctionBody *b):
1346 FunctionExpression(n, f, b)
1347 { kind = Kind_FunctionDeclaration; }
1348
1349 virtual ~FunctionDeclaration() {}
1350
1351 virtual void accept0(Visitor *visitor);
1352};
1353
1354class FormalParameterList: public Node
1355{
1356public:
1357 FormalParameterList(QScriptNameIdImpl *n):
1358 name (n), next (this)
1359 { kind = Kind_FormalParameterList; }
1360
1361 FormalParameterList(FormalParameterList *previous, QScriptNameIdImpl *n):
1362 name (n)
1363 {
1364 kind = Kind_FormalParameterList;
1365 next = previous->next;
1366 previous->next = this;
1367 }
1368
1369 virtual ~FormalParameterList() {}
1370
1371 virtual void accept0(Visitor *visitor);
1372
1373 inline FormalParameterList *finish ()
1374 {
1375 FormalParameterList *front = next;
1376 next = 0;
1377 return front;
1378 }
1379
1380// attributes
1381 QScriptNameIdImpl *name;
1382 FormalParameterList *next;
1383};
1384
1385class FunctionBody: public Node
1386{
1387public:
1388 FunctionBody(SourceElements *elts):
1389 elements (elts)
1390 { kind = Kind_FunctionBody; }
1391
1392 virtual ~FunctionBody() {}
1393
1394 virtual void accept0(Visitor *visitor);
1395
1396// attributes
1397 SourceElements *elements;
1398};
1399
1400class Program: public Node
1401{
1402public:
1403 Program(SourceElements *elts):
1404 elements (elts)
1405 { kind = Kind_Program; }
1406
1407 virtual ~Program() {}
1408
1409 virtual void accept0(Visitor *visitor);
1410
1411// attributes
1412 SourceElements *elements;
1413};
1414
1415class SourceElements: public Node
1416{
1417public:
1418 SourceElements(SourceElement *elt):
1419 element (elt), next (this)
1420 { kind = Kind_SourceElements; }
1421
1422 SourceElements(SourceElements *previous, SourceElement *elt):
1423 element (elt)
1424 {
1425 kind = Kind_SourceElements;
1426 next = previous->next;
1427 previous->next = this;
1428 }
1429
1430 virtual ~SourceElements() {}
1431
1432 virtual void accept0(Visitor *visitor);
1433
1434 inline SourceElements *finish ()
1435 {
1436 SourceElements *front = next;
1437 next = 0;
1438 return front;
1439 }
1440
1441// attributes
1442 SourceElement *element;
1443 SourceElements *next;
1444};
1445
1446class SourceElement: public Node
1447{
1448public:
1449 inline SourceElement()
1450 { kind = Kind_SourceElement; }
1451
1452 virtual ~SourceElement() {}
1453};
1454
1455class FunctionSourceElement: public SourceElement
1456{
1457public:
1458 FunctionSourceElement(FunctionDeclaration *f):
1459 declaration (f)
1460 { kind = Kind_FunctionSourceElement; }
1461
1462 virtual ~FunctionSourceElement() {}
1463
1464 virtual void accept0(Visitor *visitor);
1465
1466// attributes
1467 FunctionDeclaration *declaration;
1468};
1469
1470class StatementSourceElement: public SourceElement
1471{
1472public:
1473 StatementSourceElement(Statement *stmt):
1474 statement (stmt)
1475 { kind = Kind_StatementSourceElement; }
1476
1477 virtual ~StatementSourceElement() {}
1478
1479 virtual void accept0(Visitor *visitor);
1480
1481// attributes
1482 Statement *statement;
1483};
1484
1485class DebuggerStatement: public Statement
1486{
1487public:
1488 DebuggerStatement()
1489 { kind = Kind_DebuggerStatement; }
1490
1491 virtual ~DebuggerStatement() {}
1492
1493 virtual void accept0(Visitor *visitor);
1494};
1495
1496} } // namespace AST
1497
1498#endif // QT_NO_SCRIPT
1499
1500QT_END_NAMESPACE
1501
1502#endif
Note: See TracBrowser for help on using the repository browser.