编译原理结构框架5自底向上的语法分析
2014-12-02 16:27
483 查看
第五章 自底向上的语法分析
重点:自底向上分析的基本思想,算符优先分析法的基本思想,简单算符优先分析法。LR分析器的基本构造思想,LR分析算法,规范句型活前缀及其识别器——DFA,LR(0)分析表的构造,SLR(1)分析表的构造,LR(1)分析表的构造。
难点:求FIRSTOP和LASTOP,算符优先关系的确定,算符优先分析表的构造,素短语与最左素短语的概念。规范句型活前缀,LR(0)项目集闭包与项目集规范族,它们与句柄识别的关系,活前缀与句柄的关系,LR(1)项目集闭包与项目集规范族。
5.1 自底向上语法分析的核心问题:
n寻找句型中的当前归约对象——“句柄”进行归约,用不同的方法寻找句柄,就可获得不同的分析方法
5.2 计算FIRSTOP:
若有产生式 B -> b... 或 B -> Cb , 则 b ∈ FIRSTOP(B)\
若有产生式 A -> B,,, 则有,FIRSTOP(B) ⊆ FIRST(A)
5.3 计算LASTOP:
若有产生式 B -> ...b 或 B -> ...Cb, 则 b ∈ LASTOP(B)
若有产生式 A -> ...B 则有 , LASTOP(B) ⊆ LASTOP(B)
5.4 分析器的4个动作:
1)移进:将下一输入符号移入栈
2)归约:用产生式左侧的非终结符替换栈顶的句柄(某产生式右部)
3)接受:分析成功
4)出错:出错处理
5.5 算符优先文法识别的其实是LPP(最左素短语)
LR识别的其实是活前缀(这个前缀不含相应句型的句柄右部的任何符号)
5.6 素短语:
1.素短语是一个短语
2.它至少包含一个终结符
3.除自身外,不再包含其他终结符的短语
5.7 LR(0) 与 SLR(1) 与 LR(1) 的区别联系
LR(0): 可规约项,无论遇到什么符号都进行规约。
判断是否是LR(0), 看是否产生了 规约-规约 冲突 和 移近-规约 冲突
SLR(1): 向前查看一个输入符号,判断当前是否可以归约 (只有输入符是该语法变量的FOLLOW集时,才可以规约)。
判断是否是SLR(1), 看是否产生了 规约-规约 冲突 和 移近-规约 冲突
LR(1) : 分析仅考虑LR(1)项目中的后继符
LR(1) 项目集族的求法
CLOSURE(I):给定LR(1)项目I,求I的闭包,目的是为了合并某些状态,节省空间
GO(I,X):转移函数
5.8
LR(0)分析法不需要向前查看输入符号,只需要根据当前的栈顶状态就可以确定下一步所应采取的动作
LR(0)项目集:右部某个位置标有圆点的产生式称为相应文法的LR(0)项目
n归约(Reduce)项目:S→bBB.
n移进(Shift)项目:S→.bBB
n待约项目:S→b.BB S→bB.B
5.9 CFG不总是LR(0)文法.
SLR(1):向前查看一个输入符号,判断当前是否可以归约
LR(1):
5.10 本章小结
n自底向上的语法分析从给定的输入符号串w出发,自底向上地为其建立一棵语法分析树。
n移进-归约分析是最基本的分析方式,分为优先法和状态法。
n算符优先分析法是一种有效的方法,通过定义终结符号之间的优先关系来确定移进和归约。
nLR分析法有着更宽的适应性。该方法通过构建识别规范句型活前缀的DFA来设计分析过程中的状态。可以将LR分析法分成LR(0)、SLR(1)、LR(1)、LALR(1)。
n通过增加附加的信息可以解决一些二义性问题。
nYacc是LALR(1)语法分析器的自动生成工具。
测试:
文法:
S => 0S0
S => 1S1
S => 01
1. 计算该文法的SLR(1)项目集规范族,
构造识别其所有规范句型活前缀的DFA
2. 该文法是SLR(1)文法吗?若是,给出其SLR(1)分析表,
若不是,说明理由。
1.
S' -> .S
S' -> S.
S -> .0S0
S -> 0.S0
S -> 0S.0
S -> 0S0.
S -> .1S1
S -> 1.S1
S -> 1S.1
S -> 1S1.
S -> .01
S -> 0.1
S -> 01.
2.
重点:自底向上分析的基本思想,算符优先分析法的基本思想,简单算符优先分析法。LR分析器的基本构造思想,LR分析算法,规范句型活前缀及其识别器——DFA,LR(0)分析表的构造,SLR(1)分析表的构造,LR(1)分析表的构造。
难点:求FIRSTOP和LASTOP,算符优先关系的确定,算符优先分析表的构造,素短语与最左素短语的概念。规范句型活前缀,LR(0)项目集闭包与项目集规范族,它们与句柄识别的关系,活前缀与句柄的关系,LR(1)项目集闭包与项目集规范族。
5.1 自底向上语法分析的核心问题:
n寻找句型中的当前归约对象——“句柄”进行归约,用不同的方法寻找句柄,就可获得不同的分析方法
5.2 计算FIRSTOP:
若有产生式 B -> b... 或 B -> Cb , 则 b ∈ FIRSTOP(B)\
若有产生式 A -> B,,, 则有,FIRSTOP(B) ⊆ FIRST(A)
5.3 计算LASTOP:
若有产生式 B -> ...b 或 B -> ...Cb, 则 b ∈ LASTOP(B)
若有产生式 A -> ...B 则有 , LASTOP(B) ⊆ LASTOP(B)
5.4 分析器的4个动作:
1)移进:将下一输入符号移入栈
2)归约:用产生式左侧的非终结符替换栈顶的句柄(某产生式右部)
3)接受:分析成功
4)出错:出错处理
5.5 算符优先文法识别的其实是LPP(最左素短语)
LR识别的其实是活前缀(这个前缀不含相应句型的句柄右部的任何符号)
5.6 素短语:
1.素短语是一个短语
2.它至少包含一个终结符
3.除自身外,不再包含其他终结符的短语
5.7 LR(0) 与 SLR(1) 与 LR(1) 的区别联系
LR(0): 可规约项,无论遇到什么符号都进行规约。
判断是否是LR(0), 看是否产生了 规约-规约 冲突 和 移近-规约 冲突
SLR(1): 向前查看一个输入符号,判断当前是否可以归约 (只有输入符是该语法变量的FOLLOW集时,才可以规约)。
判断是否是SLR(1), 看是否产生了 规约-规约 冲突 和 移近-规约 冲突
LR(1) : 分析仅考虑LR(1)项目中的后继符
LR(1) 项目集族的求法
CLOSURE(I):给定LR(1)项目I,求I的闭包,目的是为了合并某些状态,节省空间
GO(I,X):转移函数
5.8
LR(0)分析法不需要向前查看输入符号,只需要根据当前的栈顶状态就可以确定下一步所应采取的动作
LR(0)项目集:右部某个位置标有圆点的产生式称为相应文法的LR(0)项目
n归约(Reduce)项目:S→bBB.
n移进(Shift)项目:S→.bBB
n待约项目:S→b.BB S→bB.B
5.9 CFG不总是LR(0)文法.
SLR(1):向前查看一个输入符号,判断当前是否可以归约
LR(1):
5.10 本章小结
n自底向上的语法分析从给定的输入符号串w出发,自底向上地为其建立一棵语法分析树。
n移进-归约分析是最基本的分析方式,分为优先法和状态法。
n算符优先分析法是一种有效的方法,通过定义终结符号之间的优先关系来确定移进和归约。
nLR分析法有着更宽的适应性。该方法通过构建识别规范句型活前缀的DFA来设计分析过程中的状态。可以将LR分析法分成LR(0)、SLR(1)、LR(1)、LALR(1)。
n通过增加附加的信息可以解决一些二义性问题。
nYacc是LALR(1)语法分析器的自动生成工具。
测试:
文法:
S => 0S0
S => 1S1
S => 01
1. 计算该文法的SLR(1)项目集规范族,
构造识别其所有规范句型活前缀的DFA
2. 该文法是SLR(1)文法吗?若是,给出其SLR(1)分析表,
若不是,说明理由。
1.
S' -> .S
S' -> S.
S -> .0S0
S -> 0.S0
S -> 0S.0
S -> 0S0.
S -> .1S1
S -> 1.S1
S -> 1S.1
S -> 1S1.
S -> .01
S -> 0.1
S -> 01.
2.
相关文章推荐
- 编译原理结构框架4自顶向下的语法分析
- 编译原理结构框架6语法制导翻译与属性文法
- 编译原理结构框架3词法分析
- 编译原理结构框架7语义分析与中间代码生成
- 编译原理 实验3 语法分析
- 【编译原理】简析文法分析,语法分析
- 编译原理上机作业2——LL(1)语法分析
- 编译原理_常量定义语句语法分析
- 关于Basic程序解释器及编译原理的简单化(1)---Basic器的语法分析及主要代码
- 【编译原理】自顶向下的语法分析之递归下降分析法
- 编译原理手记05-文法和语法分析中一些概念的解释
- 编译原理结构框架2高级语言及其文法
- 【编译原理】用Yacc做语法分析
- 编译原理之词法分析和语法分析
- 编译原理语法分析LR1
- 编译原理之词法分析、语法分析、语义分析
- 编译原理--递归下降语法分析源代码(C Language)
- 编译原理词/语法分析
- 关于Basic程序解释器及编译原理的简单化(1)---Basic器的语法分析及主要代码
- 利用编译原理中的语法分析进行表达式求值