欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    编译原理实验报告-语法分析(共25页).doc

    • 资源ID:16282273       资源大小:501.50KB        全文页数:25页
    • 资源格式: DOC        下载积分:20金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要20金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    编译原理实验报告-语法分析(共25页).doc

    精选优质文档-倾情为你奉上编译原理课程实验报告实验2:语法分析姓名院系软件学院学号任课教师指导教师实验地点软件学院三楼机房实验时间2016/10/30/星期日实验课表现出勤、表现得分实验报告得分实验总分操作结果得分一、需求分析得分要求:采用至少一种句法分析技术(LL(1)、SLR(1)、LR(1)或LALR(1))对类高级语言中的基本语句进行句法分析。阐述句法分析系统所要完成的功能。 本语法分析器是在词法分析器的基础上实现对类高级语言中的基本语句进行句法分析,基本功能如下:(1)能识别以下几类语句: Ø 声明语句(包括变量声明、数组声明、记录声明和过程声明)Ø 表达式及赋值语句(包括数组元素的引用和赋值)Ø 分支语句:if_then_else Ø 循环语句:do_while Ø 过程调用语句(2)本语法分析器采用自顶向下的分析技术,能根据导入的文法,自动计算first集和follow集,能够生成每个产生式的select集,并自动生成预测分析表。(3)本语法分析器具备语法错误处理能力,可以进行错误检测,如果检测到在出错时,采用恐慌模式,能够给出错误提示信息,格式:错误项 错误原因 行号a)忽略输入中的一些符号,直到输入中出现选定的同步词法单元集合中的某个词法单元,同步集合的选取是非终结符的follow集;b)如果终结符在栈顶而不能匹配,弹出此终结符。c)输入栈中缺少某些应有的符号,比如只有右括号没有左括号等,会给出相应的提示。(4)系统的输入形式多样:可以通过文件导入文法和测试用例,可以通过用户界面显示并编辑测试用例。测试用例涵盖了第(1)条中列出的各种类型的语句,并设置了一些语法错误。(5)系统的输出分为两部分:一部分是打印输出语法分析器的FIRST集、FOLLOW集、select集和LL(1)分析表。另一部分是打印输出语法分析结果。 (6)本系统还实现了输出语法分析树的功能,让语法分析的过程更清晰。 二、文法设计得分要求:给出如下语言成分的文法描述。Ø 声明语句(包括变量声明、数组声明、记录声明和过程声明)Ø 表达式及赋值语句(包括数组元素的引用和赋值)Ø 分支语句:if_then_else Ø 循环语句:do_while Ø 过程调用语句 本语法分析器主要针对C语言进行文法设计,下面给出各语言成分的文法描述。 程序入口: Program->P P->D P /支持连续声明 P ->S P P->1) 声明语句:D ® proc id ; D S| T id; /支持过程声明和变量声明T X C | record D/支持结构体声明X short|int | long|float|double|char|string/支持多种基本类型的声明C numC | /支持数组的声明2)表达式及赋值语句: S ® id = E ;| L = E ; E ® E + E | E * E | -E | (E) | id | digit | LL ® idE | LE /支持数组元素的引用和赋值3) 控制流语句:S ® if B then S1 else S2| while B do S1B B | B /或语句| B && B /且语句| ! B /非语句| (B) /使用括号| E relop E /关系语句| true /bool型| false/bool型relop < | <= | = | != | > | >=/关系符号4)过程调用语句S ® call id (Elist)Elist ® Elist, EElist ® E 下面给出整个程序的无二义性,无左递归的LL(1)文法:Program->PP->D P|S P|emptyD->proc T id ( M ) P |T id A ;|record id P M->X id M'M'->, X id M'|emptyA->= F|empty|, id AF->digit|id|char| G |stringG->H G'G'->, H G'|emptyH->digit|charT->X CX->short|int|long|float|double|char|void|string|booleanC-> digit C|emptyS->L = E ;|if B then S else S|while B do S|call id ( Elist ) ;|return E ;E->- E E'|( E ) E'|digit E'|L E'|string EE'->+ E E'|* E E'|emptyL->id L'L'-> digit L'|emptyB->! B B'|( B ) B'|E relop E B'|true B'|false B'B'->or B B'|and B B'|emptyrelop-><|<=|=|!=|>|>=Elist->E Elist'Elist'->, E Elist'|empty 注:此处用empty代表空三、系统设计得分要求:分为系统概要设计和系统详细设计。(1) 系统概要设计:给出必要的系统宏观层面设计图,如系统框架图、数据流图、功能模块结构图等以及相应的文字说明。1)系统的数据流图:说明说明:本语法分析器是基于上一个实验词法分析器的基础上,通过在界面写或者是导入源程序,词法分析器将源程序识别的词法单元传递给语法分析器,语法分析器验证这个词法单元组成的串是否可以由源语言的文法生成,能够输出语法分析的结果,文法的first集、follow集和预测分析表,当然也可以以易于理解的方式报告语法错误。2) 系统框架图本系统框架主要是三部分,一部分是词法分析,负责识别源程序的词法单元识别,并将其存储,以供语法分析时读取;第二部分是文法分析部分,负责将导入的文法进行分析,得出文法的first集和follow集,以及自动构造出预测分析表,在语法分析时进行查询;第三部分是用户界面,提供源程序输入功能,以及语法分析结果的显示,显示语法分析树,还有first集、follow集和预测分析表的展示。(2)系统详细设计:对如下工作进行展开描述ü 核心数据结构的设计核心数据结构主要有两种:1) Tuple三元组为了存储预测分析表,我使用Tuple<string,string,string>三元组的数据结构,分别存储产生式的头部,产生式体,输入符号。2) Stack栈为了能够在语法分析时根据预测分析表来进行分析,我写了一个CStack的类用来实现栈的数据结构,在进行语法分析时,一个栈用来存储文法符号,一个栈用来存储输入符号,然后根据预测分析表进行语法分析。ü 主要功能函数说明主要功能函数:1) IDContent类:功能:充当符号表的角色,主要是用来保存关键字,运算符,界符,转义字符等各类单词。主要函数:bool isConstCh(string str)/判断是否转义字符bool isLetter_(char c)/判断是否字母或下划线bool isDigit(char c)/判断是否数字bool isBlank(char c)/ 判断是否是空格、制表符、换行、回车bool isKeyWord(string str)/判断是否关键字bool isBoundary(char c)/ 判断是否是边界符号bool isOperator(string ch)/判断是否运算符2)Identifier类功能:识别单词的核心类主要函数:string isID(string str, ref int i)/是否是标识符string isSixteen(string str, ref int i,out bool right)/是否16进制数string isEight(string str,ref int i,out bool right)/是否8进制数string isNumber(string str, ref int i, out bool right)/是否是常数string isOperator(string str, ref int i, out bool right)/是否是运算符string isNote(string str, ref int i, out bool right)/是否注释string isBoundary(string str, ref int i,out bool right)/是否界符string isChar(string str, ref int i, out bool right)/是否字符常数3) FirstAndFollow类功能:得到first集、follow集、select集、预测分析表public void getFirstCollection()/得到first集合public void getFollowCollection()/得到follow集合public void getSelectCollection()/得到预测分析表public void getAnalysisTable(string str1, string str2, string str3)/得到预测分析表public void errorHandle()/加入同步词法单元4) CStack类功能:栈结构public bool isEmpty()/判断栈是否为空public void push(object item)/往栈中加入一个元素public object pop()/从栈中弹出一个元素public object peek()/返回栈顶对象5) Form类public void analysis(string str)/词法单元识别public void parse()/语法单元识别private void 导入文法ToolStripMenuItem_Click(object sender, EventArgs e)/导入文法private void 显示语法分析树ToolStripMenuItem_Click(object sender, EventArgs e)/输出语法分析树private void addListview1Item()/输出first集和follow集private void addListview3Item()/输出预测分析表ü 程序核心部分的程序流程图语法分析核心部分流程图: 四、系统实现及结果分析得分要求:对如下内容展开描述。(1) 系统实现过程中遇到的问题;实现过程中主要遇到的问题有:1) 如何修改文法使其时LL(1)文法通过对文法的修改,主要是对文法消除左递归,消除二义性,以及提取公因式等,最终对于相同左部的产生式他们的select集不相交,得到了LL(1)文法。 2)如何得到文法符号的first集 对于终结符,其first集就是本身,但是对非终结符,在遍历的时候依赖于其他的非终结符,于是我采用循环遍历的方法,如果当前某个非终结符的first集依赖于其他非终结符,且其他非终结符的first集还没有求出来,则跳过当前的非终结符求下一个非终结符的first集,直到其依赖的非终结符的first集求出来后再求解。直到所有的非终结符的first集求出来后,循环结束,就得到了所有文法符号的first集合。 3)如何得到非终结符的follow集 为了使思路清晰,我采用两遍遍历的方式来求非终结符的follow集。 第一遍之后,所有非终结符都将得到一个暂时的follow集(不是最终的follow集),第二遍的目标就是发现其中是否有非终结符的follow集发生了改变,如果改变,则继续遍历整个文法,直到没有新的符号加入follow集中。 求follow集的具体思想就是: 不断应用下列规则,直到没有新的终结符可以被加入到任何FOLLOW集合中为止Ø 将$放入FOLLOW( S )中,其中S是开始符号,$是输入右端的结束标记Ø 如果存在一个产生式AB,那么FIRST ( )中除 之外的所有符号都在FOLLOW( B )中Ø 如果存在一个产生式AB,或存在产生式AB且FIRST ( ) 包含,那么 FOLLOW( A )中的所有符号都在FOLLOW( B )中 4)如何根据预测分析表进行语法分析 这里主要依赖于栈的结构,将经过词法分析得到的词法单元压入输入栈,将文法起始符号压入文法栈,然后根据预测分析表得到各个产生式进行语法分析。(2) 输出该句法分析器的分析表;因为预测分析表实在是过于庞大,因此本处分段截取预测分析表,下面的表是接在上面表的右侧。(3) 针对一测试程序输出其句法分析结果;测试程序:语法分析结果:语法分析树:(4) 输出针对此测试程序对应的语法错误报告;带错误的测试程序:语法错误报告:(5) 对实验结果进行分析。总结: 本语法分析器具有强大的语法分析功能l 允许变量的连续声明,比如int a,b,c;l 允许声明的同时赋值,比如string c = “你好”;l 允许对数组的声明和引用,同时进行赋值,比如char4 a = a,b,c,d;a0 = m;l 支持多种类型的声明和赋值,比如int,short,long,flaot,double,char,string,boolean的声明和赋值;l 允许声明和使用一个过程函数,比如:/*过程声明,声明一个求两个整数和的函数*/proc int addSum(int a,int b) int c,d; c = a;/*变量之间的赋值*/ d = b; return c+d;/*支持返回值以表达式的形式*/call addSum(1,2);/*函数调用功能*/l 允许声明一种数据结构,比如:/*记录声明*/record stack int a;/*表示位置*/ char c;/*表示取值*/ 强大的错误处理能力:l 能够识别非法字符,如:中文,中文的标点符号;l 能够弹出多于的输入字符,如:int a = 1*;l 能够处理词法单元的错误,比如:错误的16进制数,错误的字符串,错误的字符常数,错误的常数,错误的注释,错误的8进制等;l 能够判断是否缺少分量,比如:int a /*此处缺少分号*/,能够给出提示缺少分号;l 能够进行括号的匹配等,比如:只有左括号无右括号,只有右括号无左括号等,都能进行识别和提醒;l 在栈顶的输入符号与文法栈中的符号不匹配时能够根据同步词法单元来弹出非终结符等,继续进行语法分析;l 当连续不匹配出现错误时,比如某一行连续错误,能够在下一行重新开始语法分析,避免因为某一行的连续错误导致语法分析停止。注:其中的测试样例需先用已编写的词法分析程序进行处理。指导教师评语:日期: 专心-专注-专业

    注意事项

    本文(编译原理实验报告-语法分析(共25页).doc)为本站会员(飞****2)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

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

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

    收起
    展开