⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 scan.h

📁 内含源代码和编译实验报告
💻 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 + -