《编译原理实验报告语法分析》由会员分享,可在线阅读,更多相关《编译原理实验报告语法分析(12页珍藏版)》请在金锄头文库上搜索。
1、.编译原理课程实验报告实验2:语法分析院系软件学院*任课教师指导教师实验地点软件学院三楼机房实验时间2016/10/30/星期日实验课表现出勤、表现得分实验报告得分实验总分操作结果得分一、需求分析得分要求:采用至少一种句法分析技术LL(1)、SLR(1)、LR(1)或LALR(1)对类高级语言中的根本语句进展句法分析。阐述句法分析系统所要完成的功能。 本语法分析器是在词法分析器的根底上实现对类高级语言中的根本语句进展句法分析,根本功能如下:1能识别以下几类语句: 声明语句包括变量声明、数组声明、记录声明和过程声明 表达式及赋值语句包括数组元素的引用和赋值 分支语句:if_then_else 循
2、环语句:do_while 过程调用语句2本语法分析器采用自顶向下的分析技术,能根据导入的文法,自动计算first集和follow集,能够生成每个产生式的select集,并自动生成预测分析表。3本语法分析器具备语法错误处理能力,可以进展错误检测,如果检测到在出错时,采用恐慌模式,能够给出错误提示信息,格式:错误项 错误原因 行号a)忽略输入中的一些符号,直到输入中出现选定的同步词法单元集合中的*个词法单元,同步集合的选取是非终结符的follow集;b)如果终结符在栈顶而不能匹配,弹出此终结符。c)输入栈中缺少*些应有的符号,比方只有右括号没有左括号等,会给出相应的提示。4系统的输入形式多样:可以
3、通过文件导入文法和测试用例,可以通过用户界面显示并编辑测试用例。测试用例涵盖了第1条中列出的各种类型的语句,并设置了一些语法错误。5系统的输出分为两局部:一局部是打印输出语法分析器的FIRST集、FOLLOW集、select集和LL(1)分析表。另一局部是打印输出语法分析结果。 6本系统还实现了输出语法分析树的功能,让语法分析的过程更清晰。二、文法设计得分要求:给出如下语言成分的文法描述。 声明语句包括变量声明、数组声明、记录声明和过程声明 表达式及赋值语句包括数组元素的引用和赋值 分支语句:if_then_else 循环语句:do_while 过程调用语句 本语法分析器主要针对C语言进展文法
4、设计,下面给出各语言成分的文法描述。 程序入口:Program-P P-D P /支持连续声明 P -S P P-1) 声明语句:D proc id ; D S|T id; /支持过程声明和变量声明T * C | recordD/支持构造体声明* 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) 控制流语句:
5、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 callid (Elist)Elist Elist, EElist E 下面给出整个程序的无二义性,无左递归的LL1文法:Program-PP-D P|S P|emptyD-proc T id ( M ) P |T id A ;|record id P M-* id MM-, * id M|empt
6、yA-= F|empty|, id AF-digit|id|char| G |stringG-H GG-, H G|emptyH-digit|charT-* C*-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 LL- digit L|emptyB-
7、! B B|( B ) B|E relop E B|true B|false BB-or B B|and B B|emptyrelop-|=Elist-E ElistElist-, E Elist|empty 注:此处用empty代表空三、系统设计得分要求:分为系统概要设计和系统详细设计。(1) 系统概要设计:给出必要的系统宏观层面设计图,如系统框架图、数据流图、功能模块构造图等以及相应的文字说明。1系统的数据流图:说明说明:本语法分析器是基于上一个实验词法分析器的根底上,通过在界面写或者是导入源程序,词法分析器将源程序识别的词法单元传递给语法分析器,语法分析器验证这个词法单元组成的串是否可以
8、由源语言的文法生成,能够输出语法分析的结果,文法的first集、follow集和预测分析表,当然也可以以易于理解的方式报告语法错误。2) 系统框架图本系统框架主要是三局部,一局部是词法分析,负责识别源程序的词法单元识别,并将其存储,以供语法分析时读取;第二局部是文法分析局部,负责将导入的文法进展分析,得出文法的first集和follow集,以及自动构造出预测分析表,在语法分析时进展查询;第三局部是用户界面,提供源程序输入功能,以及语法分析结果的显示,显示语法分析树,还有first集、follow集和预测分析表的展示。2系统详细设计:对如下工作进展展开描述 核心数据构造的设计核心数据构造主要有两
9、种:1) Tuple三元组为了存储预测分析表,我使用Tuple三元组的数据构造,分别存储产生式的头部,产生式体,输入符号。2) Stack栈为了能够在语法分析时根据预测分析表来进展分析,我写了一个CStack的类用来实现栈的数据构造,在进展语法分析时,一个栈用来存储文法符号,一个栈用来存储输入符号,然后根据预测分析表进展语法分析。 主要功能函数说明主要功能函数:1) IDContent类:功能:充当符号表的角色,主要是用来保存关键字,运算符,界符,转义字符等各类单词。主要函数:bool isConstCh(string str)/判断是否转义字符bool isLetter_(char c)/判
10、断是否字母或下划线bool isDigit(char c)/判断是否数字bool isBlank(char c)/ 判断是否是空格、制表符、换行、回车bool isKeyWord(string str)/判断是否关键字bool isBoundary(char c)/判断是否是边界符号bool isOperator(string ch)/判断是否运算符2Identifier类功能:识别单词的核心类主要函数:string isID(string str, refint i)/是否是标识符string isSi*teen(string str, refint i,outbool right)/是否1
11、6进制数string isEight(string str,refint i,outbool right)/是否8进制数string isNumber(string str, refint i, outbool right)/是否是常数string isOperator(string str, refint i, outbool right)/是否是运算符string isNote(string str, refint i, outbool right)/是否注释string isBoundary(string str, refint i,outbool right)/是否界符string i
12、sChar(string str, refint i, outbool right)/是否字符常数3) FirstAndFollow类功能:得到first集、follow集、select集、预测分析表publicvoid getFirstCollection()/得到first集合publicvoid getFollowCollection()/得到follow集合publicvoid getSelectCollection()/得到预测分析表publicvoid getAnalysisTable(string str1, string str2, string str3)/得到预测分析表pu
13、blicvoid errorHandle()/参加同步词法单元4) CStack类功能:栈构造publicbool isEmpty()/判断栈是否为空publicvoid push(object item)/往栈中参加一个元素publicobject pop()/从栈中弹出一个元素publicobject peek()/返回栈顶对象5) Form类publicvoid analysis(string str)/词法单元识别publicvoid parse()/语法单元识别privatevoid导入文法ToolStripMenuItem_Click(object sender, EventArg
14、s e)/导入文法privatevoid显示语法分析树ToolStripMenuItem_Click(object sender, EventArgs e)/输出语法分析树privatevoid addListview1Item()/输出first集和follow集privatevoid addListview3Item()/输出预测分析表 程序核心局部的程序流程图语法分析核心局部流程图:四、系统实现及结果分析得分要求:对如下内容展开描述。(1) 系统实现过程中遇到的问题;实现过程中主要遇到的问题有:1) 如何修改文法使其时LL1文法通过对文法的修改,主要是对文法消除左递归,消除二义性,以及提取公因式等,最终对于一样左部的产生式他