PL0编译系统C版本.doc_第1页
PL0编译系统C版本.doc_第2页
PL0编译系统C版本.doc_第3页
PL0编译系统C版本.doc_第4页
PL0编译系统C版本.doc_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

/* PL/0 编译系统C版本头文件pl0.h */typedef enum false,true bool;#define norw 13/* 关键字个数 */#define txmax 100/* 名字表容量 */#define nmax 14/* number的最大位数 */#define al 10/* 符号的最大长度 */#define amax 2047/* 地址上界 */#define levmax 3/* 最大允许过程嵌套声明层数0,levmax */#define cxmax 200/* 最多的虚拟机代码数 */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 ;#define symnum 32/* 名字表中的类型 */enum object constant,variable,procedur,array;/* 虚拟机代码 */enum fct lit,opr,lod, sto,cal,inte, jmp,jpc ;#define fctnum 8/* 虚拟机代码结构 */struct instructionenum fct f; int l; int a; ;FILE* fas; FILE* fa; FILE* fa1; FILE* fa2;bool listswitch; bool tableswitch;char ch;enum symbol sym;char idal+1;int num; int cc, ll; int cx; char line81;char aal+1;struct instruction codecxmax;char wordnorwal;enum symbol wsymnorw; enum symbol ssym256;char mnemonicfctnum5;bool declbegsyssymnum; bool statbegsyssymnum; bool facbegsyssymnum;/* 名字表结构 */struct tablestructchar nameal;enum object kind;int val;int level;int adr;int size; ;struct tablestruct tabletxmax;FILE* fin; FILE* fout;char fnameal;int err;/* 当函数中会发生fatal error 时,返回-1告知调用它的函数,最终退出程序 */#define getsymdoif (-1 = getsym() return -1#define getchdoif (-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 -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, 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 term(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);#include #include #include pl0.h#define stacksize 500int main()bool nxtlevsymnum;printf(Input pl/0 file?);scanf(%s, fname);fin = fopen(fname, r);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(fa1, Input pl/0 file?);fprintf(fa1, %sn, fname);init();err = 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);return 0;fclose(fa);fclose(fa1);fclose(fas);if(sym != period)error(9);if(err = 0)fa2 = fopen(fa2.tmp,w);interpret();fclose(fa2);elseprintf(Errors in pl/0 program);fclose(fin);elseprintf(Cant open file!n);printf(n);return 0;void init()int i;for(i = 0; i 255; i+)ssymi = nul; ssym+ = plus;ssym- = minus;ssym* = times;ssym/ = slash;ssym( = lparen;ssym) = rparen;ssym= = eql;ssym, = comma;ssym. = period;ssym# = neq;ssym; = semicolon;strcpy(&(word00), begin);strcpy(&(word10), call);strcpy(&(word20), const);strcpy(&(word30), do);strcpy(&(word40), end); strcpy(&(word50), if);strcpy(&(word60), odd);strcpy(&(word70), procedure);strcpy(&(word80), read);strcpy(&(word90), then);strcpy(&(word100), var);strcpy(&(word110), while);strcpy(&(word120), write);wsym0 = beginsym;wsym1 = callsym;wsym2 = constsym;wsym3 = dosym;wsym4 = endsym;wsym5 = ifsym;wsym6 = oddsym;wsym7 = procsym;wsym8 = readsym;wsym9 = thensym;wsym10 = varsym;wsym11 = whilesym;wsym12 = writesym;strcpy(&(mnemoniclit0), lit); strcpy(&(mnemonicopr0), opr);strcpy(&(mnemoniclod0), lod);strcpy(&(mnemonicsto0), sto);strcpy(&(mnemoniccal0), cal);strcpy(&(mnemonicinte0), inte);strcpy(&(mnemonicjmp0), jmp);strcpy(&(mnemonicjpc0), jpc);for(i = 0; i symnum; i+)declbegsysi = false;statbegsysi = false;facbegsysi = false;declbegsysconstsym = true; declbegsysvarsym = true;declbegsysprocsym = true;statbegsysbeginsym = true; statbegsyscallsym = true;statbegsysifsym = true; statbegsyswhilesym = true;facbegsysident = true;facbegsysnumber = true;facbegsyslparen = true;int inset(int e, bool * s)return se; int addset(bool * sr, bool * s1, bool * s2, int n)int i;for(i = 0; i n; i+)sri = s1i | s2i; return 0;int subset(bool * sr, bool * s1, bool * s2, int n)int i;for(i = 0; i n; i+)sri = s1i & !s2i;return 0;int mulset(bool * sr, bool * s1, bool * s2, int n)int i;for(i = 0; i = a & ch = z)k = 0;do if(k = a & ch = 0 & ch = 9);ak = 0;strcpy(id, a);i = 0;j = norw - 1;do k = (i + j) / 2;if (strcmp(id, wordk) = 0)i = k + 1; while (i j)sym = wsymk;elsesym = ident;elseif(ch = 0 & ch = 0 & ch nmax)error(30);elseif (ch = :)getchdo;if (ch = =)sym = becomes;getchdo;elsesym = nul;elseif (ch = )getchdo;if (ch = =)sym = geq;getchdo;elsesym = gtr;elsesym = ssymch;/getchdo;/richardif (sym != period)getchdo;/end richardreturn 0;int gen(enum fct x, int y, int z)if (cx = cxmax)printf(Program too long);return -1;codecx.f = x; codecx.l = y; codecx.a = z; cx+;return 0;int test(bool * s1, bool * s2, int n)if (!inset(sym, s1)error(n);while (!inset(sym, s1) & (!inset(sym, s2)getsymdo;return 0;int block(int lev, int tx, bool * fsys)int i; int dx;int tx0;int cx0;bool nxtlevsymnum;dx = 3;tx0 = tx;tabletx.adr = cx;gendo(jmp, 0, 0);if (lev levmax)error(32);do if (sym = constsym)getsymdo;do constdeclarationdo(&tx, lev, &dx);while (sym = comma)getsymdo;constdeclaration(&tx, lev, &dx);if (sym = semicolon)getsymdo;elseerror(5); while (sym = ident);if (sym = varsym)getsymdo;do vardeclarationdo(&tx, lev, &dx);while (sym = comma)getsymdo;vardeclarationdo(&tx, lev, &dx);if (sym = semicolon)getsymdo;elseerror(5); while (sym = ident);while (sym = procsym)getsymdo;if (sym = ident)enter(procedur, &tx, lev, &dx);getsymdo;elseerror(4);if (sym = semicolon)getsymdo;elseerror(5);memcpy(nxtlev, fsys, sizeof(bool) * symnum);nxtlevsemicolon = true;if (-1 = block(lev + 1, tx, nxtlev)return -1;if (sym = semicolon)getsymdo;memcpy(nxtlev, statbegsys, sizeof(bool) * symnum);nxtlevident = true;nxtlevprocsym = true;testdo(nxtlev, fsys, 6);elseerror(5);memcpy(nxtlev, statbegsys, sizeof(bool) * symnum);nxtlevident = true;nxtlevperiod = true;testdo(nxtlev, declbegsys, 7); while (inset(sym, declbegsys);codetabletx0.adr.a = cx;tabletx0.adr = cx; tabletx0.size = dx;cx0 = cx;gendo(inte, 0, dx);if (tableswitch)printf(TABLE:n);if (tx0 + 1 tx)printf(NULLn);for (i = tx0 + 1; i amax)error(31);num = 0;table(*ptx).val = num;break;case variable:table(*ptx).level = lev;table(*ptx).adr = (*pdx);(*pdx)+;break;case procedur:table(*ptx).level = lev;break;int position(char * idt, int tx)int i;strcpy(, idt);i = tx;while (strcmp(, idt) != 0)i-;return i;int constdeclaration(int * ptx, int lev, int * pdx)if (sym = ident)getsymdo;if (sym = eql | sym = becomes)if (sym = becomes)error(1);getsymdo;if (sym = number)enter(constant, ptx, lev, pdx);getsymdo;elseerror(2);elseerror(3);elseerror(4);return 0;int vardeclaration(int * ptx, int lev, int * pdx)if (sym = ident)enter(variable, ptx, lev, pdx);getsymdo;elseerror(4);return 0;void listcode(int cx0)int i;if (listswitch)for (i = cx0; i amax)error(31);num = 0;gendo(lit, 0, num);getsymdo;el

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论