- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
方法一:LR(0)分析表的构造步骤 方法一 LR(0)分析表的构造步骤 ①确定G的LR(0)项目 确定G LR(0)项目 ②以LR(0)项目为状态,构造一个能识别文法G的 LR(0)项目为状态,构造一个能识别文法G 项目为状态 所有活前缀的NFA 所有活前缀的NFA ③利用子集法,将NFA确定化,成为以项目集合为 利用子集法, NFA确定化, 确定化 状态的DFA根据 状态的DFA根据 DFA ④上述DFA可直接构造出LR分析表 上述DFA可直接构造出LR分析表 DFA可直接构造出LRFra bibliotek移进状态2
进行归约,即 进行归约,
(3) T T *F
例 利用上述分析表,假定输入串为 i * i + i ,描述LR分析器的工作过程。(续) 利用上述分析表, 分析器的工作过程。
状 态 (10) 016 ) (11) 0165 ) (12) 0163 ) (13) 0169 ) (14) 01 ) 符号 #E+ #E+i #E+F #E+T #E 输入串 i# # # # #
(2)归约 归约:设LR(0)分析表中的ACTION[mn,a]= rj, 归约 其中rj表示使用文法的第j个产生式A→x1x2…xp归 约;mn表示LR分析表的一个状态。 假设总控程序按S栈顶状态mn和现行输入符号a 查LR分析表,得 ACTION[mn,a]= rj 此时,S栈的状态为: m1,…,mn-p+1,…,mn 文法符号T栈的符号为: …x1x2…xp 按ACTION[mn,a]= rj 的要求:
2. 句型分析过程
设所给输入串为#i*i+i#,则总控程序分析此 输入串的过程,如表4-11所示,通过分析,说 明i*i+i是文法例4.4的句子。
例 利用上述分析表,假定输入串为 i * i + i ,描述LR分析器的工作过程。 利用上述分析表, 分析器的工作过程。
状 态 (1) 0 ) (2) 05 ) (3) 03 ) (4) 02 ) (5) 027 ) (6) ) (7) ) (8) ) (9) ) 符号 # #i #F #T 输入串 i*i+i# *i+i# *i+i# *i+i# i+i# +i# +i# +i# +i#
LR分析器总控程序 总控程序的工作十分简单,它的 总控程序 任一步只需按分析栈栈顶状态s和现行输入 栈顶状态s 栈顶状态 现行输入 符a执行ACTION[s,a]所规定的动作。 LR分析器的工作过程 LR 分析器的工作过程可看成是栈中状态 分析器的工作过程 序列、已归约串和输入串构成的三元式的 变化过程。
ACTION[1,#]=acc 接受输入串! 接受输入串!
LR文法 LR文法
①定义:对于一个文法,如果能够构造一张分 定义:对于一个文法, 析表,使得它的每个入口均是唯一确定的, 析表,使得它的每个入口均是唯一确定的,则 我们把这个文法称为LR文法。 LR文法 我们把这个文法称为LR文法。
LR( 文法:一个文法, ② LR(k)文法:一个文法,如果能用一个每 步顶多向前检查k个输入符号的LR LR分析器进行 步顶多向前检查k个输入符号的LR分析器进行 分析,则这个文法就称为LR(k)文法。 LR(k)文法 分析,则这个文法就称为LR(k)文法。
LR分析法 4.3 LR分析法
LR分析法是一种自下而上进行规范归约 规范归约的 规范归约 语法分析方法, L指自左向右扫描输入串, R指 最右推导(规范归约)。 LR分析法比递归下降分析法、LL(1)分析法 对文法的限制要少得多, 大多数无二义性CFG 无二义性CFG 无二义性 语言都可用LR分析器识别, 且速度快, 并能准 确、指出输入串的语法错误及出错位置。 LR分析法的主要缺点: 手工构造工作量相当大, 必须求助自动产生 工具。
B、句型的活前缀及文法的LR(0)分析表 句型的活前缀及文法的 分析表
①定义:文法G每一个产生式的右部添加一个圆点, 定义:文法G每一个产生式的右部添加一个圆点, 的一个LR(0)项目。设文法G LR(0)项目 称为 G的一个LR(0)项目。设文法G的某一产生式 为A→x1x2…xn,则A→x1…xi.xi+1…xn称为文法G A→x1x2…xn, A→x1…xi.xi+1…xn称为文法G 称为文法 的LR(0)项目。 LR(0)项目。 项目
给出下述文法G LR分析表 给出下述文法G的LR分析表
文法G ① 文法G
(1)E (3) T (5) F E+T T *F (E) (2) E (4) T (6) F T F i
② 分析表(图 )
③ 分析表中记号的含义 移进栈; 把下一状态 j 和现行输入符号 a 移进栈; s j: 个产生式进行归约; r j: 按第 j 个产生式进行归约; acc: 接受; acc: 接受; 空白格:出错标志, 空白格:出错标志,报错
#T* ACTION [[0, i*] ] ACTION 5, =r6 GOTO[0,F]=3#T*i =s5 0275 按第6 和 i 移进状态3 #T*F 移进 5个产生式 02710 进行归约, + 进行归约 10, ACTION [,即:] 02 #T =r3 F i (6) 01 #E 按第3个产生式 GOTO[0,T]=2
LR分析器(分析表)的分类: LR分析器(分析表)的分类: 分析器
LR(0)表构造法 表构造法。这种方法的局限性较大、但它 1. LR(0)表构造法 是建立其它较一般的LR分析法的基础。 2.简单LR(简称SLR)表构造法。虽然一些文法 2.简单LR(简称SLR)表构造法 简单LR SLR 不能构造SLR分析表,但是,它是一种比较容 易实现又很有使用价值的方法。 3.规范LR表构造法 规范LR表构造法。这种分析表能力最强,能够 3.规范LR表构造法 适用一大类文法,但实现代价高,或者说,分 析表的体积非常大。 4.向前LR表构造法 简称LALR 向前LR表构造法( LALR) 4.向前LR表构造法(简称LALR)。这种分析表的 能力介于SIR和规范LR之间,可以高效地实现。
4.3.2、 项目集规范族和LR(0)分析表 4.3.2、 LR(0)项目集规范族和 项目集规范族和 分析表
LR分析法的主要任务:构造一张LR分析表 LR分析法的主要任务:构造一张LR分析表 分析法的主要任务 LR
首先讨论一种只概括“历史”资料而不包含 推测性“展望”材料的“状态”。希望仅由这 种简 单状态就能识别呈现在栈顶的某些句柄。 下面讨论的LR(0)项目集就是这样一种简 单状态。
LR分析器的工作原理 LR分析器的工作原理 规范归约(最右推导逆过程)的关键是寻找 寻找 句柄。 句柄 LR分析法的基本思想:在规范归约过程中, 一方面记住已移进和归约出的符号串,即记住 “历史”; 另一方面根据所用产生式推测未 来可能遇到的输入符,即对未来进行“展望”。 当一串貌似句柄的符号串呈现于分析栈栈顶 时,希望能根据所记载的“历史”、“展望” 及“现实”材料来确定栈顶符号是否构成句 柄。
m:代表产生式编号 n:指出圆点的位置
C、字的前缀:指该字的任意首部 字的前缀: 如:abc前缀:ε,a,ab,abc abc前缀: 前缀 ab, 活前缀:规范句型的一个前缀, 活前缀:规范句型的一个前缀,该前缀是不含句柄之后 的任何符号。 的任何符号。
例4.5 文法为: (1)S→E (2)E→aA (3) A→cA (4) A→d 其句型 “acd”,d是句柄,活前缀为:ε;a;ac;acd 同理,在句型“acA”中,句柄是“cA”活前缀为: ε;a;ac;acA
① S栈应删除栈顶p个状态: mn-p+1,…,mn 删除后,S栈成为: m1,…,mn-p ② T栈中x1x2…xp归约成A,即T栈栈顶删除 p个文法符号,非终极符A进T栈; ③ 若 GOTO[mn-p ,A]=j,则状态j进S栈。
(3)接受 宣布分析成功,分析器停止工作。 接受: 接受 当S栈顶状态为k,现行输入符号为a,总控 程序根据“k”和“a”查LR分析表得: ACTION[k,a]=acc acc说明语法分析成功。 (4)报错 报告发现源程序有错,调用出错处 报错: 报错 理程序。 总控程序若按“k”和“a”查表得: ACTION[k,a]=空白 说明语法分析出错,所给输入串不是本 文法的句子。
s5 r6 s5 s5 s6 r1 r3 r5 s7 r3 r5
幻灯片 9
ACTION[k, a]的动作: (1)移进 设表中ACTION[k,a]= Sj,当S栈 移进: 移进 顶状态为k,现行输入符号为a,总控程序 根据“k”和“a”查LR(0)分析表,得: ACTION[k,a]= Sj 此时,Sj 表示j状态进S栈,a进T栈(文法符 号栈)。
存在不是LR的上下文无关文法 存在不是LR的上下文无关文法 LR 若一个文法的任何“移进-归约”分析器都存在下 述情况: 尽管栈的内容和下一输入符都已了解, 但仍无法确 定是“移进”还是“归约”, 或无法从几种可能的 归约中确定其一, 则该文法为非LR(1)文法。
注意: 注意:
(1) LR文法肯定是无二义的, 一个二义文法不会是 LR文法。 (2) LR分析技术可适当修改以适于一定的二义文法。
LR分析程序结构 分析程序结构 分析程序 分析表 产生器
文法
分析表
输 总控 入 程序 串
输出
分析表
一个LR分析器实质上是一个带先进后出存储器(栈) 的确定有限状态自动机。 我们将把“历史”和“展望”材料综合地抽象成某些 “状态”(自动机)。 分析栈(先进后出存储器)用来存放状态 状态。栈里的每 状态 个状态概括了从分析开始直到某一归约阶段的全部 “历史”和“展望”资料。 任何时候,栈顶的状态 栈顶的状态都代表了整个的历史和已推测 栈顶的状态 出的展望。因此,在任何时候都可从栈顶状态得知所 想了解的文法的一切信息,而没有必要从底而上翻阅 整个栈。 LR分析器的每一步工作都是由栈顶状态和现行输入 符号所唯一决定的。