cgen.h

来自「内含源代码和编译实验报告」· C头文件 代码 · 共 66 行

H
66
字号
#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 + =
减小字号Ctrl + -
显示快捷键?