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

📄 编译大作业.h

📁 这是一个用c语言编写的编译大作业
💻 H
字号:
//33060509 黄昭锐 编译大作业
//声明部分
#define NROW 16 //关键字个数
#define TXMAX 100 //名字表容量
#define NMAX 14 //number的最大位数
#define AL 10 //符号的最大长度
#define AMAX 2047 //地址上界
#define LEVMAX 4 //最大允许过程嵌套声明层数[0,levmax]
#define CXMAX 200 //最多的虚拟机代码数
#define STACKSIZE 500 //堆栈空间

//符号
enum symbol{nul, //空     
            ident, number, //类型
			plus, minus, times, slash, oddsym, eql, neq, lss, leq, gtr, geq, lparen,
	        rparen, comma, semicolon, period, becomes, //符号
	        beginsym, endsym, ifsym, thensym, whilesym, writesym, readsym, dosym, //关键字   
			callsym, constsym, varsym, procsym,	elsesym};
#define symnum 33 //符号数目
//名字表中的类型
enum object{constant,variable,procedur};
//虚拟机代码
enum fct{lit,	opr,	lod,	sto,	cal,	inte,	jmp,	jpc};
#define fctnum	8 //虚拟机代码数目
//虚拟机代码结构
struct instruction
{
	enum fct f; //虚拟机代码指令
	int l; //引用层与声明层的层次差
	int a; //具体参考解释程序
};
FILE *fas; //输出名字表 
FILE *fa1; //输出源文件及各行对应首地址
FILE *fa2; //输出结果
bool listswitch; //显示虚拟机代码的标志位
bool tableswitch; //显示名字表的标志位
char ch; //获取字符
enum symbol sym; //当前符号
char id[AL+1]; //记录当前标示符
int num; //当前数值
int cc,ll; //getch使用计数器
int cx; //虚拟机代码
char line[81]; //行缓冲区
char a[AL+1]; //临时符号
struct instruction code[CXMAX]; //存放虚拟机代码数组
char word[NROW][AL]; //保留字
enum symbol wsym[NROW]; //保留字对应符号值
enum symbol ssym[256]; //字符符号值
char mnemonic[fctnum][5]; //虚拟机代码指令名称
bool declbegsys[symnum]; //声明开始符号集合
bool statbegsys[symnum]; //语句开始符号集合
bool facbegsys[symnum]; //因子开始符号集合
//名字表结构
struct tablestruct
{
	char name[AL]; //名字
	enum object kind; //类型
	int val; //数值
	int level; //所出层
	int adr; //地址 
	int size; //分配数据区空间
};
struct tablestruct table[TXMAX]; //名字表
FILE *fin; //输入文件指针 
FILE *fout; //输出文件指针
char fname[AL]; //记录源文件的地址
int err; //错误计数器
//各函数宏定义
#define getsymdo					if(-1==getsym())return -1
#define getchdo						if(-1==getch())return -1
#define testdo(a,b,c)				if(-1==test(a,b,c))return -1
#define gendo(a,b,c)				if(-1==gen(a,b,c))return -1
#define expressiondo(a,b,c)			if(-1==expression(a,b,c))return -1
#define factordo(a,b,c)				if(-1==factor(a,b,c))return -1
#define termdo(a,b,c)				if(-1==term(a,b,c))return -1
#define conditiondo(a,b,c)			if(-1==condition(a,b,c))return -1
#define statementdo(a,b,c)			if(-1==statement(a,b,c))return -1
#define constdeclarationdo(a,b,c)	if(-1==constdeclaration(a,b,c))return -1
#define vardeclarationdo(a,b,c)		if(-1==vardeclaration(a,b,c))return -1
void error(int n); //出错程序
int getsym(); //读符号
int getch(); //读字符
void init(); //初始化
int gen(enum fct x,int y,int z); //生成P代码
int test(bool *s1,bool *s2,int n); //测试后续符号
int inset(int e,bool *s); //集合操作
int addset(bool *sr,bool *s1,bool *s2,int n);
int subset(bool *sr,bool *s1,bool *s2,int n);
int mulset(bool *sr,bool *s1,bool *s2,int n);
int block(int lev,int tx,bool *fsys); //分程序
void interpret(); //解释程序
int factor(bool *fsys,int *ptx,int lev); //因子
int term(bool *fsys,int *ptx,int lev); //项
int condition(bool *fsys,int *ptx,int lev); //条件
int expression(bool *fsys,int *ptx,int lev); //表达式
int statement(bool *fsys,int *ptx,int lev); //语句
void listcode(int cx0); //输出目标代码清单
int vardeclaration(int *ptx,int lev,int *pdx); //变量声明
int constdeclaration(int *ptx,int lev,int *pdx); //常量声明
int position(char *idt,int tx); //名字定位
void enter(enum object k,int *ptx,int lev,int *pdx); //填入名字表
int base(int l,int *s,int b); //求基址

⌨️ 快捷键说明

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