Eneboo - Documentación para desarrolladores
|
00001 /**************************************************************************** 00002 ** $Id: qsnodes.h 1.1.5 edited 2006-02-23T15:39:57$ 00003 ** 00004 ** Copyright (C) 2001-2006 Trolltech AS. All rights reserved. 00005 ** 00006 ** This file is part of the Qt Script for Applications framework (QSA). 00007 ** 00008 ** This file may be distributed and/or modified under the terms of the 00009 ** GNU General Public License version 2 as published by the Free Software 00010 ** Foundation and appearing in the file LICENSE.GPL included in the 00011 ** packaging of this file. 00012 ** 00013 ** Licensees holding a valid Qt Script for Applications license may use 00014 ** this file in accordance with the Qt Script for Applications License 00015 ** Agreement provided with the Software. 00016 ** 00017 ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE 00018 ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 00019 ** 00020 ** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for 00021 ** information about QSA Commercial License Agreements. 00022 ** See http://www.trolltech.com/gpl/ for GPL licensing information. 00023 ** 00024 ** Contact info@trolltech.com if any conditions of this licensing are 00025 ** not clear to you. 00026 ** 00027 *****************************************************************************/ 00028 00029 #ifndef QSNODES_H 00030 #define QSNODES_H 00031 00032 #include "qsmember.h" 00033 #include "qsglobal.h" 00034 #include "qsinternal.h" 00035 #include "qsobject.h" 00036 #include "qsreference.h" 00037 #include "qstypes.h" 00038 #include "qsdebugger.h" 00039 #include <qstring.h> 00040 #include <qptrlist.h> 00041 00042 class QSObject; 00043 class QSCheckData; 00044 class RegExp; 00045 class QSSourceElementsNode; 00046 class QSProgramNode; 00047 class QSTypeNode; 00048 class QSLookupInfo; 00049 00050 enum Operator { 00051 OpEqual, 00052 OpEqEq, 00053 OpNotEq, 00054 OpStrEq, 00055 OpStrNEq, 00056 OpPlusEq, 00057 OpMinusEq, 00058 OpMultEq, 00059 OpDivEq, 00060 OpPlusPlus, 00061 OpMinusMinus, 00062 OpLess, 00063 OpLessEq, 00064 OpGreater, 00065 OpGreaterEq, 00066 OpAndEq, 00067 OpXOrEq, 00068 OpOrEq, 00069 OpModEq, 00070 OpAnd, 00071 OpOr, 00072 OpBitAnd, 00073 OpBitXOr, 00074 OpBitOr, 00075 OpLShift, 00076 OpRShift, 00077 OpURShift, 00078 OpIs, 00079 OpIn, 00080 OpInstanceOf 00081 }; 00082 00083 class QSNode 00084 { 00085 public: 00086 QSNode(); 00087 virtual ~QSNode(); 00088 virtual QSObject evaluate(QSEnv *); 00089 virtual QSObject rhs(QSEnv *) const = 0; 00090 virtual QSReference lhs(QSEnv *); 00091 int lineNo() const { 00092 return line; 00093 } 00094 static QSNode *firstNode() { 00095 return first; 00096 } 00097 static void setFirstNode(QSNode *n) { 00098 first = n; 00099 } 00100 virtual void check(QSCheckData *) = 0; 00101 #ifdef QSDEBUGGER 00102 static bool setBreakpoint(QSNode *firstNode, int id, int line, bool set); 00103 virtual bool setBreakpoint(int, int, bool); 00104 #endif 00105 virtual bool deref() { 00106 Q_ASSERT(refCount > 0); 00107 return !--refCount; 00108 } 00109 virtual void ref() { 00110 ++refCount; 00111 } 00112 virtual int refs() const { 00113 return refCount; 00114 } 00115 protected: 00116 QSObject throwError(QSEnv *env, ErrorType e, const char *msg) const; 00117 int refCount; 00118 private: 00119 // disallow assignment and copy-construction 00120 QSNode(const QSNode &); 00121 QSNode &operator=(const QSNode &); 00122 int line; 00123 static QSNode *first; 00124 public: 00125 QSNode *next, *prev; 00126 00127 #ifdef QSNODES_ALLOC_DEBUG 00128 static uint qsNodeCount; 00129 #endif 00130 00131 friend class QSEngineImp; 00132 }; 00133 00134 class QSStatementNode : public QSNode 00135 { 00136 public: 00137 #ifdef QSDEBUGGER 00138 QSStatementNode() : l0(-1), l1(-1), sid(-1), breakPoint(FALSE) { } 00139 void setLoc(int line0, int line1); 00140 int firstLine() const { 00141 return l0; 00142 } 00143 int lastLine() const { 00144 return l1; 00145 } 00146 int sourceId() const { 00147 return sid; 00148 } 00149 bool hitStatement(QSEnv *env); 00150 bool abortStatement(QSEnv *env); 00151 virtual bool setBreakpoint(int id, int line, bool set); 00152 #endif 00153 virtual QSObject execute(QSEnv *) = 0; 00154 void check(QSCheckData *) = 0; 00155 void checkIfGlobalAllowed(QSCheckData *); 00156 QSObject errorCompletion(); 00157 void pushLabel(const QString &id) { 00158 ls.push(id); 00159 } 00160 protected: 00161 LabelStack ls; 00162 private: 00163 QSObject evaluate(QSEnv *env) { 00164 return env->createUndefined(); 00165 } 00166 QSObject rhs(QSEnv *env) const { 00167 return env->createUndefined(); 00168 } 00169 #ifdef QSDEBUGGER 00170 int l0, l1; 00171 int sid; 00172 bool breakPoint; 00173 #endif 00174 }; 00175 00176 class QSAttributeNode : public QSNode 00177 { 00178 public: 00179 QSAttributeNode(QSAttribute a) { 00180 add(a); 00181 } 00182 void add(QSAttribute a) { 00183 attrs.append(a); 00184 } 00185 QSObject rhs(QSEnv *env) const { 00186 return env->createUndefined(); 00187 } 00188 void check(QSCheckData *); 00189 00190 private: 00191 QValueList<QSAttribute> attrs; 00192 }; 00193 00194 class QSNullNode : public QSNode 00195 { 00196 public: 00197 QSObject rhs(QSEnv *) const; 00198 virtual void check(QSCheckData *); 00199 }; 00200 00201 class QSBooleanNode : public QSNode 00202 { 00203 public: 00204 QSBooleanNode(bool v) : value(v) { } 00205 QSObject rhs(QSEnv *) const; 00206 virtual void check(QSCheckData *); 00207 private: 00208 bool value; 00209 }; 00210 00211 class QSNumberNode : public QSNode 00212 { 00213 public: 00214 QSNumberNode(double v) : value(v) { } 00215 QSObject rhs(QSEnv *) const; 00216 virtual void check(QSCheckData *); 00217 private: 00218 double value; 00219 }; 00220 00221 class QSStringNode : public QSNode 00222 { 00223 public: 00224 QSStringNode(const QString &v) { 00225 value = v; 00226 } 00227 QSObject rhs(QSEnv *) const; 00228 virtual void check(QSCheckData *); 00229 private: 00230 QString value; 00231 }; 00232 00233 class QSRegExpNode : public QSNode 00234 { 00235 public: 00236 QSRegExpNode(const QString &p, const QString &f) 00237 : pattern(p), flags(f) { } 00238 QSObject rhs(QSEnv *) const; 00239 virtual void check(QSCheckData *); 00240 private: 00241 QString pattern, flags; 00242 }; 00243 00244 class QSThisNode : public QSNode 00245 { 00246 public: 00247 QSObject rhs(QSEnv *) const; 00248 virtual void check(QSCheckData *); 00249 }; 00250 00251 class QSResolveNode : public QSNode 00252 { 00253 public: 00254 QSResolveNode(const QString &s) : ident(s), info(0) { } 00255 ~QSResolveNode(); 00256 QSObject rhs(QSEnv *) const; 00257 QSReference lhs(QSEnv *); 00258 void assign(const QSObject &val) const; 00259 virtual void check(QSCheckData *); 00260 private: 00261 QString ident; 00262 QSLookupInfo *info; 00263 }; 00264 00265 class QSGroupNode : public QSNode 00266 { 00267 public: 00268 QSGroupNode(QSNode *g) : group(g) { } 00269 QSObject rhs(QSEnv *) const; 00270 QSReference lhs(QSEnv *env); 00271 virtual void check(QSCheckData *); 00272 bool deref(); 00273 void ref(); 00274 private: 00275 QSNode *group; 00276 }; 00277 00278 class QSElisionNode : public QSNode 00279 { 00280 public: 00281 QSElisionNode(QSElisionNode *e) : elision(e) { } 00282 QSObject rhs(QSEnv *) const; 00283 virtual void check(QSCheckData *); 00284 bool deref(); 00285 void ref(); 00286 private: 00287 QSElisionNode *elision; 00288 }; 00289 00290 class QSElementNode : public QSNode 00291 { 00292 public: 00293 QSElementNode(QSElisionNode *e, QSNode *n) : 00294 list(0), elision(e), node(n) { } 00295 QSElementNode(QSElementNode *l, QSElisionNode *e, QSNode *n) 00296 : list(l), elision(e), node(n) { } 00297 QSObject rhs(QSEnv *) const; 00298 virtual void check(QSCheckData *); 00299 bool deref(); 00300 void ref(); 00301 private: 00302 QSElementNode *list; 00303 QSElisionNode *elision; 00304 QSNode *node; 00305 }; 00306 00307 class QSArrayNode : public QSNode 00308 { 00309 public: 00310 QSArrayNode(QSElisionNode *e) 00311 : element(0), elision(e), opt(TRUE) { } 00312 QSArrayNode(QSElementNode *ele) 00313 : element(ele), elision(0), opt(FALSE) { } 00314 QSArrayNode(QSElisionNode *eli, QSElementNode *ele) 00315 : element(ele), elision(eli), opt(TRUE) { } 00316 QSObject rhs(QSEnv *) const; 00317 virtual void check(QSCheckData *); 00318 bool deref(); 00319 void ref(); 00320 private: 00321 QSElementNode *element; 00322 QSElisionNode *elision; 00323 bool opt; 00324 }; 00325 00326 class QSObjectLiteralNode : public QSNode 00327 { 00328 public: 00329 QSObjectLiteralNode(QSNode *l) : list(l) { } 00330 QSObject rhs(QSEnv *) const; 00331 virtual void check(QSCheckData *); 00332 bool deref(); 00333 void ref(); 00334 private: 00335 QSNode *list; 00336 }; 00337 00338 class QSPropertyValueNode : public QSNode 00339 { 00340 public: 00341 QSPropertyValueNode(QSNode *n, QSNode *a, QSNode *l = 0) 00342 : name(n), assign(a), list(l) { } 00343 QSObject rhs(QSEnv *) const; 00344 virtual void check(QSCheckData *); 00345 bool deref(); 00346 void ref(); 00347 private: 00348 QSNode *name, *assign, *list; 00349 }; 00350 00351 class QSPropertyNode : public QSNode 00352 { 00353 public: 00354 QSPropertyNode(double d) : numeric(d) { } 00355 QSPropertyNode(const QString &s) : str(s) { } 00356 QSObject rhs(QSEnv *) const; 00357 virtual void check(QSCheckData *); 00358 private: 00359 double numeric; 00360 QString str; 00361 }; 00362 00363 class QSAccessorNode1 : public QSNode 00364 { 00365 public: 00366 QSAccessorNode1(QSNode *e1, QSNode *e2) : expr1(e1), expr2(e2) { } 00367 QSReference lhs(QSEnv *); 00368 QSObject rhs(QSEnv *) const; 00369 virtual void check(QSCheckData *); 00370 bool deref(); 00371 void ref(); 00372 private: 00373 QSNode *expr1; 00374 QSNode *expr2; 00375 }; 00376 00377 class QSAccessorNode2 : public QSNode 00378 { 00379 public: 00380 QSAccessorNode2(QSNode *e, const QString &s) : expr(e), ident(s) { } 00381 QSReference lhs(QSEnv *); 00382 QSObject rhs(QSEnv *) const; 00383 virtual void check(QSCheckData *); 00384 bool deref(); 00385 void ref(); 00386 private: 00387 QSNode *expr; 00388 QString ident; 00389 }; 00390 00391 class QSArgumentListNode : public QSNode 00392 { 00393 public: 00394 QSArgumentListNode(QSNode *e) 00395 : list(0), expr(e) { } 00396 QSArgumentListNode(QSArgumentListNode *l, QSNode *e) 00397 : list(l), expr(e) { } 00398 QSObject rhs(QSEnv *) const; 00399 QSList *evaluateList(QSEnv *); 00400 virtual void check(QSCheckData *); 00401 bool deref(); 00402 void ref(); 00403 private: 00404 QSArgumentListNode *list; 00405 QSNode *expr; 00406 }; 00407 00408 class QSArgumentsNode : public QSNode 00409 { 00410 public: 00411 QSArgumentsNode(QSArgumentListNode *l) : list(l) { } 00412 QSObject rhs(QSEnv *) const; 00413 QSList *evaluateList(QSEnv *); 00414 virtual void check(QSCheckData *); 00415 bool deref(); 00416 void ref(); 00417 private: 00418 QSArgumentListNode *list; 00419 }; 00420 00421 class QSNewExprNode : public QSNode 00422 { 00423 public: 00424 QSNewExprNode(QSNode *e) : expr(e), args(0) { } 00425 QSNewExprNode(QSNode *e, QSArgumentsNode *a) : expr(e), args(a) { } 00426 QSObject rhs(QSEnv *) const; 00427 QSObject evaluate(QSEnv *); 00428 virtual void check(QSCheckData *); 00429 bool deref(); 00430 void ref(); 00431 private: 00432 QSNode *expr; 00433 QSArgumentsNode *args; 00434 }; 00435 00436 class QSFunctionCallNode : public QSStatementNode 00437 { 00438 public: 00439 QSFunctionCallNode(QSNode *e, QSArgumentsNode *a) 00440 : expr(e), args(a) { } 00441 QSObject rhs(QSEnv *) const; 00442 #ifdef QSDEBUGGER 00443 void steppingInto(bool in, QSEnv *env) const; 00444 Debugger::Mode previousMode; 00445 #endif 00446 virtual void check(QSCheckData *); 00447 virtual QSObject execute(QSEnv *); 00448 bool deref(); 00449 void ref(); 00450 private: 00451 QSNode *expr; 00452 QSArgumentsNode *args; 00453 }; 00454 00455 class QSEmitNode : public QSNode 00456 { 00457 public: 00458 QSEmitNode(QSNode *e, QSArgumentsNode *a) 00459 : expr(e), args(a) { } 00460 QSObject rhs(QSEnv *) const { 00461 return QSObject(); 00462 } 00463 virtual void check(QSCheckData *) { }; 00464 bool deref(); 00465 void ref(); 00466 private: 00467 QSNode *expr; 00468 QSArgumentsNode *args; 00469 }; 00470 00471 class QSPostfixNode : public QSNode 00472 { 00473 public: 00474 QSPostfixNode(QSNode *e, Operator o) : expr(e), oper(o) { } 00475 QSObject rhs(QSEnv *) const; 00476 virtual void check(QSCheckData *); 00477 bool deref(); 00478 void ref(); 00479 private: 00480 QSNode *expr; 00481 Operator oper; 00482 }; 00483 00484 class QSDeleteNode : public QSNode 00485 { 00486 public: 00487 QSDeleteNode(QSNode *e) : expr(e) { } 00488 QSObject rhs(QSEnv *) const; 00489 virtual void check(QSCheckData *); 00490 bool deref(); 00491 void ref(); 00492 private: 00493 QSNode *expr; 00494 }; 00495 00496 class QSVoidNode : public QSNode 00497 { 00498 public: 00499 QSVoidNode(QSNode *e) : expr(e) { } 00500 QSObject rhs(QSEnv *) const; 00501 virtual void check(QSCheckData *); 00502 bool deref(); 00503 void ref(); 00504 private: 00505 QSNode *expr; 00506 }; 00507 00508 class QSTypeOfNode : public QSNode 00509 { 00510 public: 00511 QSTypeOfNode(QSNode *e) : expr(e) { } 00512 QSObject rhs(QSEnv *) const; 00513 virtual void check(QSCheckData *); 00514 bool deref(); 00515 void ref(); 00516 private: 00517 QSNode *expr; 00518 }; 00519 00520 class QSPrefixNode : public QSNode 00521 { 00522 public: 00523 QSPrefixNode(Operator o, QSNode *e) : oper(o), expr(e) { } 00524 QSObject rhs(QSEnv *) const; 00525 virtual void check(QSCheckData *); 00526 bool deref(); 00527 void ref(); 00528 private: 00529 Operator oper; 00530 QSNode *expr; 00531 }; 00532 00533 class QSUnaryPlusNode : public QSNode 00534 { 00535 public: 00536 QSUnaryPlusNode(QSNode *e) : expr(e) { } 00537 QSObject rhs(QSEnv *) const; 00538 virtual void check(QSCheckData *); 00539 bool deref(); 00540 void ref(); 00541 private: 00542 QSNode *expr; 00543 }; 00544 00545 class QSNegateNode : public QSNode 00546 { 00547 public: 00548 QSNegateNode(QSNode *e) : expr(e) { } 00549 QSObject rhs(QSEnv *) const; 00550 virtual void check(QSCheckData *); 00551 bool deref(); 00552 void ref(); 00553 private: 00554 QSNode *expr; 00555 }; 00556 00557 class QSBitwiseNotNode : public QSNode 00558 { 00559 public: 00560 QSBitwiseNotNode(QSNode *e) : expr(e) { } 00561 QSObject rhs(QSEnv *) const; 00562 virtual void check(QSCheckData *); 00563 bool deref(); 00564 void ref(); 00565 private: 00566 QSNode *expr; 00567 }; 00568 00569 class QSLogicalNotNode : public QSNode 00570 { 00571 public: 00572 QSLogicalNotNode(QSNode *e) : expr(e) { } 00573 QSObject rhs(QSEnv *) const; 00574 virtual void check(QSCheckData *); 00575 bool deref(); 00576 void ref(); 00577 private: 00578 QSNode *expr; 00579 }; 00580 00581 class QSMultNode : public QSNode 00582 { 00583 public: 00584 QSMultNode(QSNode *t1, QSNode *t2, char op) 00585 : term1(t1), term2(t2), oper(op) { } 00586 QSObject rhs(QSEnv *) const; 00587 virtual void check(QSCheckData *); 00588 bool deref(); 00589 void ref(); 00590 private: 00591 QSNode *term1, *term2; 00592 char oper; 00593 }; 00594 00595 class QSAddNode : public QSNode 00596 { 00597 public: 00598 QSAddNode(QSNode *t1, QSNode *t2, char op) 00599 : term1(t1), term2(t2), oper(op) { } 00600 QSObject rhs(QSEnv *) const; 00601 virtual void check(QSCheckData *); 00602 bool deref(); 00603 void ref(); 00604 private: 00605 QSNode *term1, *term2; 00606 char oper; 00607 }; 00608 00609 class QSShiftNode : public QSNode 00610 { 00611 public: 00612 QSShiftNode(QSNode *t1, Operator o, QSNode *t2) 00613 : term1(t1), term2(t2), oper(o) { } 00614 QSObject rhs(QSEnv *) const; 00615 virtual void check(QSCheckData *); 00616 bool deref(); 00617 void ref(); 00618 private: 00619 QSNode *term1, *term2; 00620 Operator oper; 00621 }; 00622 00623 class QSRelationalNode : public QSNode 00624 { 00625 public: 00626 QSRelationalNode(QSNode *e1, Operator o, QSNode *e2) 00627 : expr1(e1), expr2(e2), oper(o) { } 00628 QSObject rhs(QSEnv *) const; 00629 virtual void check(QSCheckData *); 00630 bool deref(); 00631 void ref(); 00632 private: 00633 QSNode *expr1, *expr2; 00634 Operator oper; 00635 }; 00636 00637 class QSEqualNode : public QSNode 00638 { 00639 public: 00640 QSEqualNode(QSNode *e1, Operator o, QSNode *e2) 00641 : expr1(e1), expr2(e2), oper(o) { } 00642 QSObject rhs(QSEnv *) const; 00643 virtual void check(QSCheckData *); 00644 bool deref(); 00645 void ref(); 00646 private: 00647 QSNode *expr1, *expr2; 00648 Operator oper; 00649 }; 00650 00651 class QSBitOperNode : public QSNode 00652 { 00653 public: 00654 QSBitOperNode(QSNode *e1, Operator o, QSNode *e2) 00655 : expr1(e1), expr2(e2), oper(o) { } 00656 QSObject rhs(QSEnv *) const; 00657 virtual void check(QSCheckData *); 00658 bool deref(); 00659 void ref(); 00660 private: 00661 QSNode *expr1, *expr2; 00662 Operator oper; 00663 }; 00664 00665 class QSBinaryLogicalNode : public QSNode 00666 { 00667 public: 00668 QSBinaryLogicalNode(QSNode *e1, Operator o, QSNode *e2) 00669 : expr1(e1), expr2(e2), oper(o) { } 00670 QSObject rhs(QSEnv *) const; 00671 virtual void check(QSCheckData *); 00672 bool deref(); 00673 void ref(); 00674 private: 00675 QSNode *expr1, *expr2; 00676 Operator oper; 00677 }; 00678 00679 class QSConditionalNode : public QSNode 00680 { 00681 public: 00682 QSConditionalNode(QSNode *l, QSNode *e1, QSNode *e2) 00683 : logical(l), expr1(e1), expr2(e2) { } 00684 QSObject rhs(QSEnv *) const; 00685 virtual void check(QSCheckData *); 00686 bool deref(); 00687 void ref(); 00688 private: 00689 QSNode *logical, *expr1, *expr2; 00690 }; 00691 00692 class QSAssignNode : public QSNode 00693 { 00694 public: 00695 QSAssignNode(QSNode *l, Operator o, QSNode *e) 00696 : left(l), oper(o), expr(e) { } 00697 QSObject rhs(QSEnv *) const; 00698 void check(QSCheckData *); 00699 bool deref(); 00700 void ref(); 00701 private: 00702 QSNode *left; 00703 Operator oper; 00704 QSNode *expr; 00705 }; 00706 00707 class QSCommaNode : public QSNode 00708 { 00709 public: 00710 QSCommaNode(QSNode *e1, QSNode *e2) : expr1(e1), expr2(e2) { } 00711 QSObject rhs(QSEnv *) const; 00712 virtual void check(QSCheckData *); 00713 bool deref(); 00714 void ref(); 00715 private: 00716 QSNode *expr1, *expr2; 00717 }; 00718 00719 class QSStatListNode : public QSStatementNode 00720 { 00721 public: 00722 QSStatListNode(QSStatementNode *s) : statement(s), list(0) { } 00723 QSStatListNode(QSStatListNode *l, QSStatementNode *s) 00724 : statement(s), list(l) { } 00725 QSObject execute(QSEnv *); 00726 void check(QSCheckData *); 00727 bool deref(); 00728 void ref(); 00729 private: 00730 QSStatementNode *statement; 00731 QSStatListNode *list; 00732 }; 00733 00734 class QSAssignExprNode : public QSNode 00735 { 00736 public: 00737 QSAssignExprNode(QSNode *e) : expr(e) { } 00738 QSObject rhs(QSEnv *) const; 00739 virtual void check(QSCheckData *); 00740 bool deref(); 00741 void ref(); 00742 private: 00743 QSNode *expr; 00744 }; 00745 00746 class QSScopeNode : public QSStatementNode 00747 { 00748 public: 00749 QSScopeNode() : scope(0) {} 00750 virtual void check(QSCheckData *); 00751 virtual QSObject execute(QSEnv *); 00752 virtual void checkStatement(QSCheckData *) = 0; 00753 virtual QSObject executeStatement(QSEnv *) = 0; 00754 protected: 00755 QSBlockScopeClass *scope; 00756 }; 00757 00758 class QSBlockNode : public QSScopeNode 00759 { 00760 public: 00761 QSBlockNode(QSStatListNode *s) : statlist(s) { } 00762 QSObject executeStatement(QSEnv *); 00763 void checkStatement(QSCheckData *); 00764 bool deref(); 00765 void ref(); 00766 private: 00767 QSStatListNode *statlist; 00768 }; 00769 00770 class QSEmptyStatementNode : public QSStatementNode 00771 { 00772 public: 00773 QSEmptyStatementNode() { } // debug 00774 QSObject execute(QSEnv *); 00775 void check(QSCheckData *); 00776 }; 00777 00778 class QSExprStatementNode : public QSStatementNode 00779 { 00780 public: 00781 QSExprStatementNode(QSNode *e) : expr(e) { } 00782 QSObject execute(QSEnv *); 00783 void check(QSCheckData *); 00784 bool deref(); 00785 void ref(); 00786 private: 00787 QSNode *expr; 00788 }; 00789 00790 class QSIfNode : public QSStatementNode 00791 { 00792 public: 00793 QSIfNode(QSNode *e, QSStatementNode *s1, QSStatementNode *s2) 00794 : expr(e), statement1(s1), statement2(s2) { } 00795 QSObject execute(QSEnv *); 00796 void check(QSCheckData *); 00797 bool deref(); 00798 void ref(); 00799 private: 00800 QSNode *expr; 00801 QSStatementNode *statement1, *statement2; 00802 }; 00803 00804 class QSDoWhileNode : public QSStatementNode 00805 { 00806 public: 00807 QSDoWhileNode(QSStatementNode *s, QSNode *e) 00808 : statement(s), expr(e) { } 00809 QSObject execute(QSEnv *); 00810 void check(QSCheckData *); 00811 bool deref(); 00812 void ref(); 00813 private: 00814 QSStatementNode *statement; 00815 QSNode *expr; 00816 }; 00817 00818 class QSWhileNode : public QSStatementNode 00819 { 00820 public: 00821 QSWhileNode(QSNode *e, QSStatementNode *s) 00822 : expr(e), statement(s) { } 00823 QSObject execute(QSEnv *); 00824 void check(QSCheckData *); 00825 bool deref(); 00826 void ref(); 00827 private: 00828 QSNode *expr; 00829 QSStatementNode *statement; 00830 }; 00831 00832 class QSForNode : public QSScopeNode 00833 { 00834 public: 00835 QSForNode(QSNode *e1, QSNode *e2, QSNode *e3, QSStatementNode *s) : 00836 expr1(e1), expr2(e2), expr3(e3), stat(s) { } 00837 QSObject executeStatement(QSEnv *); 00838 void checkStatement(QSCheckData *); 00839 bool deref(); 00840 void ref(); 00841 private: 00842 QSNode *expr1, *expr2, *expr3; 00843 QSStatementNode *stat; 00844 }; 00845 00846 class QSVarBindingNode; 00847 00848 class QSForInNode : public QSScopeNode 00849 { 00850 public: 00851 QSForInNode(QSNode *l, QSNode *e, QSStatementNode *s) 00852 : var(0), lexpr(l), expr(e), stat(s) { } 00853 QSForInNode(QSVarBindingNode *v, 00854 QSNode *e, QSStatementNode *s) 00855 : var(v), lexpr(0), expr(e), stat(s) { } 00856 QSObject executeStatement(QSEnv *); 00857 void checkStatement(QSCheckData *); 00858 bool deref(); 00859 void ref(); 00860 private: 00861 QSVarBindingNode *var; 00862 QSNode *lexpr, *expr; 00863 QSStatementNode *stat; 00864 }; 00865 00866 class QSContinueNode : public QSStatementNode 00867 { 00868 public: 00869 QSContinueNode() { } 00870 QSContinueNode(const QString &i) : ident(i) { } 00871 QSObject execute(QSEnv *); 00872 void check(QSCheckData *); 00873 private: 00874 QString ident; 00875 }; 00876 00877 class QSBreakNode : public QSStatementNode 00878 { 00879 public: 00880 QSBreakNode() { } 00881 QSBreakNode(const QString &i) : ident(i) { } 00882 QSObject execute(QSEnv *); 00883 void check(QSCheckData *); 00884 private: 00885 QString ident; 00886 }; 00887 00888 class QSReturnNode : public QSStatementNode 00889 { 00890 public: 00891 QSReturnNode(QSNode *v) : value(v) { } 00892 QSObject execute(QSEnv *); 00893 void check(QSCheckData *); 00894 bool deref(); 00895 void ref(); 00896 private: 00897 QSNode *value; 00898 }; 00899 00900 class QSWithNode : public QSScopeNode 00901 { 00902 public: 00903 QSWithNode(QSNode *e, QSStatementNode *s) : expr(e), stat(s) { } 00904 QSObject executeStatement(QSEnv *); 00905 void checkStatement(QSCheckData *); 00906 bool deref(); 00907 void ref(); 00908 private: 00909 QSNode *expr; 00910 QSStatementNode *stat; 00911 }; 00912 00913 class QSCaseClauseNode: public QSNode 00914 { 00915 public: 00916 QSCaseClauseNode(QSNode *e, QSStatListNode *l) : expr(e), list(l) { } 00917 QSObject rhs(QSEnv *) const; 00918 QSObject evalStatements(QSEnv *env); 00919 virtual void check(QSCheckData *); 00920 bool deref(); 00921 void ref(); 00922 private: 00923 QSNode *expr; 00924 QSStatListNode *list; 00925 }; 00926 00927 class QSClauseListNode : public QSNode 00928 { 00929 public: 00930 QSClauseListNode(QSCaseClauseNode *c) : cl(c), nx(0) { } 00931 QSClauseListNode *append(QSCaseClauseNode *c); 00932 QSCaseClauseNode *clause() const { 00933 return cl; 00934 } 00935 QSClauseListNode *next() const { 00936 return nx; 00937 } 00938 virtual void check(QSCheckData *); 00939 bool deref(); 00940 void ref(); 00941 private: 00942 QSObject evaluate(QSEnv *) { 00943 /* should never be called */ return QSObject(); 00944 } 00945 QSObject rhs(QSEnv *env) const { 00946 /* should never be called */ return env->createUndefined(); 00947 } 00948 QSCaseClauseNode *cl; 00949 QSClauseListNode *nx; 00950 }; 00951 00952 class QSCaseBlockNode: public QSNode 00953 { 00954 public: 00955 QSCaseBlockNode(QSClauseListNode *l1, QSCaseClauseNode *d, 00956 QSClauseListNode *l2) 00957 : list1(l1), def(d), list2(l2) { } 00958 QSObject evalBlock(QSEnv *env, const QSObject &input); 00959 virtual void check(QSCheckData *); 00960 bool deref(); 00961 void ref(); 00962 private: 00963 QSObject evaluate(QSEnv *) { 00964 /* should never be called */ return QSObject(); 00965 } 00966 QSObject rhs(QSEnv *env) const { 00967 /* should never be called */ return env->createUndefined(); 00968 } 00969 QSClauseListNode *list1; 00970 QSCaseClauseNode *def; 00971 QSClauseListNode *list2; 00972 }; 00973 00974 class QSSwitchNode : public QSStatementNode 00975 { 00976 public: 00977 QSSwitchNode(QSNode *e, QSCaseBlockNode *b) : expr(e), block(b) { } 00978 QSObject execute(QSEnv *); 00979 void check(QSCheckData *); 00980 bool deref(); 00981 void ref(); 00982 private: 00983 QSNode *expr; 00984 QSCaseBlockNode *block; 00985 }; 00986 00987 class QSLabelNode : public QSStatementNode 00988 { 00989 public: 00990 QSLabelNode(const QString &l, QSStatementNode *s) 00991 : label(l), stat(s) { } 00992 QSObject execute(QSEnv *); 00993 void check(QSCheckData *); 00994 bool deref(); 00995 void ref(); 00996 private: 00997 QString label; 00998 QSStatementNode *stat; 00999 }; 01000 01001 class QSThrowNode : public QSStatementNode 01002 { 01003 public: 01004 QSThrowNode(QSNode *e) : expr(e) { } 01005 QSObject execute(QSEnv *); 01006 void check(QSCheckData *); 01007 bool deref(); 01008 void ref(); 01009 private: 01010 QSNode *expr; 01011 }; 01012 01013 class QSCatchNode : public QSScopeNode 01014 { 01015 public: 01016 QSCatchNode(const QString &i, QSStatementNode *b) : ident(i), block(b) { } 01017 QSObject executeStatement(QSEnv *env); 01018 void checkStatement(QSCheckData *); 01019 void setException(const QSObject &e) { 01020 exception = e; 01021 } 01022 bool deref(); 01023 void ref(); 01024 private: 01025 QString ident; 01026 QSStatementNode *block; 01027 int index; 01028 QSObject exception; 01029 }; 01030 01031 class QSFinallyNode : public QSStatementNode 01032 { 01033 public: 01034 QSFinallyNode(QSStatementNode *b) : block(b) { } 01035 QSObject execute(QSEnv *); 01036 void check(QSCheckData *); 01037 bool deref(); 01038 void ref(); 01039 private: 01040 QSStatementNode *block; 01041 }; 01042 01043 class QSTryNode : public QSStatementNode 01044 { 01045 public: 01046 QSTryNode(QSStatementNode *b, QSNode *c = 0, QSNode *f = 0) 01047 : block(b), _catch((QSCatchNode *)c), 01048 _final((QSFinallyNode *)f) { } 01049 QSObject execute(QSEnv *); 01050 void check(QSCheckData *); 01051 bool deref(); 01052 void ref(); 01053 private: 01054 QSStatementNode *block; 01055 QSCatchNode *_catch; 01056 QSFinallyNode *_final; 01057 }; 01058 01059 class QSParameterNode : public QSNode 01060 { 01061 public: 01062 QSParameterNode(const QString &i, QSTypeNode *t) 01063 : id(i), typ(t), next(0) { } 01064 QSParameterNode *append(const QString &i, QSTypeNode *t); 01065 QSObject rhs(QSEnv *) const; 01066 QString ident() { 01067 return id; 01068 } 01069 QSParameterNode *nextParam() { 01070 return next; 01071 } 01072 void check(QSCheckData *); 01073 bool deref(); 01074 void ref(); 01075 private: 01076 QString id; 01077 QSTypeNode *typ; 01078 QSParameterNode *next; 01079 }; 01080 01081 // inherited by QSProgramNode 01082 class QSFunctionBodyNode : public QSStatementNode 01083 { 01084 public: 01085 QSFunctionBodyNode(QSSourceElementsNode *s); 01086 ~QSFunctionBodyNode(); 01087 void check(QSCheckData *); 01088 QSObject execute(QSEnv *); 01089 void setScopeDefinition(QSFunctionScopeClass *s) { 01090 scopeDef = s; 01091 } 01092 QSFunctionScopeClass *scopeDefinition() const { 01093 return scopeDef; 01094 } 01095 int index() const { 01096 return idx; 01097 } 01098 void setIndex(int i) { 01099 idx = i; 01100 } 01101 bool deref(); 01102 void ref(); 01103 protected: 01104 QSSourceElementsNode *source; 01105 QSFunctionScopeClass *scopeDef; 01106 int idx; 01107 private: 01108 static int count; 01109 }; 01110 01111 class QSFuncDeclNode : public QSStatementNode 01112 { 01113 public: 01114 QSFuncDeclNode(const QString &i, QSParameterNode *p, 01115 QSTypeNode *t, QSFunctionBodyNode *b) 01116 : ident(i), param(p), rtype(t), body(b), attrs(0) { } 01117 void setAttributes(QSAttributeNode *a) { 01118 attrs = a; 01119 } 01120 QSObject execute(QSEnv *) { 01121 /* empty */ return QSObject(); 01122 } 01123 void check(QSCheckData *); 01124 const QString identifier() const { 01125 return ident; 01126 } 01127 bool deref(); 01128 void ref(); 01129 private: 01130 QString ident; 01131 QSParameterNode *param; 01132 QSTypeNode *rtype; 01133 QSFunctionBodyNode *body; 01134 QSAttributeNode *attrs; 01135 }; 01136 01137 class QSFuncExprNode : public QSNode 01138 { 01139 public: 01140 QSFuncExprNode(QSParameterNode *p, QSFunctionBodyNode *b) 01141 : param(p), body(b) { } 01142 QSObject rhs(QSEnv *) const; 01143 void check(QSCheckData *); 01144 bool deref(); 01145 void ref(); 01146 private: 01147 QSParameterNode *param; 01148 QSFunctionBodyNode *body; 01149 }; 01150 01151 class QSClassDefNode; 01152 01153 class QSSourceElementNode : public QSStatementNode 01154 { 01155 public: 01156 QSSourceElementNode(QSStatementNode *s) : statement(s) { } 01157 void check(QSCheckData *); 01158 QSObject execute(QSEnv *); 01159 void deleteStatements(); 01160 bool deref(); 01161 void ref(); 01162 private: 01163 QSStatementNode *statement; 01164 }; 01165 01166 class QSSourceElementsNode : public QSStatementNode 01167 { 01168 public: 01169 QSSourceElementsNode(QSSourceElementNode *s1) { 01170 element = s1; 01171 elements = 0; 01172 } 01173 QSSourceElementsNode(QSSourceElementsNode *s1, QSSourceElementNode *s2) { 01174 elements = s1; 01175 element = s2; 01176 } 01177 void check(QSCheckData *); 01178 QSObject execute(QSEnv *); 01179 void deleteStatements(); 01180 bool deref(); 01181 void ref(); 01182 private: 01183 QSSourceElementNode *element; 01184 QSSourceElementsNode *elements; 01185 }; 01186 01187 class QSProgramNode : public QSFunctionBodyNode 01188 { 01189 public: 01190 QSProgramNode(QSSourceElementsNode *s); 01191 ~QSProgramNode(); 01192 void check(QSCheckData *); 01193 void deleteGlobalStatements(); 01194 static QSProgramNode *last() { 01195 return prog; 01196 } 01197 private: 01198 static QSProgramNode *prog; 01199 }; 01200 01201 class QSClassDefNode : public QSStatementNode 01202 { 01203 public: 01204 QSClassDefNode(const QString &i, QSTypeNode *t, QSFunctionBodyNode *b) 01205 : ident(i), type(t), body(b), cldef(0), attrs(0) { } 01206 void setAttributes(QSAttributeNode *a) { 01207 attrs = a; 01208 } 01209 void check(QSCheckData *); 01210 QSObject execute(QSEnv *); 01211 QString identifier() const { 01212 return ident; 01213 } 01214 void setClassDefinition(QSClassClass *cl) { 01215 cldef = cl; 01216 } 01217 bool deref(); 01218 void ref(); 01219 private: 01220 QString ident; 01221 QSTypeNode *type; 01222 QSFunctionBodyNode *body; 01223 QSClassClass *cldef; 01224 QSAttributeNode *attrs; 01225 }; 01226 01227 class QSTypeNode : public QSNode 01228 { 01229 public: 01230 QSTypeNode(const QString &i) : ident(i) { } 01231 void check(QSCheckData *); 01232 QSObject rhs(QSEnv *) const; 01233 QString identifier() const { 01234 return ident; 01235 } 01236 private: 01237 QString ident; 01238 }; 01239 01240 class QSTypedVarNode : public QSNode 01241 { 01242 public: 01243 QSTypedVarNode(const QString &i, QSTypeNode *t) 01244 : ident(i), type(t) { } 01245 QSObject rhs(QSEnv *) const; 01246 QString identifier() const { 01247 return ident; 01248 } 01249 QSTypeNode *typeNode() const { 01250 return type; 01251 } 01252 void check(QSCheckData *); 01253 bool deref(); 01254 void ref(); 01255 private: 01256 QString ident; 01257 QSTypeNode *type; 01258 }; 01259 01260 class QSVarBindingNode : public QSNode 01261 { 01262 public: 01263 QSVarBindingNode(QSTypedVarNode *v, QSNode *a) 01264 : var(v), assign((QSAssignNode *)a), idx(0) { } 01265 void declare(QSEnv *env) const; 01266 void check(QSCheckData *); 01267 int index() const { 01268 return idx; 01269 } 01270 bool deref(); 01271 void ref(); 01272 private: 01273 QSObject rhs(QSEnv *env) const { 01274 declare(env); 01275 return QSObject(); 01276 } 01277 QSTypedVarNode *var; 01278 QSAssignNode *assign; 01279 int idx; 01280 }; 01281 01282 class QSVarBindingListNode : public QSNode 01283 { 01284 public: 01285 QSVarBindingListNode(QSVarBindingListNode *l, QSVarBindingNode *b) 01286 : list(l), binding(b) { } 01287 void declare(QSEnv *env) const; 01288 void check(QSCheckData *); 01289 bool deref(); 01290 void ref(); 01291 private: 01292 QSObject rhs(QSEnv *env) const { 01293 declare(env); 01294 return QSObject(); 01295 } 01296 QSVarBindingListNode *list; 01297 QSVarBindingNode *binding; 01298 }; 01299 01300 class QSVarDefNode : public QSStatementNode 01301 { 01302 public: 01303 QSVarDefNode(int k, QSVarBindingListNode *l) 01304 : kind(k), list(l), attrs(0) { } 01305 void setAttributes(QSAttributeNode *a) { 01306 attrs = a; 01307 } 01308 QSObject execute(QSEnv *); 01309 void check(QSCheckData *); 01310 bool deref(); 01311 void ref(); 01312 private: 01313 int kind; 01314 QSVarBindingListNode *list; 01315 QSAttributeNode *attrs; 01316 }; 01317 01318 class QSPackageNode : public QSStatementNode 01319 { 01320 public: 01321 QSPackageNode(const QString &s, QSStatementNode *b) 01322 : package(s), block(b) { } 01323 QSObject execute(QSEnv *) { 01324 return QSObject(); 01325 } 01326 void check(QSCheckData *); 01327 bool deref(); 01328 void ref(); 01329 private: 01330 QString package; 01331 QSStatementNode *block; 01332 }; 01333 01334 class QSImportNode : public QSStatementNode 01335 { 01336 public: 01337 QSImportNode(const QString &s) : package(s) { } 01338 QSObject execute(QSEnv *); 01339 void check(QSCheckData *); 01340 private: 01341 QString package; 01342 }; 01343 01344 01348 class QSLookupInfo 01349 { 01350 public: 01351 QSLookupInfo(int lvl, const QSMember &mem) 01352 : level(lvl), member(mem) { } 01353 int level; 01354 QSMember member; 01355 }; 01356 01357 class QSNodeList : public QPtrList<QSNode> 01358 { 01359 public: 01360 QSNodeList() : QPtrList<QSNode>() { } 01361 }; 01362 01363 #endif