编译原理语法分析实验报告详解.docx
文本预览下载声明
编译原理实验报告实验名称:编写语法分析程序实验类型:设计性实验指导教师:蒋勇专业班级:软件工程1401姓名:****学号:**********实验地点:东六E座301实验成绩:_________________日期: 2016年5月17日实验一编写词法分析程序实验目的:设计、编写、调试一个递归下降分析程序,实现对词法分析程序提供的单词序列进行语法检查和结构分析。掌握递归下降语法分析方法。巩固理论知识。实验设计:设计原理:对于文法的每一个非终结符U的文法规则是一个识别U的过程定义,为每一个非终结符构造子程序。如果U的右部符号串只有一个候选式则从左到右依次构造U的识别代码。如果U的右部符号串有终结符号,则判断输入的符号是否匹配终结符号,如果相等,则读入下一个符号;如果不相等,则有语法错误,应当报错。如果是非终结符号,则调用非终结符号的子程序即可。如果U的右部有多个候选式,应该根据每个候选式的第一个符号来确定该分支。对于含有ε表达式的文法规则需要判断输入的符号是否在U的FOLLOW集里面。设计方法:文法改造,消除二义性;对含有左递归或者左公因子的文法消除左递归,提取左公因子;求每一个右部符号串的FIRST集合,如果右部含有ε,则需要求出其产生式左部非终结符的FOLLOW集。判断文法是否是LL(1)文法,若不是LL(1)文法,说明文法的复杂性超过自顶向下方法的分析能力。根据改写后的文法设计程序,依据设计原理构造每一个非终结符的子程序。设计过程:改写文法、消除左递归(将左递归改为右递归)、提取左公因子;求出相应的First集和Follow集;设计程序流程图,设计程序;编写程序;框架思路,错误信息输出:对每一个非终结符构造其子程序,设定一个返回值。如果语法分析有错则返回1,没有错误就返回0;对于错误,在程序的相应行数报错。各个非终结符之间依据文法规则调用。每次遇到终结符函数都判断是否匹配当前终结符号,如果不匹配则报错,返回1。如果匹配,则读入下一个符号。实验过程本次实验的TEST语言语法规则:1)program→{declaration_liststatement_list}2)declaration_list→declaration_listdeclaration_stat | ε3)declaration_stat→int ID;4)statement_list→statement_liststatement| ε5)statement→ if_stat|while_stat|for_stat|read_stat |write_stat|compound_stat |expression_stat6)if_stat→ if (expr) statement | if (expr) statement else statement 7)while_stat→ while (expression) statement 8)for_stat→for (expression;expression;expression)statement9)write_stat→write expression;10)read_stat→read ID;11)compound_stat→{statement_list}12)expression_stat→ expression ;|;13) expression → ID=bool_expr|bool_expr14)bool_expr→additive_expr | additive_expr (||=|=|==|!=) additive_expr 15) additive_expr→ additive_expr+term| additive_expr-term| term 16) term → term *factor| term /factor| factor 17) factor →( expression )|ID|NUM将左递归改为右递归:2)declaration_list→declaration_listdeclaration_stat | ε改写后:declaration_list::=declaration_list1declaration_list1:=declaration_statdeclaration_list1|ε4)statement_list→statement_liststatement| ε改写后:statement_list::=statement_list1statement_list1::=statementstatement_list1|ε15) additive_expr→ additive_expr+term| additive_expr-term|
显示全部