Eneboo - Documentación para desarrolladores
src/qsa/src/engine/qsnodes.h
Ir a la documentación de este archivo.
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
 Todo Clases Namespaces Archivos Funciones Variables 'typedefs' Enumeraciones Valores de enumeraciones Propiedades Amigas 'defines'