- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
LR分析综述 分析综述
计算机理论研究已证明了如下结论: LR(k)文法是无二义性 无二义性文法; 无二义性 LR(k)文法与LR(1)文法等价 等价. 等价 由于常见的程序设计语言均能由LR(1)文法产生,因此我们只讨 论k=0,1两种情况; 本节中,我们将先介绍LR分析器的逻辑结构及工作原理,再分别 介绍几种LR分析器(即LR(0),SLR(1))的构造; LR(0)简单,能力低; SLR(1)能力强于LR(0);
文法符号:X1X2…Xm是 目前已移进并归约出的句 型部分.
状态栈:(S0,#)为预先 放到栈中的初始状态 和符号.
一个 分析器由 个部分组成: 一个LR分析器由 个部分组成: 一个 分析器由3个部分组成 LR分析程序,又称总控程序.所有的LR分析器都是相同的. 分析程序, 分析器都是相同的. 分析程序 总控程序.所有的 分析器都是相同的 分析表 分析函数 ,不同的文法分析表不同,同一个文法采用的 分析表(分析函数 不同的文法分析表不同,同一个文法采用的LR 分析表 分析函数), 分析器不同时,分析表也不同,分析表又可分为动作表 动作表(ACTION)和 分析器不同时,分析表也不同,分析表又可分为动作表 和 状态转换(GOTO)表两个部分,它们都可用二维数组表示. 状态转换 表两个部分,它们都可用二维数组表示. 分析栈,包括文法符号栈和相应的状态栈,它们均是先进后出栈. 分析栈,包括文法符号栈和相应的状态栈,它们均是先进后出栈. 分析栈
4.2.4
LR分析法 LR分析法
迄今为止我们所学的分析方法对文法都有一定的要求,即有局限 性; 1965年D.Knuth提出了分析效率极高的LR(k)分析技术; LR分析 自左至右扫描的自底向上的分析; LR分析 分析: 在分析的每一步,只须根据分析栈中的已移进的和已归约出的符 号,并至多向前扫描k个字符就能确定应采取什么分析动作(移进, 移进, 移进 归约,接受,报错); 归约,接受,报错 LR分析对文法要求很少,效率极高,且能及时发现错误,是目前最 广泛使用的方法;一般用CFG描述的语言均可用LR分析法 分析法
LR分析法 分析法
自底向上分析方法是一种移进-归约过程,当分析的栈 顶符号串形成句柄时就采取归约动作,因而自底向上 分析法的关键问题是在分析过程中如何确定句柄.LR 分析法正是给出一种能根据当前分析栈中的符号串(通 常以状态表示)和向右顺序查看输入串的K个(K≥0)符号 就可唯一地确定分析器的动作是移进还是归约和用哪 个产生式归约,因而也就能唯一地确定句柄.LR分析 法的归约过程是规范推导的逆过程,所以LR分析过程 是一种规范归约过程. 向前查看0个符号,就是LR(0)分析方法,向前查看1个 符号,就是LR(1)方法.
2. 分析表的组成: 分析表维数组 分析动作表 是一个
符号 状态 S0 S1 … Sn a1 a2 … … … … … at action[S0 , at] action[S1 , at] … action[Sn , at]
action[S0 , a1] action[S0 , a2] action[S1 , a1] action[S1 , a2] … …
自底向上分析法的关键问题是如何确定句柄.LR分 析法与算符优先方法一样,LR方法也是通过求句柄 逐步归约来进行语法分析. 在算符优先分析中,通过算符的优先关系得到句柄, LR方法中句柄是通过求活前缀而求得.
1,LR分析方法的逻辑结构 , 分析方法的逻辑结构
LR分析方法的基本思想 基本思想是:在规范归约过程中, 基本思想 一方面记住已移进和归约出的整个符号串(历史), 另一方面又根据所用产生式推测未来可能碰到的 输入符号(对未来的展望). 当某一符号串类似于句柄出现在栈顶时,需要根 据已记载的"历史","展望"和"现实"的输 入符号三方面的内容来决定栈顶的符号串是否构 成了真正的句柄,是否需要归约. 一个LR分析器的组成见下图.
符号 状态
x1
x2
…
… … … …
xt
goto[S0 , xt] goto[S1 , xt] … goto[Sn , xt]
S0 S1 … Sn
goto[S0 , x1] goto[S0 , x2] goto[S1 ,x1] goto[S1 , x2] … …
goto[Sn , x1] goto[Sn , x2]
移进: 移进:当前输入符号ai进符号栈,下一输入符号变成当前输入 符号,将action表中指出的状态S进状态栈.三元式变为:
(S0S1…SmS, # X1X2…Xmai, ai+1…an#)
归约: 归约:按某个产生式A→β进行归约,若产生式的右端长度为 r,则两个栈顶的r个元素同时出栈.将归约后的符号A进符号 栈; 根据新栈顶状态Sm-r和归约符号A查GOTO表, S=goto[Sm-r, A]进状态栈.三元式变为:
分析器实际上是一个带有先进后出栈的确定的 分析器 有穷自动机.将"历史"和"展望"综合成 状态",分析栈用来存放状态,状态概括了 "状态 状态 从分析开始直到某一归约阶段的全部历史和展 望资料,不必象算符优先分析法中要翻阅栈中 的内容才能决定是否要进行归约.只需根据栈 根据栈 顶状态和输入符号就可以唯一决定下一个动作. 顶状态和输入符号就可以唯一决定下一个动作
3 3
10
为了介绍LR分析过 为了介绍 分析过 程,直接给出该文法 的分析表, 的分析表,以后再介 绍如何生成 产生式
8 9 10 i
的序号
r 表示按第i个产 r3 r3 生式进行归约 11
r3 空白表示分
析动作出错 r5
根据上述分析表, 的分析过程如下: 根据上述分析表,对输入串 i * i + i 的分析过程如下: 序号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 状态栈 0 05 03 02 027 0275 02710 02 01 016 0165 0163 0169 01 符号栈 # #i #F #T #T* #T*i #T*F #T #E #E+ #E+i #E+F #E+T #E F→i → T→F → E →E+T F→i → T→T*F → E→T → F→i → T→F → 产生式 输入串 i*i+i# 0和#进栈 和 进栈 *i+i# i和S5进栈 和 进栈 *i+i# i和S5退栈 F和S3进栈 和 退栈 和 进栈 退栈, *i+i# F和S3退栈 T和S2进栈 和 退栈 和 进栈 退栈, i+i# *和S7进栈 和 进栈 +i# i和S5进栈 和 进栈 +i# i和S5退栈 F和S10进栈 和 退栈 和 退栈, 进栈 +i# F*T和S10,7,2退栈 T和S2进栈 退栈, 和 退栈 和 进栈 +i# T和S2退栈 E和S1进栈 和 退栈 和 进栈 退栈, i# +和S6进栈 和 进栈 # i和S5进栈 和 进栈 # i和S5退栈 F和S3进栈 和 退栈, 和 进栈 退栈 # F和S3退栈 T和S9进栈 和 退栈 和 进栈 退栈, # T+E和S9,6,1退栈 E和S1进栈 和 退栈, 退栈 和 进栈 说明
状 态
0 1
ACTION i表示转第i个状 i S5 + S6 r2 r4 S5 r6 S5 S5 S6 r1 r5 S7 r5 r6 S4 S4 S1 r1 r3 r5 r1
GoTo F 3
2 3 4 5 6 7
*态,即第i个状 E T ( ) # 态进状态栈. 1 2 S4 ac c Si表示把当前输入 S7 r2 r2 符号移进栈,第i个 r4状态进状态栈. r4 r4 S4 r6 r6 r1 9 8 2
(S0S1 … Sm-r S, # X1X2…Xm-rA, aiai+1…an #)
接受: 接受:分析成功,终止分析.三元式不再变化. 出错: 出错:报告出错信息.三元式的变化过程终止.
举例说明LR具体 举例说明 具体 分析过程: 分析过程:
设文法为G[L]: : 设文法为 (1) (2) (3) (4) (5) (6) E →E+T E →T T →T*F T →F F →(E) F →i
表中goto[Si,xj]指出栈顶状态为Si,碰到文法符号为Xj时应转 到的下一状态.
显然: 显然:分析表定义了一个以文法非终结符为字母表的 DFA
LR分析过程: 分析过程: 分析过程
用三元式: 用三元式
(状态栈,符号栈,输入符号 状态栈,符号栈,输入符号)
表示分析过程中状态栈,符号栈,输入符号的变化. 表示分析过程中状态栈,符号栈,输入符号的变化. 将初始状态 0和#进分析栈.三元式为: 将初始状态S 进分析栈. 进分析栈 三元式为:
LR分析表的优缺点
优点:
比其他"移进-归约"分析法,如算符优先分 析法使用更加广泛,识别效率高 能用LL(1)分析法分析的所有文法都能使用LR 方法来进行分析. LR分析法在自左至右扫描输入串的过程中就 LR 能发现其中的任何错误,并能准确地指出出错 位置.
缺点:
手工构造分析表工作量太大.必须使用自动生 成器.
总控程序根据分析表的内容来决定其下一步的处理 动作, 动作,分析表是根据具体的文法按某种规则构造出 来的. 来的.
LR方法:根据具体文法的分析表对输入串进行分析处 方法: 方法
理.
LR分析过程:在总控程序的控制下,从左到右扫描输 分析过程:在总控程序的控制下, 分析过程
入符号串,根据分析栈中的状态和当前输入符号, 入符号串,根据分析栈中的状态和当前输入符号, 按分析表中的内容完成相应的分析工作. 按分析表中的内容完成相应的分析工作.
LR(0)项目:在文法G中每个产生式的右部 项目: 右部适当位置 项目 右部 添加一个圆点构成项目. 例如:产生式 S→XYZ 对应有4个项目. → [0] S→●XYZ [1] S→X●YZ → → [2] S→XY●Z [3] S→XYZ● → → 产生式A 只对应一个项目: 产生式 →ε只对应一个项目: A →● 项目 项目指明了在分析过程的某时刻,已看到的产生式 部分 项目集: 项目集:若干个项目组成的集合称为项目集. 例如: 对于上述产生式的4个项目即构成一个项目集. 后继符号 : 在项目中紧跟在符号" ● "后面的符号 后继符号: 称为该项目的后继符号. 后继符号表示下一时刻读 到的符号.