自上而下语法分析

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

输入串,栈和句型
由算法5.1构造的非确定的PDA的一个有趣
特性是由下面的定理表示出来的。
• 定理5.2 令(q,y,h)是某个文法G相关的 NDPDA的任意构形,其中输入串是xy,如果
(q,xy,S)├*(q,y,h)
• 那么xh是G的一个最左句型,换言之,S=* >xh(S是G的开始符号)。
• 上述定理反过来也成立:给定G中的任何句型xh,
U→ yU U → xU • 其中U是新引进的非终结符号。显然,这种 形式与原形式是等价的,即从A推出的符号串 是相同的。
• 直接左递归更一般的形式 U→ Ux1Ux2…Uxmy1y2…yn
其中,xi (i=1, 2, …, m) yi (i=1, 2, …, n), yj的头字符都不是U, xi 都不 是,则有
(3)B→(d|aBc)Bˊ
(4)Bˊ→bcBˊ|ε
5.2.4 消除所有左递归的算法
若一个文法不含形如A=+>A的推导,也不含有以ε为右部 的产生式,那么,执行下面的算法将保证消除该文法中的所 有左递归:
• U①n。将文法G的所有非终结符整理成某一顺序U1,U2,…, • ② for i:= 1 to n do
由行1
• (p,00,GGBBR) ├
或 ├(Q,001100,ε) 由行7(阻
(p,0,BGGBBR) 由行4
塞)
• (p,0,BGGBBR) ├
• (p,01100,BR) ├
(p,ε,BBGGBBR) 由行3a(阻塞)
(p,1100,BBR) 由行3a
或 ├(Q,ε,GGBBR) 由行
或 ├(Q,1100,R) 由行3b
例5.2 考虑文法
S→0S1|c 该文法描述语言0*c1*,其中0的个数和1的个 数相等。转换规则是:
• 1.δ(q,0,0)=(q,ε) • 2.δ(q,1,1)=(q,ε) • 3.δ(q,c,c)=(q,ε) • 4.δ(q,ε,S)={(q,0S1) ,(q,c)}(其中ε可
与任何合法输入符号匹配)
号;
• H 是有穷的下推栈字符表,它的每个元素称为一 个栈符号。
• q0∈Q 是该PDA的初态; • Z0∈H 是下推栈的初始符号; • F Q 是一个终态集(或接收状态集);它的每个
元素称为终态;(可空)。
5.1.1 PDA形式定义
• δ 是描述PDA动作与状态变化的。 PDA的动作可用δ定义式来表示为:
在前面,文法的产生式都是采用巴科斯范式(BNF)描述的, 它使得文法更严谨、简洁和清晰。为了消除文法的左递归, 需对巴科斯范式进行扩展,增加以下元符号:
• ① 花括号{ }
{x} :表示符号串x出现零次或多次。 {x}nm:n表示符号串x能重复出现的最大次数,m表示符号串x 能重复出现的最小次数。
• ② 方括号[ ]
回溯现象 侯选式:我们把文法中每个非终结符A的右 部(可能有多个)称为A的侯选式。
当某非终结符对应多个侯选式时,如果 其中有几个侯选式的右部左端第一个符号 相同,那么就会使得语法分析程序无法根 据当前的输入符号准确地决定选用哪个侯 选式来替换A,只能采用试探的办法,任选 某个侯选式去试探一次。如果不能导致最 终地匹配,只得再换另一个侯选式去试探, 这就造成了回溯现象。所以这种带回溯的 自顶向下分析法,实际上是采用了一种穷 尽一切可能选择的试探法。
1.重新改写文法
2.先将间接左递归变为直接左递归,然后再按上述方法消 除。
例(1)A→aB 用(1)(2)去替换(3)中的A可得:
(2)A→Bb
(1)B→aBc
(3)B→Ac
(2)B→Bbc
(4)B→d
(3)B→d
消除左递归后可得:
B→(d|aBc)Bˊ
Bˊ→bcBˊ|ε
最终文法为:
(1)A→aB
(2)A→Bb
第五章 自上而下语法分析
• 语法分析是继词法分析之后编译过程的第2阶 段。它的主要任务是对词法分析的输出结 果——单词序列进行分析,识别合法的语法 单位。
• 语法分析最常用的方法有:优先方法、递归 下降法、LL方法和LR方法。
• 所谓自上而下分析是指从树的根结点开始,为 给定的输入串构造一棵语法树。
5.1.3 上下文无关语言与PDA
• 定理5.1包含两方面含义: –给定一个上下文无关语言,存 在一个识别它的PDA M; –反过来,给定一个PDA M,可以 根据它构造出一个等价的上下文 无关文法。 前者对编译程序的构造很有吸引 力,但后者则不然。
算法5.1 从CFG到NDPDA
• 给定 CFG G=(N,∑,P,S) 可以构造 一个相应的非确定的PDA M:
A→Ay 称之为直接左递归产生式。
5.2.1 文法的左递归性
• 若其中y=ε,则有 A→xA
称之为直接右递归产生式。 • 若一文法中至少含有一条递归产生式,
或在用该文法推导符号串的过程中, 存在AA…或A…A或A…A…形式 的推导,则称该文法是(直接)递归的。
非确定的自顶向下分析存在的问题
• .非确定的自上而下的分析法:对任何输入 串W试图用一切可能的办法,从文法的开始 符号出发,自上而下地为它建立一棵语法 树。或者说,为输入串寻找一个最左推导, 如果试探成功,则W为相应文法的句子,否 则W就不是文法的句子。这种分析过程本质 上是一种穷举试探过程,反复使用不同的 规则,谋求匹配输入串的过程。
M=(Q,∑′,H,δ,q0, Z0,F) 它只有一个状态q和下面的转换规则: • ① 对P中每一个形如A→w的产生式,δ(q,ε,A)包含(q,w); • ② 对每个a∈∑,δ(p,a,a)包含(q,ε) 且
– Q={q}
– ∑′=∑ – H=N∪∑
– q0=q – Z0=S – F为终态集(可空)。 这个PDA停止于空栈。
5.1.2 PDA的 构形和移动
• PDA M 所识别的语言L(M)可表示为: L(M)= {ω*︱(P0,ω,Z0)├*(P,,)}(空栈接收)
或者 L(M)= {ω*︱(P0,ω,Z0)├*(P,,h) &pF}
(终态接收)
例5.1 考虑下表定义的两状态PDA,其的两个状态分别是p和 Q,δ(p,a,Z)={(p1,h1),(p2,h2),…},输入符号是0和1,栈符 号是R,B和G。该PDA识别由符号0和1组成的所有回文 (Palindrome) 。
• PDA的一次移动可看作是从一种构形变换成另一种 构形的一种方式。反过来,构形又为定义PDA的移 动提供了一种更简单的手段。我们称
(q,ax,Zh′)├(p,x,hh′)
是一次可能的移动,当且仅当(p,h)∈δ(q,a,Z) 。 • 常用├+表示由一次或多次移动组成的序列。用├*表
示由零次或多次移动组成的序列。注意“零”次移 动并不改变当前的构形。
δ(q,a,z)={(p1,h1),(p2,h2)…(pn,hn)} 它的含义为: • 在控制器当前状态为q,下推栈顶符号为z ,输
入符号为a的情况下,把控制器的状态改为 pi,用hi 替换栈顶的z,并让读头右移一格。
5.1.2 PDA的 构形和移动
PDA的一个构形是一个三元组:(q,w,h)
• 其中,q∈Q;w∈∑*是尚待扫描的输入串,包括读 头当前所指的符号;h∈H*是栈的内容。
3b(阻塞)
• (Q, 1100,R) ├(Q,1100,ε) 由行10(阻塞)
• (Q,00,BBR) ├(Q,0,BR) 由行8
• (p,1100,BBR) ├ (p,100,GBBR) 由行5
• (Q,0,BR) ├(Q,ε,R) 由行8
• (p, 100,GBBR)├ • (p,00,GGBBR) 由行6a
方括号用来表示可选项。[x] = x或,表示符号串x可出现一 次或不出现。可以用来定义某些高级语言中的“条件语句”。
• ③ 圆括号( )
利用圆括号可提出一个非终结符的多个产生式右部的公共因 子。例如,
A→xy|xw|…|xz 可写成 A→x(y|w|…|z)
利用下面的两条规则,可把包含直接左递归的产生式 转换成用扩展BNF表示法表示的产生式。 • ① 提公因子 每当一条产生式中有公因子可提的时候,就把它提出 来,若原产生式是 A→x|xy 则可写成 A→x(y|ε),这里把ε当作最后一个候选式。 • ② 若 A→x|y|…|z|Av 是一组产生式,且它只有一个直接左递归的右部位于 最后,则可把这组产生式变换成如下形式:

begin

for j:= 1 to i–1 do
• (Q,ε,R) ├(Q,ε,ε) 由行 10(接收)
5.1.3 上下文无关语言与PDA
联系PDA和上下文无关语言的一个重要 定理是: • 定理5.1 对每一个上下文无关语言L, 存在一个恰好识别L的非确定的PDA M, 反之亦然。 • 这个定理在编译系统中的实际重要性 在于:现有的大多数高级程序设计语 言都可用上下文无关文法描述。因此 定理5.1隐含了:识别这个语言的机械 识别器必是PDA。
U→ y1U y2U…ynU U → x1U x2U…xmU
• 消除左递归举例。
例如 :有文法:
S→Sa 可改写为:S→bSˊ
S→b
Sˊ→aSˊ|ε
表达式文法: 消除左递归后:ቤተ መጻሕፍቲ ባይዱ
E→E+T|T
E→TEˊ Eˊ→+TEˊ|ε
T→T*F|F
T→FTˊ Tˊ→*FTˊ|ε
F→(E)|i
F→(E)|i
• 消除间接左递归
• 其中规则1、2、3根据前面的规则②构造,4 根据规则① 构造。
使用例5.2分析句子
给定输入串00c11,所构造的PDA用下面的 移动序列来接收它(注意,我们可从构形 中省掉状态,因为它总是相同的): (q,00c11,S)├4a(q,00c11,0S1)├1(q,0c1 1,S1) ├4a(q,0c11,0S11)├1(q,c11,S11) ├4b(q,c11,c11)├3(q,11,11) ├2(q,1,1)├2(q,ε,ε) (接收)
• 回溯现象:在回溯之前,编译程序实 际已经做了大量薄记工作,包括语义 翻译工作在内。在回溯时,要清除这 些内容,然后开始重新薄记,这就降 低了分析效率。
• 左递归现象:回溯使语法分析器的动 作不稳定,左递归会使分析程序进入 到无穷的循环之中,这些问题都和描 述语言的文法有直接关系。
5.2.2 用扩展的BNF表示法消除左递归
A→(x|y|…|z){v} • 也就是说,使用上述规则①,可把产生式改写成相对
于某个非终结符而言,至多只含一个直接左递归的右 部;然后,利用上述规则②消除这个直接左递归。
5.2.3 直接改写文法
• 设产生式 U→ Uxy
此产生式称为直接左递归形式。其中,x和y 是两个符号串,y的首字符不是U。 • 产生式为直接左递归形式,可直接改写为一 个等价的非直接左递归形式
–②一个读头,它从左至右移动,每次读 进一个输入符号;
–③一个有穷状态自动机,用于控制整个 系统的操作;
–④一个后进先出下推栈,
下推自动机的非空移动:
5.1.1 PDA形式定义
形式上说,一个PDA是一个七元组:
(Q,∑,H,δ,q0,Z0,F) • Q 是状态的有穷集,它的每个元素称为一个状态; • ∑ 是有穷的字母表,它的每个元素是一个输入符
这个自动机是非确定的,因为在行3和行6包含了可供选择的 移动;也因为无输入符号(如在行7)时照样可进行移动,而 且此时存在相应的选择。该PDA的开始状态时p,初始栈内容 时R。它停止于空栈。用该PDA识别输入串001100,其识别过 程如下:
• (p,001100,R) ├(p,01100,BR) • 或 ├(Q,00,BBR) 由行6b
如果x是一个终结符串,而且h中至多最左符号是
终结符,那么,(q,y,h)是该NDPDA的一个构形,
而且
(q,xy,S)├*(q,y,h)
5.2 消除左递归方法
5.2.1 文法的左递归性
• 文法的左递归性属文法递归性的一种, 在一文法中,所有形如
A→xAy x,y ∈(∑∪N) *,A∈N
称为递归产生式(或自嵌入产生式)。 • 若其中x=ε,则有
• 本章中,我们通过讨论一个一般的非确定的自 上而下分析器来讨论上下无关语言的自上而 下分析器的设计。
5.1 非确定的下推自动机
• 下面所要构造的非确定的自上而下分析器 属于一般的下推自动机(PDA)类。
• 所谓一个下推或栈自动机(Stack Automaton),非形式地说,应包含:
–①一个输入符号串;
相关文档
最新文档