第五章 语法分析——自下而上分析
LR分析方法
LR分析方法是一种自下而上的分析方法
LR分析法的归约过程是规范推导的逆过程,所以LR分析过程是一种规范归约过程
LR分析方法是一种适用于一大类上下文无关文法的分析方法
比较复杂,不适于用手工实现,可借助于YACC/bison实现
有四种LR分析法:规范LR、LALR、SLR、LR(0)
根据归约过程中向前看输入符号串中字符的个数,定义不同的LR(k)分方法,通常,k=0,1
对于它的结构的几部分的说明:
1.LR分析器栈的结构_分析栈
(1)把历史和展望材料抽象成某些状态。分析栈用来存放这些状态。栈顶的状态都代表了整个历史和已经推测出的展望。
(2)为了有助于明确归约手续,将已归约出的文法符号串也同时放到栈里。
2.LR分析器栈的结构_动作表和状态转换表
动作表:
ACTION[s,a]:
当状态s面临输入符号a时,应采取什么动作
每一项ACTION[s,a]所规定的四种动作:
<1>. 移进
<2>. 归约
<3>. 接受
<4>. 报错
状态转换表:
GOTO[s,X]:
状态s面对文法符号X时,下一状态是什么
<1>. 移进
把(s,a)的下一状态s’=GOTO[s,a] 和输入符号a推进栈,下一输入符号变成现行输入符号.
<2>. 归约
指用某产生式A进行归约. 假若的长度为r, 归约动作是A, 去除栈顶r个项,使状态sm-r变成栈顶状态,然后把(sm-r, A)的下一状态s’=GOTO[sm-r, A]和文法符号A推进栈.
<3>. 接受 宣布分析成功,停止分析器工作。
<4>. 报错 发现源程序含有错误,调用出错处理程序
活前缀
活前缀:文法G的活前缀是他的规范句型的前缀,该前缀不超过句柄的右端。
活前缀特点:
该前缀加上被分析串中未被分析的终结符,就可以构成一个规范句型
只要输入串的已扫描部分可归约成一个活前缀,意味着扫描过的部分没有错误
活前缀与句柄间的关系
(1)活前缀中已含有句柄的全部符号(句柄的符号即为其最右符号)。
这表明:此时某一产生式A→β的右部符号串β已出现在栈顶,因此相应的分析动作应当是用此产生式进行归约。
(2)活前缀中含句柄的一部分符号(句柄开头的 若干符号与活前缀最右的若干个符号一致)。
这表明形如A→β1β2的产生式的右部子串β1已出现在栈顶,正期待着从余留输入串中看到能由β2推出的符号串。
(3)活前缀中全然不包含句柄的任何符号 。
第三种情况则意味着,期望从余留输入串中能看到由某一产生式A→α右部,即A所推出的符号串。
LR分析表的构造需要构造识别活前缀的有限自动机,
用有限自动机中的状态表示分析表中的状态,
用状态图中的状态之间的转换关系对分析表中的action goto函数等进行定义。
关于识别活前缀的有限自动机课件的例题看理解
LR(0)分析表相当于识别活前缀的有限自动机DFA的状态转换矩阵。
LR(0)分析表的构造算法。