一、知识点
一、移进归约
1.基本思想
用一个寄存符号的先进后出栈,把输入符号一个一个地移进到栈里,当栈顶形成某个产生式的候选式时,即把栈顶的这一部分替换成(归约为)该产生式的左部符号。
用一个寄存符号的先进后出栈,把输入符号一个一个地移进到栈里,当栈顶形成某个产生式的候选式时,即把栈顶的这一部分替换成(归约为)该产生式的左部符号。
2.归约
是指根据文法的产生式规则,把产生式的右部替换成左部符号。
是指根据文法的产生式规则,把产生式的右部替换成左部符号。
二、规范归约
1.短语
2.直接短语
特别是,如果有A=>β,则称β是句型αβ相对于规则A—>β 的直接短语。
特别是,如果有A=>β,则称β是句型αβ相对于规则A—>β 的直接短语。
3.句柄一个句型的最左直接短语称为该句型的句柄。
4.规范归约
定义:假定是文法G的一个句子,我们称序列
n, n-1, ,0
是的一个规范归约,如果此序列满足:
(1) n=
(2) 0为文法的开始符号,即0=S
(3) 对任何i,0 < i n, i-1是从i经把句柄替换成为相应产生式左部符号而得到的。
是的一个规范归约,如果此序列满足:
(1) n=
(2) 0为文法的开始符号,即0=S
(3) 对任何i,0 < i n, i-1是从i经把句柄替换成为相应产生式左部符号而得到的。
6.修剪语法树
使用修剪语法树的方法来加深对自下而上语法分析的理解。
(1)子树:是由该树的某个结点(子树的根)连同它的所有子孙组成。
(2)简单子树:只有单层分支的子树(只有父子两代没有第三代)
使用修剪语法树的方法来加深对自下而上语法分析的理解。
(1)子树:是由该树的某个结点(子树的根)连同它的所有子孙组成。
(2)简单子树:只有单层分支的子树(只有父子两代没有第三代)
三、算符优先分析法
思路:
定义算符之间优先关系,借助这种关系来寻找“可归约串”和进行归约
1.算符优先文法
(1)算符文法
一个文法,如果它的任一产生式的右部都不含两个相继(并列)的非终结符,即不含如下形式的产生式右部:
…QR…
则我们称该文法为算符文法,也称OG文法
定义算符之间优先关系,借助这种关系来寻找“可归约串”和进行归约
1.算符优先文法
(1)算符文法
一个文法,如果它的任一产生式的右部都不含两个相继(并列)的非终结符,即不含如下形式的产生式右部:
…QR…
则我们称该文法为算符文法,也称OG文法
2.构造算符优先关系表
(1)通过检查产生式的每一个候选式可以找出满足a=.b
(即P→…ab…或P→…aQb…的产生式)
(2)为了满足<.和>.,需对G中每个非终结符P构造两个集合FIRSTVT(P)和LASTVT(P)
(1)通过检查产生式的每一个候选式可以找出满足a=.b
(即P→…ab…或P→…aQb…的产生式)
(2)为了满足<.和>.,需对G中每个非终结符P构造两个集合FIRSTVT(P)和LASTVT(P)
3、算符优先分析算法的设计
(1)问题的提出
自下而上分析
移进-归约法:句柄为可归纳串
算符优先分析法:最左素短语为可归纳串
自下而上分析
移进-归约法:句柄为可归纳串
算符优先分析法:最左素短语为可归纳串
(2)素短语
指一个句型的短语,它至少包括有一个终结符号且除去它本身之外不再含任何更小的素短语
指一个句型的短语,它至少包括有一个终结符号且除去它本身之外不再含任何更小的素短语
(3)最左素短语
处在句型最左端那个素短语成为最左素短语
处在句型最左端那个素短语成为最左素短语
四、LR分析方法
LR分析方法是一种自下而上的分析方法
LR分析法的归约过程是规范推导的逆过程,所以LR分析过程是一种规范归约过程
LR分析方法是一种适用于一大类上下文无关文法的分析方法
比较复杂,不适于用手工实现,可借助于YACC/bison实现
根据归约过程中向前看输入符号串中字符的个数,定义不同的LR(k)分析方法,通常,k=0,1
LR分析法的归约过程是规范推导的逆过程,所以LR分析过程是一种规范归约过程
LR分析方法是一种适用于一大类上下文无关文法的分析方法
比较复杂,不适于用手工实现,可借助于YACC/bison实现
根据归约过程中向前看输入符号串中字符的个数,定义不同的LR(k)分析方法,通常,k=0,1
LR文法
一个文法,如果能构造出一个所有条目都唯一的分析表。
LR(k)文法
最多向前看K个的符号就可以决定动作的LR分析器所分析的文法成为LR(k)文法。
我们最感兴趣的是k=0,1
一个文法,如果能构造出一个所有条目都唯一的分析表。
LR(k)文法
最多向前看K个的符号就可以决定动作的LR分析器所分析的文法成为LR(k)文法。
我们最感兴趣的是k=0,1
活前缀特点:
该前缀加上被分析串中未被分析的终结符,就可以构成一个规范句型
只要输入串的已扫描部分可归约成一个活前缀,意味着扫描过的部分没有错误
该前缀加上被分析串中未被分析的终结符,就可以构成一个规范句型
只要输入串的已扫描部分可归约成一个活前缀,意味着扫描过的部分没有错误
二、LR(0)项目集规范族的构造
1.构造G的拓广文法G’
设S为文法G的开始符号,构造一个文法G’,它包含整个文法G,并且引进了一个不出现在G中的非终结符S,并加进一个新产生式S→S,这个S是G的开始符号。把G’成为G的拓广文法。(有一个仅含项目S→S. 的状态,这就是唯一的“接受”状态)
设S为文法G的开始符号,构造一个文法G’,它包含整个文法G,并且引进了一个不出现在G中的非终结符S,并加进一个新产生式S→S,这个S是G的开始符号。把G’成为G的拓广文法。(有一个仅含项目S→S. 的状态,这就是唯一的“接受”状态)
2.LR(0)分析表的ACTION和GOTO表的构造步骤
a)若项目A→•a属于Ik,且转换函数GO(Ik,a)=Ij,当a为终结符时 ,则置ACTION[k,a]为Sj。
b)若项目A→•属于Ik, 则对a为任何终结符或#′,置ACTION[k,a]=rj, j为产生式在文法G′中的编号。
c)若GO(Ik,A)=Ij,则置GOTO[k,A]=j,其中A为非终结符,j为某一状态号。
d)若项目S′→S•属于Ik,则置ACTION[k,#]= acc。
e)其它填上“报错标志”。
a)若项目A→•a属于Ik,且转换函数GO(Ik,a)=Ij,当a为终结符时 ,则置ACTION[k,a]为Sj。
b)若项目A→•属于Ik, 则对a为任何终结符或#′,置ACTION[k,a]=rj, j为产生式在文法G′中的编号。
c)若GO(Ik,A)=Ij,则置GOTO[k,A]=j,其中A为非终结符,j为某一状态号。
d)若项目S′→S•属于Ik,则置ACTION[k,#]= acc。
e)其它填上“报错标志”。
LR(0)
SLR(1):生成的LR(0)项目集如有冲突,则根据非终结符的FOLLOW集决定。
LR(1)、LR(k):项目由心与向前搜索符组成,搜索符长度为1或k。
LALR(1):对LR(1)项目集规范族合并同心集。
SLR(1):生成的LR(0)项目集如有冲突,则根据非终结符的FOLLOW集决定。
LR(1)、LR(k):项目由心与向前搜索符组成,搜索符长度为1或k。
LALR(1):对LR(1)项目集规范族合并同心集。
二、

三
三、感受
通过对这章的学习,感觉有点难,挺难理解。