📄 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 + -