00001 00002 00003 00004 00005 00006
00007
00008 #ifndef PARSENODE_H
00009 #define PARSENODE_H
00010 #include "skStringList.h"
00011 #include "skAlist.h"
00012
00013
00014 static const int s_If=4;
00015 static const int s_While=5;
00016 static const int s_Return=6;
00017 static const int s_Assign=7;
00018 static const int s_Method=8;
00019 static const int s_IdList=9;
00020 static const int s_String=10;
00021 static const int s_Integer=11;
00022 static const int s_Not=12;
00023 static const int s_And=13;
00024 static const int s_Or=14;
00025 static const int s_Less=15;
00026 static const int s_More=16;
00027 static const int s_Equals=17;
00028 static const int s_Plus=18;
00029 static const int s_Minus=19;
00030 static const int s_Subtract=20;
00031 static const int s_Concat=21;
00032 static const int s_Divide=22;
00033 static const int s_Mult=23;
00034 static const int s_Mod=24;
00035 static const int s_Float=25;
00036 static const int s_Character=26;
00037 static const int s_CaseList=27;
00038 static const int s_Case=28;
00039 static const int s_Switch=29;
00040 static const int s_Id=30;
00041 static const int s_NotEquals=31;
00042
00046 class skParseNode {
00047 public:
00048 skParseNode(){
00049 }
00050 virtual ~skParseNode(){
00051 }
00052 virtual int getType(){
00053 return 0;
00054 }
00055 virtual void clear(){
00056 }
00057 private:
00058 skParseNode(const skParseNode& ){
00059 }
00060 skParseNode& operator=(const skParseNode&){
00061 return *this;
00062 }
00063 };
00064 class skParseNodeList : public skTAList<skParseNode>{
00065 };
00066 typedef skTAListIterator<skParseNode> skParseNodeListIterator;
00067 class skStatNode : public skParseNode {
00068 public:
00069 virtual ~skStatNode(){
00070 }
00071 };
00072 class skExprNode : public skParseNode {
00073 public:
00074 skExprNode(){
00075 }
00076 virtual ~skExprNode(){
00077 }
00078 };
00079 typedef skTAList<skStatNode> skStatList;
00080 typedef skTAListIterator<skStatNode> skStatListIterator;
00081
00082 class skStatListNode : public skParseNode {
00083 public:
00084 skStatList m_Stats;
00085 inline ~skStatListNode(){
00086 m_Stats.clearAndDestroy();
00087 }
00088 inline void addStat(skStatNode * stat){
00089 m_Stats.append(stat);
00090 }
00091 inline void clear(){
00092 m_Stats.clear();
00093 }
00094 inline int numStats(){
00095 return m_Stats.entries();
00096 }
00097 };
00098 typedef skTAList<skExprNode> skExprList;
00099 typedef skTAListIterator<skExprNode> skExprListIterator;
00100 class skExprListNode : public skParseNode {
00101 public:
00102 skExprList m_Exprs;
00103 inline ~skExprListNode(){
00104 m_Exprs.clearAndDestroy();
00105 }
00106 inline void addExpr(skExprNode * expr){
00107 m_Exprs.append(expr);
00108 }
00109 inline int numExprs(){
00110 return m_Exprs.entries();;
00111 }
00112 inline void clear(){
00113 m_Exprs.clear();
00114 }
00115 };
00116 class skIdNode : public skExprNode {
00117 public:
00118 skString m_Id;
00119 skExprListNode * m_Exprs;
00120 skExprNode * m_ArrayIndex;
00121 inline skIdNode(skString id,skExprNode * arrayIndex,skExprListNode * exprs){
00122 m_Id=id;
00123 m_Exprs=exprs;
00124 m_ArrayIndex=arrayIndex;
00125 }
00126 inline ~skIdNode(){
00127 delete m_Exprs;
00128 }
00129 inline void clear(){
00130 m_Exprs=0;
00131 m_ArrayIndex=0;
00132 }
00133 inline int getType(){
00134 return s_Id;
00135 }
00136 };
00137 class skIdNodeList : public skTAList<skIdNode>{
00138 };
00139 typedef skTAListIterator<skIdNode> skIdNodeListIterator;
00140 class skIdListNode : public skExprNode {
00141 public:
00142 skIdNodeList m_Ids;
00143 skString m_Attribute;
00144 inline skIdListNode(){
00145 }
00146 inline ~skIdListNode(){
00147 }
00148 inline void addId(skIdNode * node){
00149 m_Ids.append(node);
00150 }
00151 inline void prependId(skIdNode * node){
00152 m_Ids.prepend(node);
00153 }
00154 inline int numIds(){
00155 return m_Ids.entries();
00156 }
00157 inline void clear(){
00158 m_Ids.clear();
00159 }
00160 inline skIdNode * getLastId(){
00161 return m_Ids[m_Ids.entries()-1];
00162 }
00163 inline int getType(){
00164 return s_IdList;
00165 }
00166 };
00167 class skCaseNode : public skParseNode {
00168 public:
00169 skExprNode * m_Expr;
00170 skStatListNode * m_Stats;
00171 inline skCaseNode(skExprNode * expr,skStatListNode * stat){
00172 m_Expr=expr;
00173 m_Stats=stat;
00174 }
00175 inline ~skCaseNode(){
00176 delete m_Expr;
00177 delete m_Stats;
00178 }
00179 inline void clear(){
00180 m_Expr=0;
00181 m_Stats=0;
00182 }
00183 inline int getType(){
00184 return s_Case;
00185 }
00186 };
00187 typedef skTAList<skCaseNode> skCaseList;
00188 typedef skTAListIterator<skCaseNode> skCaseListIterator;
00189 class skCaseListNode : public skParseNode {
00190 public:
00191 skCaseList m_Cases;
00192 inline ~skCaseListNode(){
00193 m_Cases.clearAndDestroy();
00194 }
00195 inline void addCase(skCaseNode * expr){
00196 m_Cases.append(expr);
00197 }
00198 inline int numCases(){
00199 return m_Cases.entries();;
00200 }
00201 inline void clear(){
00202 m_Cases.clear();
00203 }
00204 };
00205 class skSwitchNode : public skStatNode {
00206 public:
00207 skExprNode * m_Expr;
00208 skCaseListNode * m_Cases;
00209 skStatListNode * m_Default;
00210 inline skSwitchNode(skExprNode * expr,skCaseListNode * cases,skStatListNode * defaultStat){
00211 m_Expr=expr;
00212 m_Cases=cases;
00213 m_Default=defaultStat;
00214 }
00215 inline ~skSwitchNode(){
00216 delete m_Expr;
00217 delete m_Cases;
00218 delete m_Default;
00219 }
00220 inline void clear(){
00221 m_Expr=0;
00222 m_Cases=0;
00223 m_Default=0;
00224 }
00225 inline int getType(){
00226 return s_Switch;
00227 }
00228 };
00229 class skIfNode : public skStatNode {
00230 public:
00231 skExprNode * m_Expr;
00232 skStatListNode * m_Stats;
00233 skStatListNode * m_Else;
00234 inline skIfNode(skExprNode * expr,skStatListNode * stat,skStatListNode * elseStat){
00235 m_Expr=expr;
00236 m_Stats=stat;
00237 m_Else=elseStat;
00238 }
00239 inline ~skIfNode(){
00240 delete m_Expr;
00241 delete m_Stats;
00242 delete m_Else;
00243 }
00244 inline void clear(){
00245 m_Expr=0;
00246 m_Stats=0;
00247 m_Else=0;
00248 }
00249 inline int getType(){
00250 return s_If;
00251 }
00252 };
00253 class skReturnNode : public skStatNode {
00254 public:
00255 skExprNode * m_Expr;
00256 inline skReturnNode(skExprNode * expr){
00257 m_Expr=expr;
00258 }
00259 inline ~skReturnNode(){
00260 delete m_Expr;
00261 }
00262 inline void clear(){
00263 m_Expr=0;
00264 }
00265 inline int getType(){
00266 return s_Return;
00267 }
00268 };
00269 class skWhileNode : public skStatNode {
00270 public:
00271 skExprNode * m_Expr;
00272 skStatListNode * m_Stats;
00273 inline skWhileNode(skExprNode * expr,skStatListNode * stat){
00274 m_Expr=expr;
00275 m_Stats=stat;
00276 }
00277 inline ~skWhileNode(){
00278 delete m_Expr;
00279 delete m_Stats;
00280 }
00281 inline void clear(){
00282 m_Expr=0;
00283 m_Stats=0;
00284 }
00285 inline int getType(){
00286 return s_While;
00287 }
00288 };
00289 class skAssignNode : public skStatNode {
00290 public:
00291 skIdListNode * m_Ids;
00292 skExprNode * m_Expr;
00293 inline skAssignNode(skIdListNode * idlist, skString * attribute,skExprNode * expr){
00294 m_Ids=idlist;
00295 if (attribute)
00296 m_Ids->m_Attribute=*attribute;
00297 delete attribute;
00298 m_Expr=expr;
00299 }
00300 inline ~skAssignNode(){
00301 delete m_Ids;
00302 delete m_Expr;
00303 }
00304 inline void clear(){
00305 m_Ids=0;
00306 m_Expr=0;
00307 }
00308 inline int getType(){
00309 return s_Assign;
00310 }
00311 };
00312 class skMethodStatNode : public skStatNode {
00313 public:
00314 skIdListNode * m_Ids;
00315 inline skMethodStatNode(skIdListNode * idlist){
00316 m_Ids=idlist;
00317 }
00318 inline ~skMethodStatNode(){
00319 delete m_Ids;
00320 }
00321 inline void clear(){
00322 m_Ids->clear();
00323 m_Ids=0;
00324 }
00325 inline int getType(){
00326 return s_Method;
00327 }
00328 };
00329 class skLiteralNode : public skExprNode {
00330 public:
00331 int m_Type;
00332 union {
00333 float m_Float;
00334 int m_Int;
00335 char m_Char;
00336 skString * m_String;
00337 };
00338 inline skLiteralNode(skString * s){
00339 m_String=s;
00340 m_Type=s_String;
00341 }
00342 inline skLiteralNode(int i){
00343 m_Int=i;
00344 m_Type=s_Integer;
00345 }
00346 inline skLiteralNode(char i){
00347 m_Char=i;
00348 m_Type=s_Character;
00349 }
00350 inline skLiteralNode(float f){
00351 m_Float=f;
00352 m_Type=s_Float;
00353 }
00354 inline ~skLiteralNode(){
00355 if (m_Type==s_String)
00356 delete m_String;
00357 }
00358 inline void clear(){
00359 m_String=0;
00360 }
00361 inline int getType(){
00362 return m_Type;
00363 }
00364 };
00365 class skOpNode : public skExprNode {
00366 public:
00367 skExprNode * m_Expr1;
00368 skExprNode * m_Expr2;
00369 int m_Type;
00370 inline skOpNode(int type,skExprNode * expr1,skExprNode * expr2){
00371 m_Expr1=expr1;
00372 m_Expr2=expr2;
00373 m_Type=type;
00374 }
00375 virtual ~skOpNode(){
00376 delete m_Expr1;
00377 delete m_Expr2;
00378 }
00379 inline void clear(){
00380 m_Expr1=0;
00381 m_Expr2=0;
00382 }
00383 inline int getType(){
00384 return m_Type;
00385 }
00386 };
00391 class skMethodDefNode : public skParseNode {
00392 public:
00393 skStatListNode * m_Stats;
00394 skIdListNode * m_Params;
00395 inline skMethodDefNode(skStatListNode * stats){
00396 m_Stats=stats;
00397 m_Params=0;
00398 }
00399 inline skMethodDefNode(skIdListNode * params,skStatListNode * stats){
00400 m_Stats=stats;
00401 m_Params=params;
00402 }
00403 inline ~skMethodDefNode(){
00404 delete m_Stats;
00405 delete m_Params;
00406 }
00407 inline void clear(){
00408 m_Stats=0;
00409 m_Params=0;
00410 }
00411 private:
00412 skMethodDefNode(const skMethodDefNode& ){
00413 }
00414 skMethodDefNode& operator=(const skMethodDefNode&){
00415 return *this;
00416 }
00417 };
00418 #endif
00419
00420
00421