第五章 自底向上的语法分析
重点:自底向上分析的基本思想,算符优先分析法的基本思想,简单算符优先分析法。LR分析器的基本构造思想,LR分析算法,规范句型活前缀及其识别器——DFA,LR(0)分析表的构造,SLR(1)分析表的构造,LR(1)分析表的构造。
难点:求FIRSTOP和LASTOP,算符优先关系的确定,算符优先分析表的构造,素短语与最左素短语的概念。规范句型活前缀,LR(0)项目集闭包与项目集规范族,它们与句柄识别的关系,活前缀与句柄的关系,LR(1)项目集闭包与项目集规范族。
5.1 自底向上语法分析的核心问题:
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( 0 ) 分析法 不需要 向前查看输入符号,只需要根据当前的 栈顶状态 就可以确定下一步所应采取的动作
LR(0)项目集:右部某个位置标有圆点的产生式称为相应文法的LR(0)项目
5.9 CFG不总是LR(0)文法.
SLR(1):向前查看一个输入符号,判断当前是否可以归约
LR(1):
5.10 本章小结
测试:
文法: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.