简单优先分析法

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)-简单优先分析法...相关推荐

  1. 编译原理系列之五 自底向上优先分析(2)-算符优先分析法

    算符优先分析法 1.基本概念 算符文法(OG):文法G中没有形如A=>···BC···的产生式,其中B.C为非终结符,则G为算符文法(operator grammar). 也就是说产生式的右部不 ...

  2. 【编译原理】让我们来构建一个简单的解释器(Let’s Build A Simple Interpreter. Part 6.)(python/c/c++版)(笔记)

    [编译原理]让我们来构建一个简单的解释器(Let's Build A Simple Interpreter. Part 6.) 文章目录 python代码 C语言代码 总结 今天是这一天:) &quo ...

  3. 【编译原理】让我们来构建一个简单的解释器(Let’s Build A Simple Interpreter. Part 5.)(python/c/c++版)(笔记)Lexer词法分析程序

    [编译原理]让我们来构建一个简单的解释器(Let's Build A Simple Interpreter. Part 5.) 文章目录 python代码 C语言代码 总结 你如何处理像理解如何创建解 ...

  4. 【编译原理】让我们来构建一个简单的解释器(Let’s Build A Simple Interpreter. Part 4.)(python/c/c++版)(笔记)

    [编译原理]让我们来构建一个简单的解释器(Let's Build A Simple Interpreter. Part 4.) 文章目录 python代码 C语言代码 总结 在上一篇文章中,您学习了如 ...

  5. 【编译原理】让我们来构建一个简单的解释器(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 ...

  6. 【编译原理】让我们来构建一个简单的解释器(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 ...

  7. 【编译原理】让我们来构建一个简单的解释器(Let’s Build A Simple Interpreter. Part 2.)(python/c/c++版)(笔记)

    [编译原理]让我们来构建一个简单的解释器(Let's Build A Simple Interpreter. Part 2.) 文章目录 python代码 c代码 总结 让我们再次深入研究解释器和编译 ...

  8. 编译原理教程_5 自底向上分析

    文章原稿 https://gitee.com/fakerlove/fundamentals-of-compiling 文章目录 5. 自底向上分析 5.1 移进-规约分析 5.2 简单优先分析法 5. ...

  9. c语言语法分析源程序,深入浅出编译原理-5-一个简单语法分析器的C语言实现

    引言 前面已经介绍了编译器的预处理,词法分析,词法分析器的实现,也在其中说到了语法分析的任务和过程. 语法分析的输入是词法单元序列,然后根据语言的文法表示(展开式),利用有限状态机理论,生成抽象语法树 ...

最新文章

  1. linux系统 插优盘安装xvidcap,linux下的视频录制软件xvidcap
  2. 微信链接里的图像如何得到更清晰
  3. 5G NGC — UDM 统一数据管理
  4. keilcjson内存分配失败_iOS标准库中常用数据结构和算法之内存池
  5. Python 判断字符串是否包含中文
  6. Linux命令之初出茅庐
  7. Android--Activity四种启动模式
  8. Python实现一个数组除以一个数
  9. c语言函数的使用步骤,c语言打开文件函数使用方法
  10. 性价比高台式计算机,2021年台式电脑什么牌子好,性价比高?
  11. Spring MVC数据绑定和表单标签的应用(附带实例)
  12. (八)ASP.NET自定义用户控件(1)
  13. 拓端tecdat|R语言文本挖掘NASA数据网络分析,tf-idf和主题建模
  14. Quick-Cocos2d-x初学者游戏教程(五) --------------------- 辅助工具和跳转场景
  15. “上传漏洞”安全检测网站详解
  16. 项目难题:Java几分钟处理完30亿个数据?
  17. 怎么用python下载网易云_如何使用python批量下载网易云音乐的免费音乐
  18. 除了PMP,项目经理还要考哪些证书?
  19. 10、PIC系列-输出比较-PWM脉宽调制模式
  20. Shell脚本初学习

热门文章

  1. 【Java PTA作业】当老师一口气布置八个作业( 8 / 8 )
  2. 推荐PHP免费开源博客系统-Catfish(鲶鱼) CMS
  3. 常用端口3000,80被占用问题解决
  4. 思科配置VLAN的实例
  5. 产生式推理的简单识别系统
  6. linux防火墙禁止所以端口,利用iptables来配置linux禁止所有端口登陆和开放指定端口...
  7. 【教程】ArcGIS水文分析提取河流及流域
  8. 拒绝选择恐惧症!国内好用的Markdown编辑器之有道云笔记
  9. 【Odin插件】Unity补完计划
  10. 智慧民政解决方案-最新全套文件