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