📄 pl0.h
字号:
#ifndef pl0_h
#define pl0_h
/*typedef enum{
false,
true
}bool;*/ //C++中已定义的数据类型
#define norw 13 //关键字个数
#define txmax 100 //名字表容量
#define nmax 14 //number的最大位数
#define al 10 //符号的最大长度
#define amax 2047 //地址上界
#define levmax 3 //最大允许过程嵌套声明层数[0,levmax]
#define cxmax 200 //最多的虚拟机代码数
#define symnum 32
#define fctnum 8
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,
};
enum object{ //名字表中的类型
constant,
variable,
procedur,
array,
};
enum fct{ //虚拟机代码
lit, opr, lod,
sto, cal, inte,
jmp, jpc,
};
struct instruction //虚拟机代码结构
{
enum fct f; //虚拟机代码指令
int l; //引用层与声明层的层次差
int a; //根据f的不同而不同
};
FILE * fas; //输出名字表
FILE * fa; //输出虚拟机代码
FILE * fa1; //输出源文件及其各行对应的首地址
FILE * fa2; //输出结果
bool listswitch; //显示虚拟机代码与否
bool tableswitch; //显示名字表与否
char ch; //获取字符的缓冲区,getch使用
enum symbol sym; //当前的符号
char id[al+1]; //当前的ident,多出的一个字节用于存放0
int num; //当前的number
int cc, ll; //getch使用的计数器,cc表示当前字符(ch)的位置
int cx; //虚拟机代码指针,取值范围[0,cxmax-1]
char line[81]; //读取行缓冲区
char a[al+1]; //临时符号,多出的一个字节用于存放0
struct instruction code[cxmax]; //存放虚拟机代码的数组
enum symbol wsym[norw]; //保留字对应的符号值
enum symbol ssym[256]; //单字符的符号值
char mnemonic[fctnum][5]; //虚拟机代码指令名称
bool declbegsys[symnum]; //表示声明开始的符号集合
bool statbegsys[symnum]; //表示语句开始的符号集合
bool facbegsys[symnum]; //表示因子开始的符号集合
char word[norw][al]; //保留字
struct tablestruct //名字表结构
{
char name[al]; //名字
enum object kind; //类型:const,var,array or procedure
int val; //数值,仅const使用
int level; //所处层,仅const不使用
int adr; //地址,仅const不使用
int size; //需要分配的数据区空间,仅procedure使用
};
struct tablestruct table[txmax]; //名字表
FILE *fin;
FILE *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 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
int addset( bool *sr, bool *s1, bool *s2, int n );
int base( int l, int *s, int b );
int block( int lev, int tx, bool *fsys );
int condition( bool *fsys, int *ptx, int lev );
int constdeclaration( int *ptx, int lev, int *pdx );
void enter( enum object k, int *ptx, int lev, int *pdx );
void error(int n);
int expression( bool *fsys, int *ptx, int lev );
int factor( bool *fsys, int *ptx, int lev );
int gen( enum fct x, int y, int z );
int getch();
int getsym();
void init();
int inset( int e, bool *s );
void interpret();
void listcode( int cx0 );
int mulset( bool *sr, bool *s1, bool *s2, int n );
int position( char *idt, int tx );
int statement( bool *fsys, int *ptx, int lev );
int subset( bool *sr, bool *s1, bool *s2, int n );
int test( bool *s1, bool *s2, int n );
int term( bool *fsys, int *ptx, int lev );
int vardeclaration( int *ptx, int lev, int *pdx );
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -