📄 编译大作业.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 + -