自底向上构造语法分析树Java_编译原理系列之五 自底向上优先分析(1)-简单优先分析法...
简单优先分析法
1.基本概念
通过语法树来理解这三个概念更加简单:
文法G1[S]:
S→AB
A→bB
A→Aa
B→a
B→Sb
语法树
短语:若S=*=>αAδ且A=+=>β,则称β是相对于非终结符A的句型αβδ的短语。
即:语法树中以非终结符的作为根的子树的叶子所组成的字符串。
如:ba是相对于非终结符A的句型AB的短语。句型baSb的短语有ba,a,Sb,baSb。
直接短语:若S=*=>αAδ且A=>β,则称β是相对于非终结符A的句型αβδ的直接短语。
即:语法树中以非终结符的作为根的子树,它的孩子都是叶子,没有其他子树。
如:Sb是相对于非终结符B的句型AB的短语。句型baSb的短语有a,Sb。
句柄:位于句型最左边的直接短语称为该句型的句柄。
即:位于语法树中最左边的直接短语。
如:句型baSb的句柄是a。
2.优先关系定义
X和Y优先级相等,表示为 X=·Y,当且仅当G中存在产生式规则A=>···XY···。
解读:X、Y的优先级相同,当XY存在一个句柄之中,它们将同时被归约。表现在语法树中S=·b。
优先级相等在语法树中
X优先级小于Y,表示为 X···XB···,B=+=>Y···。
解读:X优先级小于Y,当XY存在一个句型中时,它们将不可能出现在同一个句柄中,Y一定比X先被规约。表现在语法树中b
优先级小于语法树中
X优先级大于Y,表示为 X>·Y ,当且仅当G中存在产生式规则A=>··BD···,B=+=>···X,D=*=>Y···。
解读:X优先级大于Y,当XY存在一个句型中时,它们将不可能出现在同一个句柄中,X一定比Y先被规约。表现在语法树中a>·S。
优先级大于在语法树中
X和Y的优先级为空,表示在文法的任何句型中都不会出现该符号对相邻出现的情况。
注意:以上优先关系之间不具有对成性。
3.简单优先文法定义
一个文法是简单优先文法,需要满足以下两个条件:
在文法符号集中V,任意两个符号之间必须之后一种优先关系存在。(显然满足)
在文法中,两个产生式不能有相同的右部。
4.简单优先分析法的操作步骤
将输入输入串a1a2···an#依次压栈,不断比较栈顶符号ai和下一个待输入符号aj的优先级,若ai>·aj则进行下一步,否则重复此步骤。
解读:停止条件是ai>·aj表示前面输入串一定比后面先归约,所以只需要在前面找句柄就行了。
栈顶符号ai即为句柄尾,从此处向左寻找句柄头ak,满足ak-1
解读:从后向前找ak-1
由句柄ai···ak在文法中寻找右部为ai···ak的产生式;找到则将句柄替换为相应左部,找不到则说明该输入串不是该文法的句子。
重复以上步骤直到归约完成。
5.实例
由于还是以上面的例子不满足简单优先文法定义(b和b的优先关系不唯一),这里我们用另一个文法来举例。
文法G2[S]:
S→bAb ①
A→(B ②
A→a ③
B→Aa) ④
输入串为b(aa)b#
首先我们做出文法符号的优先关系矩阵:S
A
B
a
b
(
)
#S
A
=
=
B
>
>
a
>
>
=
b
=
<
<
(
<
=
<
<
)
>
>
#
这里#比其相邻所有符号的优先性都要小。
然后按照简单优先分析法进行归约:步骤
栈S
当前输入符
输入串剩余部分
动作1
#
b
(aa)b#
移进
2
#b
(
aa)b#
移进
3
#b(
a
a)b#
移进
4
#b(a
a
)b#
归约③
5
#b(A
a
)b#
移进
6
#b(Aa
)
b#
移进
7
#b(Aa)
b
#
归约④
8
#b(B
b
#
归约②
9
#bA
b
#
移进
10
#bAb
#
归约①
11
#S
#
接受
其语法树如下:
语法树
自底向上构造语法分析树Java_编译原理系列之五 自底向上优先分析(1)-简单优先分析法...相关推荐
- 编译原理系列之五 自底向上优先分析(2)-算符优先分析法
算符优先分析法 1.基本概念 算符文法(OG):文法G中没有形如A=>···BC···的产生式,其中B.C为非终结符,则G为算符文法(operator grammar). 也就是说产生式的右部不 ...
- 【编译原理】让我们来构建一个简单的解释器(Let’s Build A Simple Interpreter. Part 6.)(python/c/c++版)(笔记)
[编译原理]让我们来构建一个简单的解释器(Let's Build A Simple Interpreter. Part 6.) 文章目录 python代码 C语言代码 总结 今天是这一天:) &quo ...
- 【编译原理】让我们来构建一个简单的解释器(Let’s Build A Simple Interpreter. Part 5.)(python/c/c++版)(笔记)Lexer词法分析程序
[编译原理]让我们来构建一个简单的解释器(Let's Build A Simple Interpreter. Part 5.) 文章目录 python代码 C语言代码 总结 你如何处理像理解如何创建解 ...
- 【编译原理】让我们来构建一个简单的解释器(Let’s Build A Simple Interpreter. Part 4.)(python/c/c++版)(笔记)
[编译原理]让我们来构建一个简单的解释器(Let's Build A Simple Interpreter. Part 4.) 文章目录 python代码 C语言代码 总结 在上一篇文章中,您学习了如 ...
- 【编译原理】让我们来构建一个简单的解释器(Let’s Build A Simple Interpreter. Part 3.)(python/c/c++版)(笔记)
[编译原理]让我们来构建一个简单的解释器(Let's Build A Simple Interpreter. Part 3.) 文章目录 python代码calc3.py C语言代码(calc3.cp ...
- 【编译原理】让我们来构建一个简单的解释器(Let’s Build A Simple Interpreter. Part 1.)(python/c/c++版)(笔记)
原文:Let's Build A Simple Interpreter. Part 1. 文章目录 [编译原理]让我们来构建一个简单的解释器(Let's Build A Simple Interpre ...
- 【编译原理】让我们来构建一个简单的解释器(Let’s Build A Simple Interpreter. Part 2.)(python/c/c++版)(笔记)
[编译原理]让我们来构建一个简单的解释器(Let's Build A Simple Interpreter. Part 2.) 文章目录 python代码 c代码 总结 让我们再次深入研究解释器和编译 ...
- 编译原理教程_5 自底向上分析
文章原稿 https://gitee.com/fakerlove/fundamentals-of-compiling 文章目录 5. 自底向上分析 5.1 移进-规约分析 5.2 简单优先分析法 5. ...
- c语言语法分析源程序,深入浅出编译原理-5-一个简单语法分析器的C语言实现
引言 前面已经介绍了编译器的预处理,词法分析,词法分析器的实现,也在其中说到了语法分析的任务和过程. 语法分析的输入是词法单元序列,然后根据语言的文法表示(展开式),利用有限状态机理论,生成抽象语法树 ...
最新文章
- linux系统 插优盘安装xvidcap,linux下的视频录制软件xvidcap
- 微信链接里的图像如何得到更清晰
- 5G NGC — UDM 统一数据管理
- keilcjson内存分配失败_iOS标准库中常用数据结构和算法之内存池
- Python 判断字符串是否包含中文
- Linux命令之初出茅庐
- Android--Activity四种启动模式
- Python实现一个数组除以一个数
- c语言函数的使用步骤,c语言打开文件函数使用方法
- 性价比高台式计算机,2021年台式电脑什么牌子好,性价比高?
- Spring MVC数据绑定和表单标签的应用(附带实例)
- (八)ASP.NET自定义用户控件(1)
- 拓端tecdat|R语言文本挖掘NASA数据网络分析,tf-idf和主题建模
- Quick-Cocos2d-x初学者游戏教程(五) --------------------- 辅助工具和跳转场景
- “上传漏洞”安全检测网站详解
- 项目难题:Java几分钟处理完30亿个数据?
- 怎么用python下载网易云_如何使用python批量下载网易云音乐的免费音乐
- 除了PMP,项目经理还要考哪些证书?
- 10、PIC系列-输出比较-PWM脉宽调制模式
- Shell脚本初学习