PL0源代码(C语言版)(24页).doc
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《PL0源代码(C语言版)(24页).doc》由会员分享,可在线阅读,更多相关《PL0源代码(C语言版)(24页).doc(24页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、-PL0源代码(C语言版)-第 24 页 /*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 add
2、ress /*地址上界*/# 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;l
3、paren:left parenthesisrparen, comma, semicolon,period, becomes,/comma逗号 semicolon分号 period句号 becomes赋值号 beginsym, endsym, ifsym, thensym, whilesym,writesym, readsym, dosym, callsym, constsym,varsym, procsym,#define symnum 32enum object /object为三种标识符的类型 constant, variable, procedur,enum fct /fct类型分别标
4、识类PCODE的各条指令lit, opr, lod, sto, cal, inte, jmp, jpc, /书本P23 #define fctnum 8struct instruction /指令 enum fct f; /功能码 int l; /层次差 int a; /P23FILE * fas; /输出名字表 FILE * fa; /输出虚拟机代码 FILE * fa1; /输出源文件及其各行对应的首地址 FILE * fa2; /输出结果 bool tableswitch; /显示名字表与否 bool listswitch; /显示虚拟机代码与否 char ch; /获取字符的缓冲区,g
5、etch使用 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; /表示因子开始的符号集合 ,factorstruct tablestruct char nameal; /*名字*/ enum object kind; /*类型:const,var,array or proc
7、edure*/ 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告知调用它的函数,最终退出程序*/#de
8、fine 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,
9、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 -1void error(int
10、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 inte
11、rpret();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(i
12、nt* 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 20031022(Red Hat Linux 3.3.2-1)*Red
13、hat 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); /*输入文件名*/fi
14、n=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,w);fprintf(f
15、a1,Iput pl/0 file ?);fprintf(fa1,%sn, fname);init(); /*初始化*/err=0; /错误计数器置0 cc=cx=ll=0;ch= ;if(-1!=getsym()fa=fopen(fa.tmp,w);fas=fopen(fas.tmp,w);addset(nxtlev,declbegsys,statbegsys,symnum);nxtlevperiod=true; if(-1=block(0,0,nxtlev)/*调用编译程序*/fclose(fa);fclose(fa1);fclose(fas);fclose(fin);printf(n);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- PL0 源代码 语言版 24
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内