- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
编译原理课件CH0语法分析
第4章 语法分析 知识点:预测分析方法、LL(1)分析程序 移进-归约分析方法、LR分析程序 SLR(1)、LR(1)、LALR(1)分析表 §4 语法分析 简介 4.1 语法分析程序 4.2 自顶向下分析方法 4.3 自底向上分析方法 4.4 LR分析方法 4.5 软件工具YACC 小结 语法分析简介 语法分析是编译过程的核心部分 语法分析任务由语法分析程序完成 语法分析的工作依据是:语言的语法规则 本章内容安排: 首先讨论常用的语法分析方法和技术 自顶向下的方法 自底向上的方法 4.1 语法分析程序 语法分析程序的任务 从源程序记号序列中识别出各类语法成分 进行语法检查 语法分析程序的地位: 常用的分析方法 自顶向下的方法: 从树根到叶子来建立分析树 自底向上的方法: 从树叶到树根来建立分析树 对输入符号串的扫描顺序:自左向右 4.2 自顶向下分析方法 一、递归下降分析 二、递归调用预测分析 三、非递归预测分析 一、递归下降分析 从文法的开始符号出发,进行推导,试图推出要分析的输入串的过程。 对给定的输入串,从对应于文法开始符号的根结点出发,自顶向下地为输入串建立一棵分析树。 试探过程,是反复使用不同产生式谋求匹配输入串的过程。 因为对输入串的扫描是自左至右进行的,只有使用最左推导,才能保证按扫描的顺序匹配输入串。 递归下降分析方法的实现 文法的每一个非终结符号对应一个递归过程,即可实现这种带回溯的递归下降分析方法。 每个过程作为一个布尔过程,一旦发现它的某个产生式与输入串匹配,则用该产生式展开分析树,并返回true,否则分析树不变,返回false。 实践中存在的困难和缺点 左递归的文法,可能导致分析过程陷入死循环。 回溯 工作的重复 效率低、代价高:穷尽一切可能的试探法。 二、递归调用预测分析 一种确定的、不带回溯的递归下降分析方法 如何克服回溯? 对文法的要求 预测分析程序的构造 如何克服回溯? 能够根据所面临的输入符号准确地指派一个候选式去执行任务。 该选择的工作结果是确信无疑的。 例: A??1|?2|?|?i|? |?n 当前输入符号:a 指派?i去匹配输入符号串 对文法的要求 1. 不含左递归 例: 有如下产生PASCAL类型子集的文法:type?simple | ?id | array[simple] of typesimple?integer|char|num dotdot num (文法4.2)分析输入串:array [num dotdot num] of char type的三个候选式,有: FIRST(simple)={ integer, char, num } FIRST(?id)={ ? } FIRST(array[simple] of type)={ array } simple的三个候选式,有: FIRST(integer)={ integer } FIRST(char)={ char } FIRST(num dotdot num)={ num } 预测分析程序的构造 预测分析程序的转换图 转换图的工作过程 转换图的化简 预测分析程序的实现 预测分析程序的转换图 为预测分析程序建立转换图作为其实现蓝图 每一个非终结符号有一张图 有向边的标记可以是终结符号,也可以是非终结符号。 在一个非终结符号A上的转移意味着对相应A的过程的调用。 在一个终结符号a上的转移,意味着下一个输入符号若为a,则应做此转移。 从文法构造转换图 改写文法 重写文法 消除左递归 提取左公因子 对每一个非终结符号A,做如下工作: 创建一个初始状态和一个终结状态。 对每一个产生式A?X1X2…Xn创建一条从初态到终态的路径,有向边的标记依次为X1,X2,…,Xn。 例:为如下文法构造预测分析程序转换图 E→E+T|T T→T*F|F F→(E)|id (文法4.3) 消除文法中存在的左递归,得到 E→TE? E?→+TE?|? T→FT? T?→*FT?|? F→(E)|id (文法4.4) 为每个非终结符号构造转换图: 转换图的工作过程 从文法开始符号所对应的转换图的开始状态开始分析 经过若干动作之后,处于状态S 转换图的化简 用代入的方法进行化简 把E?的转换图代入E的转换图: 预测分析程序的实现 要求用来描述预测分析程序的语言允许递归调用 E的过程: void procE(void) { procT; if (char==?+?) { forward
文档评论(0)