?? scan.h
字號:
#ifndef SCAN_H_
#define SCAN_H_
#define BUFLEN 256 //讀源文件時,緩沖區的最大長度。
#define MAXTOKENLEN 40 //讀取到的記號的最大長度。
#define MAXRESERVED 14 //語言保留字的最大數目。
/************枚舉量,列舉所有DFA上的狀態**********************/
enum StateType{START,INASSIGN,INCOMMENT,INNUM,INID,INCHAR,
INNEQ,INAND,INOR, INNLT,INNGT,DONE};
/***************************************************************
**宏定義,完成向鏈表尾添加一對狀態與相應的處理函數
**************************************************************/
#define AddStates(States, fnStates)\
pMobileStates=new CStates(States, fnStates,NULL);\
if(!pMobileStates) throw bad_alloc();\
pMobileStates->m_pNextState=m_pFirstState;\
m_pFirstState=pMobileStates;
/*****************************************************************
**類名: CStates
**功能描述:該類為一個環型鏈表的結點,指示將態與相應的處理函數,
** 該鏈表相當于一個DFA,由程序驅動實現狀態轉換。
*****************************************************************/
struct CStates{
public:
StateType m_EnStates;
void (*fnState)();
CStates *m_pNextState;
CStates(StateType pa_EnStates, void (*paStates)(),CStates *pa_pNextState);
};
/*****************************************************************
**類名: CStates 和 CReserved
**功能描述:這兩個類分別成為兩個數組的元素,CStates用于記錄單字符記號,
** 共11個('='與'=='在讀到第一個字符時不能區分,所以不在此列,
** 同理<(與<=)也不在此列。CReserved用于記錄所有的保留字。共
** 12個,類成員分別為字符型名字和枚舉類型。
**作 者:何林強
**日 期:2002年5月26日
**修 改:
**日 期:
*****************************************************************/
class CSymbols{
public:
char m_chSymbols;
TokenType m_EnSymbols;
};
class CReserved{
public:
char* m_chwords;
TokenType m_Enwords;
};
/*****************************************************************
**類名: CScaner
**功能描述:該類為一個掃描器,完成對源程序的第一遍掃描(詞法分析)。
**作 者:何林強
**日 期:2002年5月25日
**修 改:
**日 期:
*****************************************************************/
class CScaner{
friend class CPraser; //語法分析器作為掃描器的友員,可以方便取一些數據。
private:
static CStates *m_pFirstState;
CStates *m_pMobileStates;
static StateType m_Enstate; //記錄掃描過程中的當前狀態。
static TokenType currentToken; //記錄當前從文件中讀取的記號類型。
static char m_pLineBuf[BUFLEN]; //用于文件讀入一行的緩沖區
static int m_iLinepos; //緩沖區最后一個字符的位置。
static int m_iBufsize; //緩沖區的剩余空間大小。
static CSymbols m_ArraySymbols[10];
static CReserved m_ReservedWords[MAXRESERVED];
static char m_chGetchar; //從文字緩沖區中讀入一個字符。
static int m_isave;
char m_tokenString[MAXTOKENLEN+1];
private:
static char getNextChar(void);
static void ungetNextChar(void);
void OnStates(void);
static void OnStart(void);
static void OnInassigh(void);
static void OnIncomment(void);
static void OnInchar(void);
static void OnInnum(void);
static void OnInid(void);
static void OnInngt(void);
static void OnInneq(void);
static void OnInand(void);
static void OnInor(void);
static void OnInnlt(void);
static void OnDone(void);
inline TokenType reservedLookup(char *ps_pwords);
public:
inline void printToken(TokenType pa_currentToken, char* pa_tokenString);
TokenType getToken(void);
inline char* GettokenString(void){ return m_tokenString;}
CScaner();
~CScaner();
};
#endif
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -