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

📄 pl0.h

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