当前位置:文档之家› 自下而上语法分析-LR..

自下而上语法分析-LR..


编译原理
长春工业大学计算机科学与工程学院
LR分析表的构成
状 态 动作表ACTION a1 a2 … # 状态转换表GOTO X1 X2 … Xk
S1 S2
. . .
Sn
编译原理
长春工业大学计算机科学与工程学院
分析表的动作部分:ACTION[Si,aj]表示当
分析状态栈的栈顶为Si,输入符号为aj时应执 行的动作; 表中GOTO[Si,Xj]指出栈顶状态为Si,碰到文 法符号为Xj时应转到的下一状态; 动作有下列四种: 移进(Sn),归约(R),接受(A),报错(E)
编译原理
长春工业大学计算机科学与工程学院

后继符号有多种,据此将项目分为多种:
后继符号为终结符: Aα·aβ, 称为移进项目; 后继符号为非终结符:Aα·Bβ, 称为待约项目; 后继符号为空:即圆点在最右边Aα·, 称为归约项目; 归约项目的左边是文法的开始符号Sα· , 称为接受项目。

编译原理
长春工业大学计算机科学与工程学院
有文法G∶E→T|E+T|E-T, T→i|(E), 找规范句型E+(i-i)的活前缀和 可归前缀。 解:首先画出E+(i-i)的语法树 可找出第一个i是句柄,那么 λβ=E+(i ,t=-i) 因此活前缀为:E,E+,E+(, E+(i,其中E+(i是可归前缀。
长春工业大学计算机科学与工程学院
LR(0) 项目集规范族的说明
如果LR(0) 项目集规范族中的每个项目集看 做FA一个状态,则项目集规范族的GO函数 把这些项目集连接成一个DFA。 令I0(CLOSURE({S’→.S}))为DFA的初态,则该 DFA就是恰好识别文法所有活前缀的有限自 动机。 结论:对于任一文法G,关于该文法的LR(0) 项目集规范族的GO函数定义了一个识别文法 所有活前缀的DFA。
编译原理
长春工业大学计算机科学与工程学院
活前缀与有效项目的关系
同一项目可能对多个活前缀是有效的 对同一活前缀,可能存在多个有效项目

编译原理
长春工业大学计算机科学与工程学院
活前缀有效项目的结论
一个活前缀w的有效项目集,正是由识别文 法所有活前缀的DFA的初态出发,经由标记 为w的路径所到达的那个项目集。 语法分析过程中,栈中的活前缀的有效项目 集就是栈顶的状态所代表的那个项目集。

后继符号集:项目集中各项目的后继符号所组成的 集合称为后继符号集。 例如:项目集{ E E · +T , F ·i }的后继符 号集为{+,i}
编译原理
长春工业大学计算机科学与工程学院

可以由文法的所有LR(0)项目,构造识别文法 所有活前缀的FA。在此构造过程中,需要对 文法进行拓广,并利用CLOSURE函数和GO 函数。
编译原理
长春工业大学计算机科学与工程学院
LR(0) 项目集规范族构造算法
ITEMSETS(G’); { C={CLOSURE({S’→.S})}; 重复以下操作: 对C中每个项目I和I中每个紧接“.”的文法符号 x If GO(I,x)非空且不属于C then 将GO(I,x)加到C 直到 C不再增大; }
E
E
+

T
E )
E
T i
-
T
i
编译原理
长春工业大学计算机科学与工程学院




活前缀意味着,当前还未形成句柄,或刚刚形成句 柄。 在活前缀的右边添上一些终结符号后,总可以构成 一个规范句型。 LR识别过程中,栈里面的符号就是一个活前缀。栈 里面的符号添加上适当的终结符号串就可以得到一 个句型。 在任何时候,只要输入串已扫描过的部分能构成一 个活前缀,则意味着所扫描过的这一部分没有错误。
• 一个LR分析器由3个部分组成:
编译原理
长春工业大学计算机科学与工程学院
总控程序根据分析表的内容来决定其下一步 的处理动作,分析表是根据具体的文法按某 种规则构造出来的。 LR方法:根据具体文法的分析表对输入串进 行分析处理。 LR分析过程:在总控程序的控制下,从左到 右扫描输入符号串,根据分析栈中的状态和 当前输入符号,按分析表中的内容完成相应 的分析工作。
编译原理
长春工业大学计算机科ห้องสมุดไป่ตู้与工程学院
项目集I的闭包CLOSURE(I)

设I是文法G的任一项目集,则定义和构造 CLOSURE(I)的规则如下:
① 属于I的任何项目也属于CLOSURE(I); ② 若A → α .Bβ 属于CLOSURE(I),那么,对于 任何关于B的产生式B→γ ,项目B→ .γ 也属于 CLOSURE(I); ③ 重复执行以上两步,直到CLOSURE(I)不再增大 为止。
编译原理
长春工业大学计算机科学与工程学院
GO(I,X)函数
用于定义项目集之间的转换。 定义:设I是一个项目集,X是任一文法符,则 GO(I,X)定义为:

GO(I,X)=CLOSURE(J), 其中J={任何具有[A → αX.β]的项目| [A → α.Xβ]
∈I}
I:A→α·Xβ
X
J: A→αX·β
编译原理 文法符号: X1X2…Xm是目前 已移进并归约出的句型部分。 其实它是多余的,已经概括到 状态里。
长春工业大学计算机科学与工程学院
状态栈:(S0,#)为预先放到 栈中的初始状态和符号。
分析器实际上是一个带有先进后出栈的确定的有穷自动机。将 • LR分析程序,又称总控程序。所有的LR分析器都是相同的。 “历史”和“展望”综合成“状态”,分析栈用来存放状态, 状态概括了从分析开始直到某一归约阶段的全部历史和展望资 • 分析表(分析函数),不同的文法分析表不同,同一个文法采用的LR分 析器不同时,分析表也不同,分析表又可分为动作表 (ACTION) 和状 料,不必象算符优先分析法中要翻阅栈中的内容才能决定是否 态转换(GOTO)表两个部分,它们都可用二维数组表示。 要进行归约。只需根据栈顶状态和输入符号就可以唯一决定下 一个动作。 • 分析栈,包括文法符号栈和相应的状态栈,它们均是先进后出栈。
2 3
02 023
#( #(a
a)# )#
S3 R2
4 5
024 0245
#(A #(A)
)# #
S5 R1
6
01
#A
# ACCEPT
编译原理
长春工业大学计算机科学与工程学院
LR文法:对一个文法,如果能够构造一个分 析表,且它的每个入口均是唯一的 如何构造LR分析表?

编译原理
长春工业大学计算机科学与工程学院
编译原理
开始
长春工业大学计算机科学与工程学院
初始状态0和#入栈 读符号 根据栈顶状态和输入符号 查分析动作表 Y 归约 ? N
按产生式i归约 根据产生式i的右部符 号的个数,符号栈和 状态栈相应元素出栈 产生式i的左部 符号入栈 查状态转换表 新状态入状态栈
移进 ?
Y
N 接受 ? Y 分析结束 N
编译原理
长春工业大学计算机科学与工程学院
项目集闭包的例子
文法: 0. E ’→E 3. T→T*F 6. F→i 1. E→E+T 4. T→F 2. E→T 5. F→(E) I={[E ’ →.E]} CLOSURE(I)还包含以下项: [E→.E+T] [E→.T] [T→.T*F] [T→.F] [F →.i] [F →.(E)]
输入符号入符号栈
状态i入状态栈
错误
读符号
LR的分析流程
编译原理
长春工业大学计算机科学与工程学院
利用分析表分析符号串 (a)
步骤 状态栈 符号栈 输入串 1 0 # (a)# ACTION S2 GOTO 说明 开始时,0入状态栈,#入符号栈,输 入符号为(,查动作表0行(列为S2,2 入状态栈,(入符号栈。 输入符号为a,查动作表2行a列为S3, 3入状态栈,a入符号栈。 4 输入符号为),查动作表3行)列为R2, 用A→a 归约,a 出符号栈、A入符号 栈,3出状态栈、2为栈顶,查GOTO 表2行A列得4,4入状态栈。 输入符号为),查动作表4行)列为S5, 5入状态栈,)入符号栈。 1 输入符号为#,查动作表5行#列为R1, 用A→(A) 归约,(A)出符号栈、A入 符号栈,245出状态栈、0为栈顶,查 GOTO表0行A列得1,1入状态栈。 输入符号为#,查动作表1行#列为 ACCEPT,接受。

编译原理
长春工业大学计算机科学与工程学院
LR(0)项目

A → xyz的LR(0)项目: A → .xyz A → x.yz A → xy.z A → xyz.

项目集:若干个项目组成的集合称为项目集。 例 如:对于上述产生式的4个项目即构成一个项目集。 后继符号:在项目中紧跟在符号“·”后面的符号称 为该项目的后继符号。 后继符号表示下一时刻读 到的符号。
编译原理
长春工业大学计算机科学与工程学院
LR(0) 项目集规范族定义

定义:构成识别一个文法活前缀的DFA的项 目集(状态)的全体称为这个文法的LR(0) 项目集规范族。
编译原理
长春工业大学计算机科学与工程学院
文法G的拓广文法

文法G[S]的拓广文法:
G’[S’]=G[S]+{S’ → S}

拓广的原因:使得语法分析有唯一的“接受” 项目:S’ → S.
编译原理
长春工业大学计算机科学与工程学院
LR分析器的关键就是构造分析表。文法G: 0)S→A,1)A→(A),2)A→a 的分析表: 状态
( 0 1 2 3 4 5 R1 S2 R2 R2 S5 R1 R1 R1 S3 R2 R2 S2 ) ACTION a S3 ACCEPT 4 # GOTO A 1
相关主题