ImageVerifierCode 换一换
格式:DOCX , 页数:21 ,大小:98.43KB ,
资源ID:11739752      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/11739752.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(编译原理实验报告4.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

编译原理实验报告4.docx

1、编译原理实验报告4 实 验 报 告课程名称: 编译原理 实验名称: 实验四 语法分析(一)预测分析技术 学 生 姓 名: 杨甜甜 班 级 计算机134 学 号 13416725 学 院(系): 信息数理学院 指 导 教 师: 张英丽 实验时间: 2016 年 5 月 10 日 实验成绩: 实验四 语法分析(一)预测分析技术实验目的:对给定的文法及其预测分析表,对输入的符号串进行识别,并给出符号串的识别过程,包括各步骤的栈内容,输入和输出。实验要求:首先应该详细掌握预测分析技术的原理,方法详细的分析步骤。其次要了解数据结构中栈部分的内容,包括栈的特点及在预测分析中的使用情况,预测分析其实可以看成

2、是对两个基本的栈的操作,因此,对栈的有关知识要求比较熟悉。在实验前可复习数据结构中栈的内容,这样可使本实验比较顺利的进行。下面以例说明最后所应实现的功能输入文法规则0:Z:=BA 1:A:=+BA 2:A:=3:B:=DC 4:C:=*DC 5:C:=6:D:=(Z) 7:D:=i输入预测分析表!0:Z:=BA 1:A:=+BA 2:A:= 3:B:=DC 4:C:=*DC 5:C:=6:D:=(Z) 7:D:=i依次输入PTableZ,+ PTableZ,* PTableZ,( PTableZ,) PTableZ,i PTableZ,#对应的规则编号:-1 -1 0 -1 0 -1依次输入P

3、TableA,+ PTableA,* PTableA,( PTableA,) PTableA,i PTableA,#对应的规则编号:1 -1 -1 2 -1 2依次输入PTableB,+ PTableB,* PTableB,( PTableB,) PTableB,i PTableB,#对应的规则编号:-1 -1 3 -1 3 -1依次输入PTableC,+ PTableC,* PTableC,( PTableC,) PTableC,i PTableC,#对应的规则编号:5 4 -1 5 -1 5依次输入PTableD,+ PTableD,* PTableD,( PTableD,) PTable

4、D,i PTableD,#对应的规则编号:-1 -1 6 -1 7 -1 + * ( ) i # Z Z:=BA Z:=BA A A:=+BA A:= A:= B B:=DC B:=DC C C:= C:=*DC C:= C:= D D:=(Z) D:=i请输入要识别的符号串:i+i*i步骤 栈 输入 输出0 #Z i+i*i# Z:=BA1 #AB i+i*i# B:=DC2 #ACD i+i*i# D:=i3 #ACi i+i*i#4 #AC +i*i# C:=5 #A +i*i# A:=+BA6 #AB+ +i*i#7 #AB i*i# B:=DC8 #ACD i*i# D:=i9 #A

5、Ci i*i#10 #AC *i# C:=*DC11 #ACD* *i#12 #ACD i# D:=i13 #ACi i#14 #AC # C:=15 #A # A:=16 # # Success!该符号串是该文法的句子!输入要识别的符号串:ii步骤 栈 输入 输出0 #Z ii# Z:=BA1 #AB ii# B:=DC2 #ACD ii# D:=i3 #ACi ii#4 #AC i# Failure!该符号串不是该文法的句子!实验心得:本次实验主要练习了预测分析技术,通过对给定的文法及其预测分析表,对输入的符号串进行识别,并给出符号串的识别过程,包括各步骤的栈内容,输入和输出。相比于之前的

6、实验,本次的实验具有一定的难度,在实验的过程中,要耐心的调试,确保实验的顺利完成。参考程序#include#include#include#includestruct Regularity /存放文法规则的数组结构 char regular20;class Stack /定义一个栈类 public: Stack(int=10); Stack() deleteelements; void Push(const char& item); char Pop(); char GetTop(); void MakeEmpty()top=-1; int IsEmpty() const return top

7、=-1; int IsFull() const return top=maxSize-1; void display(); private: int top; char* elements; int maxSize;Stack:Stack(int s):top(-1),maxSize(s) elements=new charmaxSize; assert(elements!=0);void Stack:Push(const char& item) assert(!IsFull(); elements+top=item;char Stack:Pop() assert(!IsEmpty(); re

8、turn elementstop-;char Stack:GetTop() assert(!IsEmpty(); return elementstop;void Stack:display() elementstop+1=0; coutelements;/ void FindVN(char VN,Regularity Array,int length) int i,j,size=0; for(i=0;ilength;i+) for(j=0;jsize;j+) if(VNj=Arrayi.regular0) break; if(j=size) VNsize=Arrayi.regular0; si

9、ze+; VNsize=0; void FindVT(char VT,Regularity Array,int length) int i,j,k,m,size=0; for(i=0;ilength;i+) for(j=4;jstrlen(Arrayi.regular);j+) for(k=0;klength;k+) if(Arrayk.regular0=Arrayi.regularj) break; if(k=length&Arrayi.regularj!=) for(m=0;msize;m+) if(VTm=Arrayi.regularj) break; if(m=size) VTsize

10、=Arrayi.regularj; size+; VTsize=0; VTsize=#; VTsize+1=0;int FindRegularity(int PTable20,char VN,char VT,char temp1,char temp2) int i,j; int size1=strlen(VN); int size2=strlen(VT); for(i=0;isize1;i+) if(VNi=temp1) break; for(j=0;jsize2;j+) if(VTj=temp2) break; return PTableij;int CheckVT(char VT,char

11、 temp) int i; int size=strlen(VT); for(i=0;isize;i+) if(VTi=temp) return 1; return 0;void Display(Regularity Array,int length) coutsetiosflags(ios:left); int i; for(i=0;ilength;i+) couti:; coutsetw(12)Arrayi.regular; if(i+1)%3=0) coutendl; coutendl;void DisplayString(char TD,int index) int i,j; char

12、 temp20; int size=strlen(TD); for(i=index,j=0;isize;i+,j+) tempj=TDi; tempj=0; couttemp;void InputRegularity(Regularity Array,int& length,char VN,char VT) int i; coutlength; for(i=0;ilength;i+) cout请输入编号为iArrayi.regular; FindVN(VN,Array,length); FindVT(VT,Array,length);void InputPredictTable(Regular

13、ity Array,int length,int PTable20,char VN,char VT) int i,j; int size1=strlen(VN); int size2=strlen(VT); cout请输入预测分析表!endl; Display(Array,length); for(i=0;isize1;i+) cout依次输入; for(j=0;jsize2;j+) coutPTableVNi,VTj ; cout对应的规则编号:; for(j=0;jPTableij; void ShowRegularity(Regularity Array,int length) Disp

14、lay(Array,length);void ShowPredictTable(Regularity Array,int PTable20,char VN,char VT) int i,j; int size1=strlen(VN); int size2=strlen(VT); coutresetiosflags(ios:left); coutsetiosflags(ios:right); coutsetw(3) ; for(i=0;isize2;i+) coutsetw(10)VTi; coutendl; for(i=0;isize1;i+) coutsetw(6)VNi; for(j=0;

15、j=0) coutsetw(10)ArrayPTableij.regular; else coutsetw(10) ; coutendl; void RecogniseString(Regularity Array,int length,int PTable20,char VN,char VT,Stack& stack) int i,index=0,count=0; char TD20; stack.MakeEmpty(); stack.Push(#); stack.Push(Array0.regular0); Display(Array,length); coutTD; i=strlen(T

16、D); TDi=#; TDi+1=0; coutsetiosflags(ios:left); coutsetw(5)步骤; coutsetw(4) ; coutsetw(6)栈; coutresetiosflags(ios:left); coutsetiosflags(ios:right); coutsetw(10)输入setw(10); coutresetiosflags(ios:right); coutsetiosflags(ios:left); coutsetw(4) ; coutsetw(6)输出endl; while(1) coutsetw(5)count; coutsetw(4)

17、; coutsetw(6); stack.display(); coutresetiosflags(ios:left); coutsetiosflags(ios:right); coutsetw(10); DisplayString(TD,index); coutresetiosflags(ios:right); coutsetiosflags(ios:left); if(stack.GetTop()=#&TDindex=#) coutsetw(4) ; coutsetw(6)Success!; coutendl; cout该符号串是该文法的句子!endl; break; else if(Ch

18、eckVT(VT,stack.GetTop() if(stack.GetTop()!=TDindex) coutsetw(4) ; coutsetw(6)Failure!; coutendl; cout该符号串不是该文法的句子!endl; break; else stack.Pop(); index+; coutsetw(10) ; else i=FindRegularity(PTable,VN,VT,stack.GetTop(),TDindex); if(i=-1) coutsetw(4) ; coutsetw(6)Failure!; coutendl; cout该符号串不是该文法的句子!e

19、ndl; break; else coutsetw(4) ; coutsetw(6)=4;j-) stack.Push(Arrayi.regularj); count+; coutendl; /void main() Regularity Array20; /定义数组存放文法规则 char VN20; /定义数组存放非终结符号 char VT20; /定义数组存放终结符号 int PTable2020; /定义二维数组存放预测分析表 int length=0; Stack stack(20); /创建栈用于识别符号串 int sel; int sign1=0,sign2=0;aaa: /显示用

20、户界面 cout1endl; cout2endl; cout3endl; cout4endl; cout5endl; cout6sel; while(sel!=1&sel!=2&sel!=3&sel!=4&sel!=5&sel!=6); switch(sel) case 1: /输入文法规则 sign1=1; InputRegularity(Array,length,VN,VT); break; case 2: /输入预测分析表 if(sign1=0) cout请先输入文法规则!endl; else sign2=1; InputPredictTable(Array,length,PTable,

21、VN,VT); break; case 3: /查看文法规则 if(sign1=0) cout请先输入文法规则!endl; else if(sign1=1&sign2=0) cout请先输入预测分析表!endl; else ShowRegularity(Array,length); break; case 4: /查看预测分析表 if(sign1=0) cout请先输入文法规则!endl; else if(sign1=1&sign2=0) cout请先输入预测分析表!endl; else ShowPredictTable(Array,PTable,VN,VT); break; case 5: /识别用户输入的符号串 if(sign1=0) cout请先输入文法规则!endl; else if(sign1=1&sign2=0) cout请先输入预测分析表!endl; else RecogniseString(Array,length,PTable,VN,VT,stack); break; case 6: break; if(sel!=6) coutendl; goto aaa;

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1