PL0源代码(C语言版).doc
《PL0源代码(C语言版).doc》由会员分享,可在线阅读,更多相关《PL0源代码(C语言版).doc(33页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精选优质文档-倾情为你奉上 /*PL/0 编译系统C版本头文件 pl0.h*/# define norw 13 /a number of reserved word /*关键字个数*/ # define txmax 100 /length of identifier table /*名字表容量*/# define nmax 14 /max number of digits in numbers /*number的最大位数*/# define al 10 /length of identifier /*符号的最大长度*/# define amax 2047 /maximum address /*
2、地址上界*/# define levmax 3 /max depth of block nesting /*最大允许过程嵌套声明层数0,lexmax*/# define cxmax 200 /size of code array /*最多的虚拟机代码数*/*符号*/enum symbol nul, ident, number, plus, minus, times, slash, oddsym, eql, neq, /slash斜线 lss, leq, gtr, geq, lparen, /leq :less than or equal to; gtr: great than;lparen:l
3、eft parenthesisrparen, comma, semicolon,period, becomes,/comma逗号 semicolon分号 period句号 becomes赋值号 beginsym, endsym, ifsym, thensym, whilesym,writesym, readsym, dosym, callsym, constsym,varsym, procsym,;#define symnum 32/*-*/enum object /object为三种标识符的类型 constant, variable, procedur,;/*-*/enum fct /fct
4、类型分别标识类PCODE的各条指令lit, opr, lod, sto, cal, inte, jmp, jpc, /书本P23 ;#define fctnum 8/*-*/struct instruction /指令 enum fct f; /功能码 int l; /层次差 int a; /P23;FILE * fas; /输出名字表 FILE * fa; /输出虚拟机代码 FILE * fa1; /输出源文件及其各行对应的首地址 FILE * fa2; /输出结果 bool tableswitch; /显示名字表与否 bool listswitch; /显示虚拟机代码与否 char ch;
5、 /获取字符的缓冲区,getch使用 enum symbol sym; /当前符号 char idal+1; /当前ident,多出一个字节用于存放0 int num; /当前number int cc,ll; /getch使用的计数器,cc表示当前字符(ch)的位置 int cx; /虚拟机代码指针,取值范围0,cxmax-1char line81; /读取行缓冲区 char aal+1; /临时符号,多出的一个字节用于存放0 struct instruction codecxmax; /存放虚拟机代码的数组 char wordnorwal; /保留字enum symbol wsymnorw
6、; /保留字对应的符号值 enum symbol ssym256; /单字符的符号值 char mnemonicfctnum5; /虚拟机代码指令名称 bool declbegsyssymnum; /表示声明开始的符号集合 ,declaring begin symbol setbool statbegsyssymnum; /表示语句开始的符号集 , statementbool facbegsyssymnum; /表示因子开始的符号集合 ,factor/*-*/struct tablestruct char nameal; /*名字*/ enum object kind; /*类型:const,
7、var,array or procedure*/ int val; /*数值,仅const使用*/ int level; /*所处层,仅const不使用*/ int adr; /*地址,仅const不使用*/ int size; /*需要分配的数据区空间,仅procedure使用*/;struct tablestruct tabletxmax; /*名字表*/FILE * fin; /fin文本文件用于指向输入的源程序文件FILE* fout; /fout文本文件用于指向输出的文件char fnameal;int err; /*错误计数器*/*当函数中会发生fatal error时,返回1告知
8、调用它的函数,最终退出程序*/#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#
9、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
10、 -1void 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,boo
11、l* 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
12、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);/A.2 C 版 本/*编译和运行环境:*1Visual C+6.0,VisualC+.NET and Visual C+.NET 2003*WinNT, Win 200, WinXP and Win2003 *2 gcc version 3.3.2 (Red Hat Linux 3.
13、3.2-1)*Redhat Fedora core 1*Intel 32 platform*使用方法:*运行后输入PL/0 源程序文件名*回答是否输出虚拟机代码*回答是否输出名字表*fa.tmp 输出虚拟机代码*fa1.tmp 输出源文件及其各行对应的首地址*fa2.tmp 输出结果 *fas.tmp 输出名字表*/#include#includepl0.h#includestring.h/*解释执行时使用的栈*/#define stacksize 500int main()bool nxtlevsymnum;printf(Input pl/0 file ?);scanf(%s,fname);
14、 /*输入文件名*/fin=fopen(fname,r); /返回值:文件顺利打开后,指向该流的文件指针就会被返回。如果文件打开失败则返回NULL,并把错误代码存在errno 中if(fin)printf(List object code ?(Y/N); /*是否输出虚拟机代码*/scanf(%s,fname);listswitch=(fname0=y|fname0=Y); printf(List symbol table ? (Y/N); /*是否输出名字表*/scanf(%s,fname);tableswitch=(fname0=y|fname0=Y);fa1=fopen(fa1.tmp,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- PL0 源代码 语言版
限制150内