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

📄 prase.h

📁 内含源代码和编译实验报告
💻 H
字号:
#ifndef PRASE_H_
#define PARSE_H_

/*********************************************************
**宏定义,用扫描器读取源程序中的一个记号。
*********************************************************/
#define READSYMBOL \
		m_Entoken=m_Enforexp;\
		strcpy(m_strIDname, m_pScaner->GettokenString());\
		m_Enforexp=m_pScaner->getToken();
/*******************************************************
**在程序的迭代处理中经常用到建立兄弟链表处理,把它组织成一个宏。
************************************************************/
#define MAKELINK if(temp2!=NULL){ temp2->m_pbrother=temp;\
			                         temp2=temp2->m_pbrother;}\
		         else{first_declare=temp;temp2=temp;}

/****************************************************************
**由于分析法本身的弱点,对于一个表达式结束后,后续符号应该
**是) ,还是; 无法区分。该枚举量用于表识该处表达式应该以何种标识结束。
******************************************************************/
enum Endexp{ESEMI,ERPAREN,ECOMMA};

/*******************************************************
**语法树结点类型: 函数,表达式,参数表,变量声明,语句体
**********************************************************/
enum NodeKind{FuncK, ExpK, ParaK, DeclK, StmtK};

/**********************************************************
**语句体类型的子类型:if,while,for, goto, break;,continue,return
***************************************************************/
enum StmtKind{IfK, WhileK, ForK, GotoK, BreakK, 
								WritebK,WritedK,ContinueK, ReturnK,AddressK,CallK};

/**************************************************************
** 表达式类型的子类型:操作数,常数,标识符。
*************************************************************/
enum ExpKind{OpK,ConstK,IdK};

/*******************************************
**语法树结点。
******************************************/
struct CTreeNode{
	struct CTreeNode	*m_pchild[3];				//指向子结点的指针。
	struct CTreeNode	*m_pfather;					//指向双亲结点,为实现break,continue而加。
	struct CTreeNode	*m_pbrother;				//指向兄弟结点的指点
	NodeKind			m_Ennodekind;				//结点类型
	TokenType			m_EnTypevalue;
	char				m_strIDname[MAXTOKENLEN+1];
	char				m_strScope[MAXTOKENLEN+1];	//记录结点的作用域范围。
	int					m_ilineno;
	union{
		StmtKind	m_EnStmtKind;
		ExpKind		m_EnExpKind;
	}kind;											//结点类型的子类型。
};

/*****************************************************************
**类名:	CPraser
**功能描述:这是一个完整的语法分析器,通过扫描器的辅助,建立程序的
**          的完整语法树。
**作  者:何林强
**日  期:2002年5月28日
**修  改:
**日  期:
*****************************************************************/
class CPraser{
private:
	Endexp				m_EnEndexp;
	//表式的处理从expresstion()开始,要求向前读一个字符,但是对于以ID开始的表达
	//式,必须读到第二个才能知道是表达式,还是函数调用,还是地址标号,该标志用于
	//恢复表达式处理时只向前读一个。
	TokenType			m_Enforexp;
	int					m_indentno;			//找印语法树时,用于控制缩进格式。
	CScaner				*m_pScaner;
private:									//建语法树时的几个辅助变量。
	TokenType			m_Entoken;
	TokenType			m_Enfirst;
	TokenType			m_EnSecond;
	TokenType			m_Enthird;
	char				m_strIDname[MAXTOKENLEN+1];
	char				m_strScope[MAXTOKENLEN+1];//记录结点所属作用域范围。
private:
	void program(void);
	CTreeNode *declaration_list(void);
	CTreeNode *declaration(void);
	CTreeNode *compound_stmt(void);
	CTreeNode *params(void);
	CTreeNode *fun_declaration(void);
	CTreeNode *var_declaration(void);
	CTreeNode *local_declarations(void);
	CTreeNode *selection_stmt(void);
	CTreeNode *expression(void);
	CTreeNode *write_stmt(void);
	CTreeNode *iteration_stmt(void);
	CTreeNode *iteration2_stmt(void);
	CTreeNode *jump_stmt(void);
	CTreeNode *break_stmt(void);
	CTreeNode *continue_stmt(void);
	CTreeNode *subcompound_stmt(void);
	CTreeNode *address(void);
	CTreeNode *call_func(void);
	CTreeNode *args(void);
	CTreeNode *logic1_expression(void);
	CTreeNode *return_stmt(void);
	CTreeNode *logic2_expression(void);
	CTreeNode *simple_expression(void);
	CTreeNode *add_expression(void);
	CTreeNode *term(void);
	CTreeNode *logic3_expression(void);
	CTreeNode *factor(void);
/*****/
	inline CTreeNode *newNode(NodeKind pa_kind);
	inline CTreeNode *newStmtNode(StmtKind pa_subkind);
	inline CTreeNode *newExpNode(ExpKind pa_subkind);
	inline void match(TokenType pa_expcted,string pa_errorifno);
	void Delete_program(CTreeNode *t);
public:
	static CTreeNode	*m_program;
	CPraser();
	~CPraser();
	void PrintTree(CTreeNode *pa_Ctree);
};

#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -