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

📄 pl0.h

📁 plo 源碼 在基礎上增加了 switch:case语句 和 while語句 輸入文件為Pascl
💻 H
字号:
#ifndef _pl0_h_
#define _pl0_h_

#define norw 13       //关键字个数
#define txmax 100     //名字表容量
#define nmax 14       //number最大位数
#define al 10         //符号的最大长度
#define amax 2047     //地址上界
#define levmax 3      //最大允许过程嵌套声明层数
#define cxmax 200     //最多的虚拟机代码数
/*符号*/
enum symobl{
	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};
#define symnum 32
/*名字表中的类型*/
enum object{constant,variable,procedure,array};
/* 虚拟机代码*/
enum fct{lit,opr,lod,sto,cal,inte,jmp,jpc};
#define fctnum 8
/* 虚拟机代码结构*/
struct instruction
{
	enum fct f;   //虚拟机代码指令
	int l;        //引用层与声明层的层次差
	int a;        //根据f的不同而不同
};
FILE *fas;     //名字表
FILE *fa;      //虚拟机代码
FILE *fa1;     //源文件及其各行对应的首地址
FILE *fa2;     //输出结果
bool listswitch;   //显示虚拟机代码与否
bool tableswitch;  //显示名字表与否
char ch;           //获取字符的缓冲区
enum symbol sym;   //当前符号
char id[al+1];     //当前id
int num;           //当前number
int cc,ll;         //getch使用的计数器,cc表示当前字符的位置
int cx;            //虚拟机代码指针
char line[81];     //行缓冲区
char a[al+1];      //临时符号
struct instruction code[cxmax]; //存放虚拟机代码的数组
char word[norw][al];            //保留字
enum symbol wsym[norw];         //保留字对应的符号值
enum symbol ssym[256];          //单字符的符号值
char mnemonic[fctnum][5];       //虚拟机代码指令名称
bool declbegsys[symnum];        //声明的开始符号集
bool statbegsys[symnum];        //语句的开始符号集
bool facbegsys[symnum];         //因子的开始符号集
char errors[33][100];           //错误信息
/*符号表结构*/
struct structtable
{
	char name[al];     //名字
	enum object kind;  //类型
	int val;           //数值,仅const使用
	int level;         //所处层,仅const不使用
	int adr;           //地址,仅const不使用
	int size;          //需要分配的数据区空间,仅procedure使用
};
struct structtable table[txmax];   //符号表
FILE *fin,*fout;
char fname[al];
int err;
/*当函数中发生fatal error时,返回-1告诉调用它的函数,退出程序*/
#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 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
#define factordo(a,b,c)           if(-1==factor(a,b,c))return -1

void error(int n);
int getsym();
int getch();
void init();
int gen(enum fct x,int y,int z);
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);

#endif

⌨️ 快捷键说明

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