编译原理课程设计报告.docx

上传人:s9****2 文档编号:560754029 上传时间:2023-08-17 格式:DOCX 页数:26 大小:161.45KB
返回 下载 相关 举报
编译原理课程设计报告.docx_第1页
第1页 / 共26页
编译原理课程设计报告.docx_第2页
第2页 / 共26页
编译原理课程设计报告.docx_第3页
第3页 / 共26页
编译原理课程设计报告.docx_第4页
第4页 / 共26页
编译原理课程设计报告.docx_第5页
第5页 / 共26页
点击查看更多>>
资源描述

《编译原理课程设计报告.docx》由会员分享,可在线阅读,更多相关《编译原理课程设计报告.docx(26页珍藏版)》请在金锄头文库上搜索。

1、武汉纺税大学编译原理课程设计实验报告学院:数学与计算机专业:计算机姓名:班级:学号:error 0014: call后应为标识符,error 0015: call后标识符属性应为过程”,error 0016:条件语句中丢了 then,error 0017:丢 了 end 或;,error 0018: while型循环语句中丢了 do,error 0019:语句后的标识符不正确”,error 0020:应为关系运算符”,error 0021:表达式内标识符属性不能是过程。error0022:表达式中漏掉了右括号error 0023:因子后的非法符号”,error 0024:表达式开始符不能是此符

2、号,error 0025:文件在不该结束的地方结束了”,error 0026:结束符出现在不该结束的地方,error 0027: ,error 0028: /error 0029: ,error 0030:error 0031:数越界”,error 0032: read语句括号中标识符不是变量,error 0033: else 附近错误”,error 0034: repeat 附近错误”;/PL0构造函数PL0:PL0(char* source,char*destination) (/初始化存储保留字/初始化存储保留字listswitch=true,sourceEnd=false;strcpy

3、(wordl/begin); strcpy(word2zcaH); strcpy(word3,const); strcpy(word4/do);strcpy(word5,else);strcpy(word6/end);strcpy(word7,if);strcpy(word8,odd); strcpy(word9/procedure); strcpy(word10,read); strcpy(wordll/repeat); strcpy(word12,then); strcpy(word13,until);strcpy(word14,var); strcpy(word15/while); st

4、rcpy(word16,write);wsyml= BEGINSYM; wsym2= CALLSYM; / 初始化保留字表中每一个保 留字对应的symbol类型wsym3= CONSTSYM; wsym4= DOSYM;wsym5= ELSESYM;wsym6= ENDSYM;wsym7)= IFSYM;wsym8= ODDSYM;wsym9= PROCSYM; wsym10= READSYM;wsymll= REPEATSYM; wsym12= THENSYM;wsym13= UNTILSYM; wsym14= VARSYM;wsym15= WHILESYM; wsym16= WRITESY

5、M;memset(code,0,sizeof(code);memset(ssym,0,100*sizeof( symbol);memset(table,0,sizeof(table);memset(linezOzsizeof(line);ssym+,= PLUS;/初始化一些符号对应的symbol类型表ssym-= MINUS;ssym*= TIMES;ssym(7= SLASH;ssym(= LPAREN;ssym)= RPAREN;ssym= EQL;ssym7= COMMA;ssym.= PERIOD;ssym#= NEQ;ssym罚=LSS;ssym = GTR;ssym;= SEMI

6、COLON;strcpy(mnemonicLIT; lit );/ 初始化类 PCODE 指令助记符表strcpy(mnemonicOPR/ opr);strcpy(mnemonicLOD/ lod );strcpy(mnemonicSTO/ sto);strcpy(mnemonicCAL, cal);strcpy(mnemonicINT, int);strcpy(mnemonicJMP; jmp);strcpy(mnemonicJPC, jpc);declbegsys.insert(CONSTSYM)/declbegsys.insert(VARSYM)/declbegsys.insert(P

7、ROCSYM); /初始化声明开始符号集合statbegsys.insert(BEGINSYM),statbegsys.insert(CALLSYM),statbegsys.insert(IFSYM),statb egsys.insert(WHILESYM);/初始化表达式开始符号集合facbegsys.insert(IDENT),facbegsys.insert(NUMBER),facbegsys.insert(LPAREN); 初始化项开始符号集合/行缓冲区指针/代码分配指针,代码生成模块总在ex所指位/行缓冲区长度/ last character read/引入此变量是出于程序性能考虑/

8、 code line no./行缓冲区指针/代码分配指针,代码生成模块总在ex所指位/行缓冲区长度/ last character read/引入此变量是出于程序性能考虑/ code line no.err= 0;cc= 0;cx= 0;置生成新的代码11=0;ch=kk= al;codeNo=0; fin=fopen(sourcezr);fout=fopen(destination,w);)/出错处理,打印出错位置和出错代码 void PLO:error(int n)(char s10;sprintf(s,第 %d 行codeNo); errorString.push_back(s+errS

9、trn);err= err+l;/error count/error end/词法分析,读取一个单词void PL0:getsym()(if(sourceEnd)return;int i,j,k;while (ch = | |ch=9) getch(); / cis space and tab if(isalpha(ch) / id or reserved word (k=0;memset(a,0,al+l);/检测一个单词长度doif (k = kk)kk = k;elsedoakk=kk= kk-1;)while(kk k);strcpy(id,a);i= 1;j= norw;/判断是否是

10、关键字(二分搜索) dok=(i+j)/2;if(strcmp(id, wordkj)=0)while(ij) sym= wsymk;elsesym= IDENT;)else if(isdigit(ch) / numberk= 0;num= 0;sym= NUMBER;do num= 10 * num + ch - O; k= k+1; getch();while(isdigit(ch);if(k nmax) error(30);else if (ch =getch();if( ch = =*)(sym= BECOMES; getchf);elsesym= NUL;)else if(ch =

11、)/ extra stuff added to support )(getch();if( ch =)(sym= GEQ;getch();)elsesym= GTR;else/ end of extra stuff(sym= ssymch; /其它符号的赋值 getch();)/漏掉空格,读取一个字符void PLO:getch()(if(cc = II)if(sym!=PERIOD)error(25);sourceEnd=true;return;cc= 0;fgets(line,lineLength,fin); codeNo+;ll=strlen(line);if(linell-l=10)

12、II-;ch= linecc;cc= cc+1;)/生成目标代码,并送入目标程序区 void PLO:gen(fct xjnt y,int z)(if (ex exmax)coutProgram too longn; return;)codecx.f= x;code(cx.l= y;codecx.a= z;cx= cx+1;gen end/测试当前单词符号是否合法 void PLO:test(symset sl,symset s2,int n) (if(sourceEnd)return;if (sl.find(sym)=sl.end()(error(n); symset:iterator it

13、;for(it=s2.begin();it!=s2.end();it+)sl.insert(*it);/sl=sl+s2 while (sl.find(sym)=sl.end() getsym();/分程序分析处理过程void PLO:block(int levjnt tx,symset fsys)if(sourceEnd)return;int dx; data allocation indexint txO; / initial table indexint cxO; / initial code indexdx= 3;/变量的个数txO= tx; /表指针tabletx.other.inOther.adr= ex;gen(JMP,0,0);iff levlevmax)error(32);doiff sym = CONSTSYM) / 处理常量声明getsym();do(constdeclaration(txzdx,lev);while (sym = COMMA)(getsym); constdeclaration(tx,dx,lev);)if (sym =SEMICOLON)getsym();elseerr

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 解决方案

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号