编译原理实验报告4.doc

上传人:叶*** 文档编号:35236012 上传时间:2022-08-20 格式:DOC 页数:9 大小:42KB
返回 下载 相关 举报
编译原理实验报告4.doc_第1页
第1页 / 共9页
编译原理实验报告4.doc_第2页
第2页 / 共9页
点击查看更多>>
资源描述

《编译原理实验报告4.doc》由会员分享,可在线阅读,更多相关《编译原理实验报告4.doc(9页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、实 验 报 告课程名称: 编译原理 实验名称: 实验四 语法分析(一)预测分析技术 学 生 姓 名: 杨甜甜 班 级 计算机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依次输入PTableA,+ P

3、TableA,* 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,) PTableD,i PTable

4、D,#对应的规则编号:-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 #ACi i*i#10

5、#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=-1; int Is

7、Full() 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();return elementstop-

8、;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; size+; VNsize=0;void FindV

9、T(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=Arrayi.regularj; size+; VT

10、size=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 temp) int i;int size=strlen(VT); fo

11、r(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 temp20;int size=strlen(TD);for(i=index,j

12、=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(Regularity Array,int length,int PTable20,char VN,char VT

13、) 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) Display(Array,length);void ShowPredictTable(Regularity Array,i

14、nt 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;j=0)coutsetw(10)ArrayPTableij.regular;elsecoutsetw(10) ;coutendl;voi

15、d 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(TD);TDi=#;TDi+1=0;coutsetiosflags(ios:left);coutsetw(5)步骤;coutsetw(4) ; coutsetw(

16、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) ; coutsetw(6); stack.display(); coutresetiosflags(ios:left); coutsetiosflags(ios:right); co

17、utsetw(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(CheckVT(VT,stack.GetTop() if(stack.GetTop()!=TDindex) coutsetw(4) ; coutsetw(6)Failure!; cout

18、endl; 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该符号串不是该文法的句子!endl; break; else coutsetw(4) ; coutsetw(6)=4;j-) stack.Push(Arrayi.regularj); count+; coute

19、ndl;void main()Regularity Array20; /定义数组存放文法规则 char VN20; /定义数组存放非终结符号char VT20; /定义数组存放终结符号 int PTable2020; /定义二维数组存放预测分析表int length=0;Stack stack(20); /创建栈用于识别符号串int sel; int sign1=0,sign2=0;aaa: /显示用户界面cout1endl;cout2endl;cout3endl;cout4endl; cout5endl;cout6sel;while(sel!=1&sel!=2&sel!=3&sel!=4&s

20、el!=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,VN,VT); break; case 3: /查看文法规则 if(sign1=0) cout请先输入文法规则!endl; else if(sign1=1&sign2=0) cout请先输入预测分析表!end

21、l; 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;

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

当前位置:首页 > 教育专区 > 高中资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁