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

📄 cgen.h

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

/**********************************************************
** 宏定义,从栈中弹出两个操作数,用于双目操作符的运算
**********************************************************/
#define READTWO\
				AllGlobals.code.write("\npop\t",5);\
				AllGlobals.code.write(register2,2);\
				AllGlobals.code.write("\npop\t",5);\
				AllGlobals.code.write(register1,2);

/************************************************************
**  宏定义,用于判断while,for,if里面的条件表达式式
*************************************************************/
#define JUDGE_CONDITION(the_brother)\
		if(strcmp(pa_Stmt->m_pchild[0]##the_brother##m_strIDname,">=")==0 ||\
			strcmp(pa_Stmt->m_pchild[0]##the_brother##m_strIDname,"<=")==0){\
			AllGlobals.code.write("\npop\tax",7);\
			AllGlobals.code.write("\njle\t",5);}\
		else if(strcmp(pa_Stmt->m_pchild[0]##the_brother##m_strIDname,">")==0 ||\
					strcmp(pa_Stmt->m_pchild[0]##the_brother##m_strIDname,"<")==0){\
			AllGlobals.code.write("\npop\tax",7);\
			AllGlobals.code.write("\njl\t",4);}\
		else if(strcmp(pa_Stmt->m_pchild[0]##the_brother##m_strIDname,"==")==0){\
			AllGlobals.code.write("\npop\tax",7);\
			AllGlobals.code.write("\ncmp\tax,0",9);\
			AllGlobals.code.write("\nje\t",4);\
		}\
		else{\
			AllGlobals.code.write("\npop\tax",7);\
			AllGlobals.code.write("\ncmp\tax,0",9);\
			AllGlobals.code.write("\njne\t",5);\
		}

/*****************************************************************
**类名:	Cgenerator
**功能描述:这是一个完整的代码生成器,根据符号表与语法树生成实际的
**          8088/8086汇编代码。

*****************************************************************/
class Cgenerator{
private:
	static int			m_iunique;				//辅助产生唯一的符号地址
	static Canalyzer*	m_panalyzer;
	char				register1[3];			//记录寄存器的名称
	char				register2[3];
private:
	void Data_seg(void);
	void codeGen(void);
	void generate_data(const char *pa_suffix,CTreeNode* pa_Declare);
	void Stack_seg(void);
	void Code_seg(void);
	void generate_func(CTreeNode* pa_Func);
	void generate_params(CTreeNode* pa_param);
	void generate_stmt(CTreeNode* pa_commpound);
	void generator_exp(CTreeNode* pa_exp);
	void generator_substmt(CTreeNode* pa_Stmt);
	void generator_unique_addr(CTreeNode *pa_name);
	void generate_show_func(void);
public:
	Cgenerator();
	~Cgenerator();
};

#endif

⌨️ 快捷键说明

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