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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

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

1、编译原理课程设计报告11课 程 设 计 报 告设计题目:LL(1)文法分析器班 级:计算机科学与技术1201组长学号:20123826组长姓名:张小红指导教师: 设计时间: 设计分工摘 要选题要求:根据某一文法编制调试LL(1) 文法语法分分析程序,以便对任意输入的符号串进行分析。本次课程设计的目的主要是加深对预测分析LL(1)文法语法分析法的理解。具体如下:1、对语法规则有明确的定义;2、编写的分析程序能够对给定文法进行正确的语法分析;3、对输入给定的文法,手工计算FIRST、FOLLOW集合,应能判断识别是否为给定文法的句子,并给出推导过程。4、对输入给定的文法,由程序自动构造FIRST、

2、FOLLOW集合。5、对于遇到的语法错误,能够做出简单的错误处理,给出简单的错误提示,保证顺利完成语法分析过程。关键词:LL(1)文法 语法分析 FIRST FOLLOW 。1 概述根据某一文法编制调试LL(1) 文法语法分分析程序,以便对任意输入的符号串进行分析。本次课程设计的目的主要是加深对预测分析LL(1)文法语法分析法的理解。预期目标构造LL(1)文法语法分析程序,任意输入一个文法符号串,并判断它是否为文法的一个句子。程序要求为该文法构造预测分析表,并按照预测分析算法对输入串进行语法分析,判别程序是否符合已知的语法规则,如果不符合(编译出错),则输出错误信息。对于任意输入的一个LL(1

3、)文法,构造其预测分析表。首先实现集合FIRST(X)构造算法和集合FOLLOW(A)构造算法,再实现教材P.79给出的预测分析表构造算法。程序显示输出预测分析表或输出到指定文件中。2 课程设计任务及要求2.1 设计任务对于任意输入的一个LL(1)文法,构造其预测分析表。要求:首先实现集合FIRST(X)构造算法和集合FOLLOW(A)构造算法,再实现教材P.79给出的预测分析表构造算法。程序显示输出预测分析表或输出到指定文件中。2.2 设计要求对文法 :G: EE+T|T TT*F|F F(E)|i按教材P.76表4.1构造出G的预测分析程序,程序显示输出如P.78那样的匹配过程。3 算法及

4、数据结构3.1算法的总体思想(流程)对存入文本文件(.txt文件)里存放的文法读入程序,然后首先要建立两个类,分别是grammer类和SeqStack类(Grammer类中有保存从文本文件读入的LL(1)文法,SeqStack类主要的作用为在预测分析时作为符号栈)。然后按照书上介绍的算法计算出相应的first集合和follow集合,根据已有的集合在用正确合理的算法计算出文法的预测分析表。最后根据文法分析表对输入的字符串进行分析,输出相应的LL(1)文法分析结果。3.2文本文法读入程序模块3.2.1功能把文本文件中的LL(1)文法读入到程序中grammer类中的数组成员g中。3.2.2 数据结构

5、首先要建立两个类,分别是grammer类和SeqStack类Grammer类中有保存从文本文件读入的LL(1)文法,用一个二维字符数组g保存,保存非终结符的字符数组VN,保存终结符的字符数组VT,文法开始符号字符变量begin , 元素对应first集合中的有空字符的非终结符数组emptychar,预测分析表为二维整形数组form.SeqStack类主要的作用为在预测分析时作为符号栈.对于这个模块的设计,就是用输入流对文本文件中的文法进行读入当读到字符|或/n时意味着一个产生式已结束,那么相应数组中相应的下标变量+1;数组gi0所存放着这个产生式对应的字符的数量.gi1为这个产生式左边的非终结

6、符。数据结构框图如下:3.3 文法扫描模块3.3.1 功能通过对已输入到数组g中的文法,进行扫描,把相应的非终结符和终结符输入到非终结符数组VN中和终结符数组VT中。3.3.2 数据结构在已把文法读入到数组g中后,那么相应的gi1为每个产生式的非终结符,若此非终结符不在数组VN中,那么把此字符加入到VN中对终结符的读入,则是从每个gi2开始扫描,若此字符不在非终结符数组VN中,也不在VT 中,那么就把此字符加入到VT中。数据结构框图如下:3.4 first集合模块3.4.1 功能生成所有的非终结符的FIRST集合。3.4.2 数据结构生成FIRST集合这个算法基本上按照书上的原理,如对每个产生

7、式进行扫描,当扫描到非终结符时,把此字符加入到相应非终结符的FIRST集合中,若遇到非终结符时,需把此非终结符的FIRST集合中除了空字符外全加入到对应的非终结符的first集合中,这就涉及到算法的一个递归算法,我是利用在函数的参数表中设置俩个参数,一个是FIRST数组,另外一个是非终结符,在用到递归时,我是利用把FIRST数组设为本产生式第一个非终结符的FIRST数组,而非终结符参数则设置为在扫描产生式右部过程中所遇到的非终结符.然后通过循环对这个文法中的所有非终结符进行函数的调用,这样来求到所有非终结符的FIRST集合。数据结构框图如下:3.4.3 算法构造FIRST(X),办法是,连续使

8、用下面的规则,直至每个集合FIRST不再增大为止。(1) 若XVT,则FIRST(X)=X.(2) 若XVn ,且有产生式X-a,则把a加入到FIRST(X)中,若X-,也是一条产生式,则把也加到FIRST(X)中.(3) 若X-Y是一个产生式且YVn,则把FIRST(Y)中所有非-元素都加到FIRST(X)中,若X-Y1Y2YK ,是一个连续的产生式, Y1Y2Yi-1 都是非终结符,而且,对于任何j,1ji-1,FIRST(Yj) 都含有(即Y1Y2Yi-1=),则把FIRST(Yi) 中的所有非-元素都加到FIRST(X)中,特别是,若所有的FIRST(Yj)均含有,j=1,2,k,则把

9、加到FIRST(X)中。3.5 follow集合模块3.5.1 功能生成所有的非终结符的FOLLOW集合。3.5.2 数据结构 生成FOLLOW集合这个算法,关键就是求某非终结符A的FOLLOW集合,那么就是扫描到A后面的字符,若为终结符,则把此终结符加入到A的FOLLOW集合,那么若为非终结符,则把此非终结符的FIRST集合加入到A的FOLLOW集合中,若A为某个产生式最后一个字符,则把这个产生式的第一个字符的FOLLOW集合加入到A的FOLLOW集合中,在这个算法的过程中叶涉及到运用递归,此递归的方法同样与上述求FIRST集合中运用的递归方法类似。数据结构框图如下:3.5.3 算法 对于文

10、法G中每个非终结符A构造FOLLOW(A)的办法是,连续使用下面的规则,直到每个FOLLOW不在增大为止。(1) 对于文法的开始符号S,置#于FOLLOW(S)中;(2) 若A-aBb是一个产生式,则把FIRST(b) 加至FOLLOW(B)中;(3) 若A-aB是一个产生式,或A-aBb是一个产生式而b=(即FIRST( b)则把FOLLOW(A)加至FOLLOW(B)中。3.6 分析表生成模块3.6.1 功能生成文法的预测分析表。3.6.2 数据结构求预测分析表的过程同样是对每个产生式进行扫描,对每个产生式的FIRST集合中的元素,都把相应的产生式的编号写入到对应的预测分析表中对应的位置。

11、数据结构框图如下:3.6.3 算法构造分析表M的算法是:(1) 对文法G的每个产生式A-a执行第二步和第三步;(2) 对每个终结符aFIRST(a), 把A-a加至MA,a中;(3) 若FIRST(a),则把任何bFOLLOW(A)把A-a加至MA,b中;(4) 把所有无定义的MA,a标上出错标志。3.7 预测分析程序模块3.7.1 功能 生成文法的预测分析程序。3.7.2 数据结构生成预测分析程序,就是把#和文法开始符号进入到栈中,然后把相应的分析语句中当前的输入符号对应,在每一步过程中按照书上讲到的原理,在预测分析表中找到相应的产生式。3.7.3 算法预测分析程序的总控程序在任何时候都是按

12、STACK栈顶符号X和当前的输入符号行事的,对于任何(X,a),总控程序每次都执行下述三种可能的动作之一;1.若X=a=”#”,则宣布分析成功,停止分析过程.2.若X=a”#”,则把X从STACK栈顶逐出,让a指向下一个输入符号.3.若X是一个非终结符,则查看分析表M,若MA,a中存放着关于X的一个产生式,那么,首先把X逐出STACK栈顶,然后,把产生式的右部符号串按反序一一推进STACK栈(若右部符号为,则意味着不推什么东西进栈).在把产生式的右部符号推进栈的同时应做这个产生式相应得语义动作,若MA,a中存放着”出错标志”,则调用出错诊察程序ERROR。4 程序设计与实现4.1 程序流程图4

13、.2 程序说明程序分为三部分:1.文件的头文件准备,负责对类、栈的定义,2.功能函数的编写,负责所有功能函数的编写,3.主函数,负责对所有函数的调用与程序流程控制。4.3 实验结果 该程序是在VC+ 6.0以下编写的,里面没有用到C+的知识,纯C编写的代码.在运行之前,先将要分析的文法写入一个文本文档*.txt里,这里是:G: EE+T|T TT*F|F F(E)|i输入待分析的字符串是:i*i+i按教材P.76表4.1构造出G的预测分析程序,程序显示输出如P.78那样的匹配过程。注意:只有这里用到两个符号与,其中在特殊符号里、在希腊字母里,此处将上面这样的产生式组存放在eq.txt这个文本文

14、档里作为示例。下面显示语法分析进行个步骤。运行结果如图:5 结论通过读取任意的文本文件里的文法,合理的数据结构存储,正确的编译原理算法可以正确的分析输入字符串,达到预期效果。6 参考文献1、陈火旺.程序设计语言编译原理(第3版). 北京:国防工业出版社.2000.2、美 Alfred V.Aho Ravi Sethi Jeffrey D. Ullman著.李建中,姜守旭译.编译原理.北京:机械工业出版社.2003.3、美 Kenneth C.Louden著.冯博琴等译.编译原理及实践.北京:机械工业出版社.2002.4、金成植著.编译程序构造原理和实现技术. 北京:高等教育出版社. 2002.

15、7 收获与体会因为这是一个团体合作项目,刚开始我们组就分工问题就遇到了困难,数据结构与编译原理课程知识并不是很好,不知怎么正确分工,后来经过商讨,最后意见达成一致,开始各自的程序设计。因为要考试的原因,所有想尽快把这个课程设计做完,可是越急越容易出错,做起来很不顺手,特别是编程的时候,虽然借鉴了几篇类似的试验或课程设计,但完成这一设计仍不是一件简单的事情。在设计过程中主要遇到以下三个个问题:1.数据结构问题。在此程序中,用到队列,堆栈等形式的数据结构,各节点链接复杂,遇到不少问题。在细心分析并逐步改正下,解决了此问题。2.小组成员以前合作较少,各自完成自己的分工没有与其他人约定好接口的问题,在

16、后期程序组装过程中遇到了很大麻烦,经过组内成员花费大量时间解决接口的问题。3.、符号问题。一开始在visual studio2005中没有找到这两个符号,苦恼半天。后来想个办法在Microsoft Word中,找到此符号后,直接粘贴到程序代码中。但在粘贴之后,还出了问题。后来把符号用代替,用-代替解决问题。总的来说,此次编译原理课程设计加深了我对编译这门课的理解,发现自己还有很多的地方要复习,甚至还有知识点的理解偏差。这些将直接影响期末考试,我将在以后的时间里,努力完善这些不足。而且组员之间的合作默契程度还远远不够,这些都是我们要学习的地方。8 附录程序第一部分class SeqStack;/

17、声明栈类class grammer/定义grammer类,此类的作用把文本文件中的文法保存,并且产生这个文法的非终结符集合,终结符集合,first集合,fellow集合,预测分析表等public: grammer(); grammer(); void openfile(char *); void prepareform(); void buildform(); void buildProcess(SeqStack& ss); private: char begin; char *vt; char *g; char *vn; char *first;/这时所有非终结符的first集合 char

18、*fellow;/这是所有非终结符的fellow集合 char *emptychar;/这个集合中的元素为对应first集合中的有空字符的非终结符 int *form;/这是对应文法的预测分析表 int count; void buildVn(); void buildVt(); void buildemptychar(); void buildfirst(); void buildfellow(); void fellowzh(char *,char); void firstzh(char *,char); int search(char *,char); void printform();

19、 void outputblank(int);const int stackIncreament=20;class SeqStack/定义SeqStack类,这个类的主要作用是在对语句的预测分析过程中作符号栈public: friend grammer; SeqStack(int sz=50); SeqStack(); void Push(char x); bool Pop(char& x); bool getTop(char& x); bool IsEmpty(); bool IsFull(); int getSize(); void MakeEmpty(); void showPlay()

20、;private: char *elements; int top; int maxSize; void overflowProcess();程序第二部分#include#include#include#include#include#include#include 编译.husing namespace std;grammer:grammer() count=0;grammer:grammer() int i; for(i=0;icount;i+) delete gi; delete g; delete vt; delete vn;void grammer:openfile(char *fi

21、le)/这个函数的主要功能在于对文本文件中的文法进行读入,并保存在对应的数组中,一并产生对应文法的终结符集合和非终结符集合 char ch; int i,j; ifstream infile(file,ios:in);/定义文件流 if(!infile) coutopen error!) count+; else infile.seekg(-1,ios:cur); else if(ch=|) count+; else g=new char *count; for(i=0;i) gij=ch; gi0+; j+; if(ch=EOF) break; else infile.seekg(-1,io

22、s:cur); else if(ch=|) i+; gi1=gi-11; gi0=1; j=2; else if(ch=n) infile.seekg(-3,ios:cur); ch=infile.get(); if(ch!=n) i+; j=1; infile.seekg(2,ios:cur); else gij=ch; gi0+; j+; coutcountendl; for(i=0;icount;i+) for(j=1;j=gi0;j+) coutgij ; coutendl; buildVn();/建立非终结符集合 buildVt();/建立终结符集合void grammer:buil

23、dVn() int i=1,j=0; vn=new charcount+1; vni=gj+1; for(;jcount;j+) if(gj1!=gj-11) i+; vni=gj1; vn0=i; begin=vn1; cout本文法开始符为:beginendl; cout本文法非终结符为: ; for(i=1;i=vn0;i+) coutvni ; coutendl;void grammer:buildVt() int i=1,j=0,t; char ch; vt=new char100; vt0=0; for(;jcount;j+) t=2; for(;t=gj0;t+) ch=gjt;

24、 if(!search(vt,ch)&!search(vn,ch) vti+=gjt; vt0+; cout本文法终结符为: ; for(i=1;i=vt0;i+) coutvti ; coutendl;int grammer:search(char *a,char ch)/搜索函数,用于在指定数组中对指定字符进行搜寻,若存在输出对应的序号,若不在则输出0 for(int i=1;i=a0;i+) if(ch=ai) return i; return 0;void grammer:buildemptychar()/建立对应first集合中含有空字符的的非终结符集合 int i=0,j=2,t=

25、1; bool flag=true,flag1; emptychar=new charvn0+1; emptychar0=0; for(;icount;i+) if(gi2=&!search(emptychar,gi1) emptychart+=gi1; emptychar0+; while(flag) flag=false; for(i=0;icount;i+) for(j=2;j=gi0;j+) if(search(emptychar,gij) flag1=true; else flag1=false; break; if(flag1=true&!search(emptychar,gi1)

26、 emptychart+=gi1; emptychar0+; flag=true; coutFirst集中含有空字符的有: ; for(i=1;i=emptychar0;i+) coutemptychari ; coutendl;void grammer:buildfirst() int i; first=new char* vn0; for(i=0;ivn0;i+) firsti=new charvt0+1; for(i=0;ivn0;i+) firsti0=0; for(i=1;i=vn0;i+) firstzh(firsti-1,vni); void grammer:buildfellow() int i,j; fellow=new char* vn0; for(i=0;ivn0;i+) fellowi=new charvt0+1; for(i=0;ivn0;i+) fellowi0=0; for(i=1;i=vn0;i+) fellowzh(

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

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