- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第四部分第五-七章(语法分析)
第四部分 语法分析 第四部分内容 一、语法分析是编译过程的核心部分 语法分析的任务:按照文法,从源程序符号串中识别出各类语法成分,同时进行语法检查,为语义分析和代码生成做准备。 语法分析程序的定义:执行语法分析任务的程序称为语法分析程序,也称为语法分析器,它是编译程序的主要部分之一。 语法分析方法的分类:分成两大类。 自顶向下分析和自底向上分析。 二、语法分析的数学模型——下推自动机 (1)下推机的逻辑结构 PDA的读、写、状态转移动作决定于以下三个因素: 当前所处状态 读头所指符号 下推栈栈顶符号 一个输入串能为PDA所接受,仅当输入串读完,下推栈变空;或者输入串读完,控制器到达某些终态。 (2)下推机的定义 下推自动机是一个七元组M=(Q, Σ,H, δ,q0,z0,F),其中: Q是控制器的有限状态集; Σ是输入字母表; H是下推栈内字母表; δ是Q×(Σ∪{ε})×H到Q×H*的有限子集映射; q0∈Q是控制器的初始状态; z0∈H是下推栈的栈初始符; F为Q的子集,是控制器的终态集。 (3)说明 映射函数δ描述PDA动作与状态的变化 δ(q,a,z)={(q1,γ1),(q2,γ2),…,(qn,γn)} 其中q,qi(1≤i≤n) ∈Q,a∈Σ*,z∈H 含义:控制器当前状态为q,下推栈栈顶符号为z,输入符号为a(可为空)情况下,状态转换到序偶集(qi,γi), qi为下一状态, γi为代替z的栈顶符号串。 映射函数δ不是单值映射,且下推机有两种接受状态:串读完进入终态和串读完栈空。 例子:LL(1)语法分析器与PDA的对应关系 设CFG G=(VN ,Σ,P,S),构造一个不确定的PDA M=(Q,Σ,H,δ,q0 ,z0 ,F),其中Q=F={q0} ;H=VN∪ Σ;z0=S; δ映射关系的构造方法如下: 对于形如A?ω 产生式,有δ(q,ε,A)=(q,ω), δ(q,a,a)=(q, ε)其中a∈Σ。 4.1 自顶向下分析方法 4.1.1 带回溯的自顶向下的分析方法 思路:对任一输入符号串,通过一切可能的办法,从树根结点(识别符号)出发,根据文法自上而下地为输入串建立一棵语法树;或者说,从识别符号开始,根据文法试图为输入串建立一个推导序列。 特点:是自顶向下分析的一般方法,分析过程的本质是一种试探过程。 以上文法没有左递归,且有以下两个特点: (1)每个产生式的右部都由终结符号开始。(2)如果两个产生式有相同的左部,那么它们的右部由不同的终结符开始。 以上文法没有左递归,且有以下特点: (1)产生式的右部不全是由终结符开始。(2)如果两个产生式有相同的左部,其右部是由不同的终结符或非终结符开始。(3)文法中无空产生式。 以上推导过程的特点:在第二步到第三步的推导中,即abAS = abS时,因为当前输入符号为d,而最左非终结符A的产生式右部的开始符号集合都不包含d,但A可以推出空,所以d的匹配任务就只能依赖于A后面的符号,所以 选用产生式“A ?空”进行推导,句型中紧跟A后面的符号为S,S产生式右部的开始符号中包含了d,所以可匹配。 假定有文法G[S]: (1) S::=cAd (2) A::=ab | a 对输入串w=cad。要求自上而下地构造w的语法树。 解决过程: 分析: 通过上述解答过程可以看出:自顶向下地为输入符号串w建立语法树的过程实际上就是设法建立w的一个最左推导序列。比如对于上例中的输入串w可以通过如下的推导过程将其推导出来: S=cAd=cad 由于对输入串是自左向右扫描的,因此用最左推导,只有用最左推导,才能保证按扫描顺序去匹配输入串。 问题: 缺陷:不能处理左递归文法(教材P88图5.6、图5.7)。 缺点:存在回溯,算法效率低。 (另:更多例子参阅教材P91) 4.1.2 存在的问题及解决方法 一、左递归问题 ①直接左递归 ②间接左递归 二、回溯问题 实现不带回溯的自顶向下分析的条件 ① 文法非左递归 ② 首符号集不相交 (一) 左递归问题(P88) ① 直接左递归 自顶向下分析方法不能处理具有左递归性的文法的原因: 例如∶规则U::=U…是一条左递归规则,为了实现用U…匹配输入串,又会遇到要用U去匹配。故又要启用上述规则的右部符号串U…来完成匹配工作。如此循环下去而无法终止。 方法:用第二章中介绍的重复和选择表示法(扩充的BNF表示)去改写左递归规则。 例如: 规则: E::=E+T | T 改写为: E::=T{+T} 规则: T::=T*F|T/F|F 改写为:
文档评论(0)