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

📄 pl0.h

📁 pl0编译器,包括词法分析,语法语义分析,以及解释执行
💻 H
字号:
#define NKEY 13                   //关键字个数
#define TXMAX 100                 //名字表最大长度
#define NMAX 14                   //number的最大位数
#define WMAX 10                   //符号最大长度
#define AMAX 2047                 //数的上界
#define LVMAX 3                   //最多嵌套层数
#define CXMAX 1000                //虚拟机代码表最大长度
#define SYMNUM 32                 //符号个数
#define FCTNUM 8                  //虚拟机指令个数
#define STACKSIZE 500            //解释执行的栈
enum sbl{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};
enum obj{constant,variable,procedure};
enum fct{lit,opr,lod,sto,cal,inte,jmp,jpc};
struct ins
{
	enum fct f;                  //虚拟机指令
	int l;                       //引用层与声明层层次差
	int a;                       //随f不同而不同
};
struct ins code[CXMAX];          //虚拟机代码表
struct table
{
	char name[WMAX];             //名
	enum obj kind;               //类型
	int val;                     //仅常数用的数值
	int lev;                     //所在层,仅常数不用
	int adr;                     //地址,仅常数不用
	int size;                    //需分配的数据区空间,仅过程使用
};
struct table tb[TXMAX];
FILE *fa;                        //输出虚拟机代码
FILE *fa1;                       //输出源文件及各行对应首地址
FILE *fa2;                       //输出结果
FILE *fin;
FILE *fout;
char fname[WMAX];
int err;                         //错误计数器
char ch;
enum sbl sym;                    //当前符号
char id[WMAX];                   //当前ident,多一字节存0
char tmp[WMAX];                  //临时符号,多一字节存0
int num;                         //当前number
int cc,ll;                       //取字符计数器,ll是取一行的字符数
int cx;                          //虚拟机代码指针,取值[0,CXMAX-1]
char line[81];                   //读一行的缓冲区
char word[NKEY][WMAX];           //关键字
enum sbl wsym[NKEY];             //关键字对应的符号值
enum sbl ssym[256];              //单字符对应的符号值
char mc[FCTNUM][5];              //虚拟机代码名称
int dcbsys[SYMNUM];              //声明开始符号集的表示
int stbsys[SYMNUM];              //语句开始符号集的表示
int fcbsys[SYMNUM];              //因子开始符号集的表示
char errinfo[][40]={"数的位数过多",
					"过程嵌套最多允许三层",
					"常量声明漏了分号",
					"变量声明漏了分号",
					"过程声明漏分号",
					"procedure后应为标识符",
					"子过程结尾漏了分号",
					"数越界",
					"过程说明后应为语句开始符或过程定义符",
					"应为语句开始符",
					"程序体内语句部分的后跟符不正确",
					"常量说明中“=”写成了“:=”",
					"常量说明中“=”后应为数字",
					"常量说明中标识符后应为“=”",
					"const后应为标识符",
					"var后应为标识符",
					"标识符未声明",
					"赋值语句中赋值号左部标识符应为变量",
					"赋值语句缺少赋值号",
					"read后应为左括号",
					"read()中变量未声明",
					"read()中应为变量",
					"read最后应为右括号",
					"write最后应为右括号",
					"write后应为左括号",
					"call中过程未声明",
					"call后应为过程名",
					"call后应为标识符",
					"if语句缺少then",				  
					"复合语句中语句之间缺少分号",
					"复合语句缺少end",
					"while语句缺少do",
					"语句后符号不正确",
					"因子开始符不正确",
					"因子中标识符未声明",
					"因子中表示符不能为过程",
					"因子缺少右括号",
					"因子后有非法符号",
					"应为关系运算符",
					"程序结尾缺少句号"};

void error(int n);                           //报错
int getsym();                                //取单词
int getch();                                 //取字符,兼输出源代码
void init();                                 //初始化
int gen(enum fct x,int y,int z);             //生成虚拟机代码
int test(int *s1,int *s2,int n);             //作为布尔值使用,下同
int inset(int e,int *s);                     //求s[e]
int addset(int *sr,int *s1,int *s2,int n);   //求并集
int subset(int *sr,int *s1,int *s2,int n);   //求差集
int mulset(int *sr,int *s1,int *s2,int n);   //求交集
int mb(int lev,int tx,int *s);               //语法语义及代码生成
void itp();                                  //解释执行程序
int fac(int *ptx,int *s,int lev);            //因子处理
int term(int *ptx,int *s,int lev);           //项处理
int con(int *ptx,int *s,int lev);            //条件处理
int exp(int *ptx,int *s,int lev);            //表达式处理
int stat(int *ptx,int *s,int lev);           //语句处理
int vardc(int *ptx,int lev,int *pdx);        //变量声明
int constdc(int *ptx,int lev,int *pdx);      //常量声明
int extable(char *idt,int tx);               //查询名字表,检查变量定义否
void record(enum obj k,int *ptx,int lv,int *pdx);  //在名字表中记录新数据
int base(int l,int *x,int b);                 

⌨️ 快捷键说明

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