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