《编译原理》-用例题理解-自底向上的语法分析,FIRSTVT,LASTVT集
本笔记是对教材《编译原理》- 张晶老师版 做学习笔记。
本篇就是第 5 章的笔记。
(一)自底向上的语法分析概述
自底向上语法分析
自底向上语法分析从待输入的符号串开始,利用文法的产生式步步向上归约,试图归约到文法的开始符号。
从语法树的角度看
自底向上分析的过程是以输入符号串作为端末结点符号串,向着根结点的方向往上构造语法树,是开始符号正好是该语法树的根结点。
自底向上语法分析过程实际上是一个不断进行直接归约的过程
移进-规约大意:
用一个寄存符号的先进后出栈,把输入符号一个一个地移进到栈里,当栈顶符号串形成可归约串时(某个产生式的右部时),即把这个可归约串替换成(归约成)该产生式的左部的非终结符。
自底向上语法分析法基本思想
自左向右地扫描输入符号串,一遍把输入符号逐个移进分析栈,一边检查分析栈的栈顶符号串是否已经形成了句柄(句柄就是每个产生式的右部),如果形成句柄就把栈顶符号串替换为相应产生式左部的非终结符号,这种替换就称规约,再根据规约后的新栈顶,继续扫描,移进,规约。
例题:移进-规约
题目:
给定文法 G[S]:
(1)S -> aABe
(2)A -> b
(3)A -> Abc
(4)B -> d
解析:
步骤: 1 2 3 4 5 6 7 8 9 10
动作: 进 进 归 进 进 归 进 归 进 归
a b (2) b c (3) d (4) e (1)
执行时,首先分析栈中会存放 # 到栈底,图上没有体现出来,应该在 a 的下面加上 #,将余留输入串最左边的字符放在分析栈栈首,此时栈中为 a,分析上面 4 句文法,文法的右部没有完全匹配的,所以没有构成句柄。
此时,继续移进第二个输入符号 b,此时栈顶的 b 与文法的(4)产生式的右部匹配,用 A -> b 规约,得到栈中为 aA
然后移进 b,c,用文法的(3)产生式进行规约。
直到最后 aABe,用产生式(1)规约出 S 开始符号,接受。
用表格表示:
(图片来自教材:《编译原理》张晶老师版)
用树型表示:
每一次规约就相当于构造一颗子树,指导输入串结束时,构造成整个语法树。
(图片来自教材:《编译原理》张晶老师版)
关于规范规约
首先,自底向上的分析的移进 - 规约过程是自顶向下最右推导的逆过程。
怎么理解呢?
最右推导是每次先推导最右边的非终结符,自顶向下的最右推导就是从开始符号开始,每次执行最右推导,推出输入符号串,最右推导是先推出输入串最右端的终结符,最后推出最左端的终结符。
那逆过程就是从输入符号串开始,每次先从最左端的终结符推导,最后推出开始符号。也就是自底向上的分析的移进 - 规约过程。
理解这句话之后,因为最右推导被称为规范推导,那么自左向右的规约则称为规范规约。
关于句柄
归约过程中,当句柄出现在栈顶符号串时,则用句柄归约。所以关键是在分析过程中如何确定句柄。
寻找句柄的方法不同,也就形成了不同的自底向上分析法。我们将介绍两种不同的方法,分别是优先分