- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
* 3.5 自下而上语法分析 定义3.19 对所有属于项目集I、且形如[A→α.Xβ]的项目,令X∈N∪T,则goto(I,X)是所有形如[A→αX.β]的项目。 设J = goto(I,X),K = closure(J),K中项目A→α.β分为两类: J = goto(I,X): α非空,因为至少有一个X。 K - J: α=ε,.在产生式右部最左边,由某个J计算而来 定义3.20 项目[S‘→.S]和所有“.”不在产生式右部最左边的项目称为核心项目(kernel items),其它“.”在产生式右部最左边的项目(不包括[S’→.S])称为非核心项目(nonkernel items)。 核心项目:J = goto(I,X)加S→.S(作为项目集的代表) 非核心项目:closure(J) - J(可由某J计算得到) closure(J) - J: B → .β J: A → αX.β S → .S * 算法3.9 计算文法G的、基于LR(0)项目的、识别活前缀的DFA 输入 拓广文法G 输出 DFA=(C, Dtran) -- C是状态集,Dtran是状态转移 方法 I := closure(S→ .S);加入I到C中,且未标记;--初态 while C中还有未标记状态I --考察未标记状态 loop 标记I; for I状态下的每个文法符号x --考察所有x loop if J := closure(goto(I,x))非空 --有下一状态 then Dtran[I , x] := J; --记录下一状态转移 if J不在C中 --新状态待考察 then 加入J到C且未标记; end if; end if; end loop; end loop; * 3.5 自下而上语法分析 构造DFA: ① 计算DFA的初态,I0=closure({E→.E}) ② 计算所有状态的所有状态转移,即考察每个未标记状态Ii的 (closure(goto(Ii,x))) * 3.5 自下而上语法分析 如何识别活前缀 定义3.21 若存在最右推导S=*αAω=αβ1β2ω,则称项目[A→β1.β2] 对活前缀αβ1有效。 项目A→β1.β2对活前缀αβ1有效,具有两层含义: 从文法开始符号,经αβ1可到达该项目; 在当前活前缀的情况下,该项目可指导下一步分析动作(αAω=αβ1β2ω)。 活前缀与项目的关系: 一个项目可能对若干个活前缀有效:项目A→β1.β2对所有从初态出发可以到达此项目的路径上的标记均有效。 若干个项目可能对同一个活前缀有效:项目集中的所有项目对同一活前缀均有效。 * 3.5 自下而上语法分析 I5:F→-.F对活前缀“T*-”、“E--”和“-”都有效。 I5:F→-.F、F →.-F和F →.id对T*-均有效: * 3.5 自下而上语法分析 综合可知: 同一项目集中的所有项目,对此项目集的所有活前缀均有效。即项目集中的每个项目均有同等权利指导下一步动作。 有效项目的意义是: 到目前为止分析是正确的; 指导下一步的分析: A→β1.β2(可移进项):移进β2中第一个终结符 B→β.(可归约项):按产生式B→β归约 * 3.5 自下而上语法分析 SLR(1):项目集中的冲突和解决冲突的简单方法 若上述构造的DFA中没有冲突,则文法是LR(0)的。 否则有一个项目集中存在: A→β1.β2和B→β1.:既可移进又可归约,移进/归约冲突 A→α.和B→α.:均可指导下一步分析,归约/归约冲突 解决方法:简单向前看一个终结符 移进/归约冲突:若FIRST(β2)∩FOLLOW(B)=Φ,冲突可解决 归约/归约冲突:若FOLLOW(A)∩FOLLOW(B)=Φ,冲突可解决 若冲突可以解决,则称文法为SLR(1)文法,构造的分析表为SLR(1)分析表。否则需寻求能力更强的文法,即寻求新的项目集(LR(1)项目集)。 * I1、I2、I9,均有移进/归约冲突。 它不是LR(0)的,但是SLR(1)的,因为: I1: FIRST(-T)∩FOLLOW(E)=Φ I2、I9: FIRST(*F)∩FOLLOW(E)=Φ FIRST(F) = {-, id} FIRST(T) = {-, id} FIRST(E) = {-, id} FIRST(E)= {-, id} FOLLOW(E)= {#} FOLLOW(E) = {-, #} FOLLOW(T) = {*, -, #} FOLLOW(F) = {*, -, #} * SLR分析表的构造 算法3.10 构造SLR分析表 输入 基于G的LR(0)项目集的、识别活前缀的DFA=(C, Dtr
文档评论(0)