自底向上构造语法分析树Java_《编译原理》-用例题理解-自底向上的语法分析,FIRSTVT,LASTVT集...

《编译原理》-用例题理解-自底向上的语法分析,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)

b1f2aa28674d6a2da356535b7975fc81.png

执行时,首先分析栈中会存放 # 到栈底,图上没有体现出来,应该在 a 的下面加上 #,将余留输入串最左边的字符放在分析栈栈首,此时栈中为 a,分析上面 4 句文法,文法的右部没有完全匹配的,所以没有构成句柄。

此时,继续移进第二个输入符号 b,此时栈顶的 b 与文法的(4)产生式的右部匹配,用 A -> b 规约,得到栈中为 aA

然后移进 b,c,用文法的(3)产生式进行规约。

直到最后 aABe,用产生式(1)规约出 S 开始符号,接受。

用表格表示:

6ca5ebada844e760fdf4dfd65aef7ca4.png

(图片来自教材:《编译原理》张晶老师版)

用树型表示:

每一次规约就相当于构造一颗子树,指导输入串结束时,构造成整个语法树。

56d940dc55a9ec561ddf1f23a05c1415.png

(图片来自教材:《编译原理》张晶老师版)

关于规范规约

首先,自底向上的分析的移进 - 规约过程是自顶向下最右推导的逆过程。

怎么理解呢?

最右推导是每次先推导最右边的非终结符,自顶向下的最右推导就是从开始符号开始,每次执行最右推导,推出输入符号串,最右推导是先推出输入串最右端的终结符,最后推出最左端的终结符。

那逆过程就是从输入符号串开始,每次先从最左端的终结符推导,最后推出开始符号。也就是自底向上的分析的移进 - 规约过程。

理解这句话之后,因为最右推导被称为规范推导,那么自左向右的规约则称为规范规约。

关于句柄

归约过程中,当句柄出现在栈顶符号串时,则用句柄归约。所以关键是在分析过程中如何确定句柄。

寻找句柄的方法不同,也就形成了不同的自底向上分析法。我们将介绍两种不同的方法,分别是优先分

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值