?? tokenoper_h.h
字號:
//---------------------------------------------------------------------------
// TokenOper_H.h
//---------------------------------------------------------------------------
#ifndef TokenOper_H.h // 防止被重復引用
#define TokenOper_H.h
//---------------------------------------------------------------------------
#include "Jstring_H.h"
#include "Tokenfield_H.h"
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
class TokenOper : public JObject
{ public:
// 把pt所指向的節點刪除。
static void DelTokenNode(Tokenfield* &pt);
// 把pt->next所指向的節點刪除。
static void DelnextTokenNode(Tokenfield* pt);
// 把以pt所指的結點開頭的Token表刪除。
static void DelTokenList(Tokenfield* &pt);
// 把pt所指的下層Expression結點刪除。
static void DelExpTkn(Tokenfield* pt);
// 把pt所指的OPerand表達式(#+Expr)刪除。
static void DelOPNDTkn(Tokenfield* pt);
// 把以pt所指的結點開頭的Operand表(必須全都是Operand)刪除。
static void DelOPNDList(Tokenfield* pt);
// 判斷pt->next是否操作數,是則把它轉為OPadToken, 即令pt->next=OPadToken.
static ERR OPadToPack(Tokenfield* pt);
// 判斷pt->next是否表達式,是則把它歸約為ExpToken, 即令pt->next=ExpToken.
static ERR ExpToPack(Tokenfield* pt);
// 該函數返回 "p->next" 的操作數個數(可以是零), 各個操作數以','作為分隔.
static int8 CalOPadNum(Tokenfield* pt, ERR &err);
// 返回 "p->next" 的表達式個數, 各個表達式以','作為分隔.
// 這里的表達式包括數值表達式, 字符, 字符串.
static int8 IsCExpList(Tokenfield* pt, ERR &err);
// 返回 "p->next" 的數值表達式個數, 各個表達式以','作為分隔.
static int8 CalExpNum(Tokenfield* pt, ERR &err);
// 判斷p指向的結點是否為一個表達式,返回表達式長度len. 如果正確, len>0.
static int8 FetchOpadLen(Tokenfield* pt, ERR &err);
// 判斷p指向的結點是否為一個表達式,返回表達式長度len. 如果正確, len>0.
static int8u FetchExpLen(Tokenfield* &p,ERR &err);
// 把pt->next所指的Token為起點, 長度為len的一個表達式封裝為表達式包(ExpToken).
static void ExpToToken(Tokenfield* pt, int8u len);
// 把pt->next所指的Token為起點的帶@,#,/,等的表達式封裝為操作數包,成為OPADtoken.
static void OPadToToken(Tokenfield* pt, int8u len);
// 計算pt->next所指的Token為起點的WordsToken串的長度。pt不能為空。注意pt帶值返回。
static int8 CalWordNum(Tokenfield* &pt, ERR &err);
// 把pt->next所指的Token為起點的長度為len的WordList封裝為WordList。
static void WordListToToken(Tokenfield* pt, int8u len);
// 把pt->next所指的Token為起點, 長度為len的一個表達式封裝為WordList.
// 該WordList用()括住。返回WordList長度。
static int8 CalWordNumAndPack(Tokenfield* &pt, ERR &err);
// pt + ',' + word word不能是保留字或其他符號。
static ERR ArgvWordParser(Tokenfield* pt);
// pt + ',' + word [ = Value ] word不能是保留字或其他符號。
static ERR ArgvWordEvluParser(Tokenfield* pt);
// 在一個Token鏈表中尋找含有指定名字的Token。
static Tokenfield* SearchToken(Tokenfield* head, const Jstring& fname);
// 檢查從lpt指向的Token鏈開始到pt之前的結點的Name是否與pt所指向的Name相同。
static bool HaveArguName(Tokenfield* lpt, Tokenfield* pt);
// --------------------
static void showTknList(Tokenfield* pt);
}; // end TokenOper
//---------------------------------------------------------------------------
/****************************************************************************
* 下面是實現部分 *
*****************************************************************************/
//---------------------------------------------------------------------------
// 把pt所指向的節點刪除。pt移到pt->next。pt本身改變。(吐故納新!)
//---------------------------------------------------------------------------
inline void TokenOper::DelTokenNode(Tokenfield* &pt)
{ if(pt != NULL)
{ register Tokenfield* temp = pt; pt = pt->next; delete temp; } // endif
// 如果pt==NULL,什么都不做。
} // end DelTokenNode
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// 把pt->next所指向的節點刪除。
//---------------------------------------------------------------------------
inline void TokenOper::DelnextTokenNode(Tokenfield* pt)
{ if(pt != NULL) // 如果所要刪除的節點不為空
{ DelTokenNode(pt->next); } // endif
// 所要刪除的節點竟然為空!
} // end DelnextTokenNode
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// 把pt所指的下層Expression結點刪除(只刪一個), 并置pt->ExpPt = NULL。
// 注意,pt->Token == ExpresnKn. pt 不能為空!
//---------------------------------------------------------------------------
inline void TokenOper::DelExpTkn(Tokenfield* pt)
{ DelTokenList(pt->ExpPt);
} // end DelExpTkn
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
#endif
//---------------------------------------------------------------------------
// Written by JamesyFront. ZLGmcu Dev.Co.Ltd. 2002.
//---------------------------------------------------------------------------
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -