您的位置:首页 > 其它

编译原理结构框架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.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: