版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、编译原理实验报告实验题目:词法分析器构造指导教师:杨建,赵会群姓名: 班级:学号:实验成绩:实验题目语法分析器构造实验目的和要求借助于词法分析程序提供的分析结果,编写一个算符优先语法分析程序,程序能进行语法结构分析和错误检查并产生相应的归约信息。同时给出出错信息和错误类型,从而加深对语法分析的理解。设计思想与框架1.本实验的优先表可以手工先设计好:算符优先关系表- + - * / ( ) i #+ - * / ( = ? ? i ? ? # ? 项|算术表达式+项|算术表达式-项项-因子|项*因子|项/因子因子-变量|常数|(算术表达式)2.本实验要求中提出的“产出相应的归约信息”意指在语法分
2、析的过程中,一旦产生归约,在程序上产生并最终输出归约产生式序号。3.出错类型的产生可预先对应优先表中出错栏列表说明其出错类型,并分别编序,当分析中产生错误时以字符串输出相应表中错误信息。核心算法算法采用一个符号栈的数据结构,既用它存放终结符,也用它存放非终结符。设K为符号栈使用深度,其参考算法如下:K:=1 SK:=#Repeat把下一人输入符读入a中If SKVT then j:=K else j:=K-1While Sja doBeginRepeatQ:=SjIf Sj-1VT then j:=j-1 else j:=j-2Until SjQ把Sj+1SK归约为某个N记录归约产生式序号K:
3、=j+1SK:=NEnd of while If Sja OR Sj=a thenBeginK:=K+1; SK:=aEnd Else ERROR 查表打印出错信息Until a=#输出归约产生式序列号;源程序及注释#include #include #include using namespace std;#define N 100#define NULL 0FILE *fp;/预处理文件指针/定义符号栈的大小与输入字符串的大小以及算术表达式字符串的大小char stackN,stringsN,oldstringsN;char a;int top=-1,k=0,step=1,n=0,NoN,
4、id=1;/二维数组定义字符之间的优先关系(1表示,-1表示,0表示=,-2表示错误)int MNN=1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,1,1,1,1,1,-1,1,-1,1,1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,0,-1,-2,1,1,1,1,-2,1,-2,1,1,1,1,1,-2,1,-2,1,-1,-1,-1,-1,-1,-2,-1,0; char *word6=N+N,N-N,N*N,N/N,)N(,i;/可归约字符串int print(int t,int m) coutn step+setw(10); couts
5、tacksetw(10); if(m=1) coutsetw(8); else if(m=0) cout=setw(8); else coutsetw(8); coutasetw(10); cout&stringsksetw(10); if(t) cout归约setw(8); Non+=step-1; else cout移进setw(8); return 0;void push(char ch) stack+top=ch;char pop()char a;a=stacktop-;stacktop+1=0; return a;int ch_di(char ch) switch(ch) case+
6、: return 1; case-: return 2; case*: return 3; case/: return 4; case(: return 5; case): return 6; casei: return 7;case#: return 8; default: return 0;int IsVT(char ch) if(ch=N) return 0; else return 1;int readvt(char *a) if(IsVT(stringsk) (*a)=stringsk; k+; return 1; else k+; return 0;int big(int t,ch
7、ar a) if(Mch_di(stackt)-1ch_di(a)-1=1)return 1;elsereturn 0;int less(int t,char a) if(Mch_di(stackt)-1ch_di(a)-1=-1)return 1;elsereturn 0;int equal(int t,char a) if(Mch_di(stackt)-1ch_di(a)-1=0)return 1;elsereturn 0;void error(int t) if(ch_di(stackt)=6|ch_di(stackt)=7) printf(n错误e2:缺少运算符!);else if(c
8、h_di(stackt)=5)printf(n错误e1:非法左括号!);else printf(n错误e3:非法右括号!);void prior_analysis() int i,j,m; char q,str,ch20; push(#);print(0,-1);for(;)/*u:*/ readvt(&a); if(IsVT(stacktop) j=top; else j=top-1;do while(big(j,a)&strcmp(stack,#N)!=0) do q=stackj; if(IsVT(stackj-1) j=j-1; else j=j-2;while(!less(j,q);
9、i=-1;while(top-j)!=0) ch+i=pop();chi+1=0;for (m=0;m=5;m+)if(strcmp(wordm,ch)=0)str=N;push(str); print(1,1); if(less(j,a) push(a);print(0,-1);if(stacktop!=#)/goto u;break; else if(equal(j,a) push(a);print(0,0); if(stacktop!=#)/goto u;break;elseerror(j);a=#;while(a!=#);if(a=#)break;void main() cout*算符
10、优先语法分析程序*endl;coutE+T|E-T|Tendl;coutT*F|T/F|Fendl;cout(E)|iendl;cout E表示算术表达式.T表示项.F表示因子.i表示变量或常数.endl;cout 优先表endl;cout + - * / ( ) i #endl;cout endl; cout endl;cout endl;cout endl;cout ( = e1endl;cout e2 e2 endl;cout e2 e2 endl;cout # e3 =endl;if(fp=fopen(预处理.txt,r)=NULL)cout请先将实验文件夹中的预处理.txt文件复制到
11、实验文件夹中!|ch1=)&ch=)ch=fgetc(fp); if(ch=#) cout算符优先语法分析结束!endl;fclose(fp); system(pause);exit(0); while(ch!= &ch!=#) ch=fgetc(fp); oldstrings+i=ch; oldstringsi=0; if(isalnum(oldstringsj) strings+m=i; else strings+m=oldstringsj; j+; while(oldstringsj!=0) if(isalnum(oldstringsj) if(isalnum(oldstringsj-1
12、)=0) strings+m=i; else strings+m=oldstringsj; j+; stringsm+1=#; stringsm+2=0; cout算术表达式id为: oldstringsendl; cout转换为输入串: stringsendl; cout 步骤号符号栈优先关系当前分析符剩余输入串动作; prior_analysis(); n=0; coutendl; cout算术表达式id+的归约产生式步骤号为:; while(Non) cout Non; n+;coutendl; while(stack0!=0) pop();while(No-n)Non=0; top=-
13、1; a=0; k=0; step=1; n=0;cout算符优先语法分析结束!endl;fclose(fp);system(pause);exit(0);问题及处理Goto语句修改成for循环的时候,有两种情形能从while循环中跳出,接下来要做的有对应的两条路:一是根据循环条件,当a=#时循环结束,此时函数prior_analysis应该执行完毕;二是满足循环体中的判断条件stacktop!=#,跳出while循环,此时接下来要做的是readvt(&a),而不是结束函数。一开始我只考虑到了第二种情况,每次从while中跳出后都去做readvt(&a);,造成程序陷入死循环。后来经过仔细的思考,在while循环结束后加上了判断条件 if(a=#) break; 就
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 装潢美术设计师操作知识竞赛考核试卷含答案
- 硫漂工安全宣教知识考核试卷含答案
- 2025年独立运行村用风力发电机组项目发展计划
- 2025年石油钻采机械项目发展计划
- 2025年金属冶炼加工项目发展计划
- 2025年光伏发电用控制器项目发展计划
- 2025年电子装联专用设备合作协议书
- 2026年液相色谱-质谱联用仪(LC-MS)项目建议书
- 2025年江苏省南通市中考化学真题卷含答案解析
- 乔木栽植施工工艺
- 感染性心内膜炎护理查房
- 导管相关皮肤损伤患者的护理 2
- 审计数据管理办法
- 2025国开《中国古代文学(下)》形考任务1234答案
- 研发公司安全管理制度
- 儿童口腔诊疗行为管理学
- 瓷砖样品发放管理制度
- 北京市2025学年高二(上)第一次普通高中学业水平合格性考试物理试题(原卷版)
- 短文鲁迅阅读题目及答案
- 肺部感染中医护理
- 临床研究质量控制措施与方案
评论
0/150
提交评论