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

📄 treetodemi.h

📁 上课时老师用过的SNL编译器
💻 H
字号:
// treetodemi.h: interface for the Ctreetodemi class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_TREETODEMI_H__3D7DF46B_F429_486E_8A5C_6400B9B4B5AB__INCLUDED_)
#define AFX_TREETODEMI_H__3D7DF46B_F429_486E_8A5C_6400B9B4B5AB__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include "global.h"


/* 程序指令指示器pc为7,指向当前指令存储位置		*
 * 程序指示器将使用寄存器数组中的第8个寄存器	*/
#define  pc 7	


/* 过程活动记录头指针指示器sp指向过程活动记录的头地址指针 */
#define  sp 6

/* 过程活动记录尾指针指示器top指向过程活动记录的尾地址指针 */
#define  top  5 

/* 过程活动记录sp到display表距离指示器displayOff */
#define  displayOff  4

/* 存储指示器mp指向用于临时变量存储的数据存储器顶端 */
#define  mp 3

#define  ac2 2      /* 第三累加器 */

#define  ac1 1		/* 第二累加器 */

#define  ac 0		/* 第一累加器 */



class Ctreetodemi : public Cglobal  
{
public:
	Ctreetodemi();
	virtual ~Ctreetodemi();

/**********变量****************/

int tmpOffset;           /*临时变量区的偏移*/

/* TM指令当前生成代码写入地址 */
 int emitLoc ;

/* 用于在函数emitSkip,emitBackup,emitRestore	*
 * 中作为当前最高生成代码写入地址,初始为0		*/
 int highEmitLoc ;

/***************实用函数*********************/

 void FindAdd(TreeNode * t);
 
 void findSp(int varlevel);

/****** 代码产生功能函数 *********/

/* 该函数在代码文件code中写入指令的注释行,注释内容由c指定 */
void emitComment( char * c );

/************************************************************
 * 该函数产生一条只用寄存器操作数的TM指令,寄存器地址模式	*
 * op 为操作码												*
 * r  为目标寄存器											*
 * s  为第一寄存器											*
 * t  为第二寄存器											*
 * c  为要写入代码文件code的注释内容,						*
 *    当代码生成追踪标志TraceCode为TRUE时写入目标代码文件	*
 ************************************************************/
void emitRO( char *op, int r, int s, int t, char *c);

/************************************************************
 * 该函数产生一条寄存器-内存操作数的TM指令					*
 * op 为操作码												*
 * r  为目标寄存器											*
 * d  为偏移值												*
 * s  为基地址寄存器										*
 * c  为要写入代码文件code的注释内容,						*
 *    当代码生成追踪标志TraceCode为TRUE时写入目标代码文件	*
 ************************************************************/
void emitRM( char * op, int r, int d, int s, char *c);

/* 该函数略过参数howMany指定数量代码指令行,函数返回当前代码指令写入地址 */
int emitSkip( int howMany);

/* 该函数退回到由参数loc指明的上一个已经略过的代码指令写入地址 */
void emitBackup( int loc);

/* 该函数把当前代码写入地址恢复为当前未写入代码指令的最高地址 */
void emitRestore(void);

/************************************************************
 * 该函数在产生一条寄存器-内存操作数TM指令时,				*
 * 将一个绝对地址参数转换为pc相对地址参数					*
 * op 为操作码												*
 * r  为目标寄存器											*
 * a  为绝对存储器地址										*
 * c  为要写入代码文件code的注释内容,						*
 *    当追踪标志TraceCode为TRUE时写入						*
 ************************************************************/
void emitRM_Abs( char *op, int r, int a, char * c);



/***************语法树生成目标代码函数******************/


/********************************************************
 * 该函数遍历处理语法树生成目标代码并写入目标代码文件	*
 * 第二个参数codefile是目标代码文件名					*
 ********************************************************/
void codeGen(TreeNode * syntaxTree, char * codefile,int mainOff);

void genProc(TreeNode * t);

void genStmt(TreeNode * t);

void genExp(TreeNode * t);

void cGen( TreeNode * tree);


};

#endif // !defined(AFX_TREETODEMI_H__3D7DF46B_F429_486E_8A5C_6400B9B4B5AB__INCLUDED_)

⌨️ 快捷键说明

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