编译原理系列之五 自底向上优先分析(1)-简单优先分析法

简单优先分析法

1.基本概念

通过语法树来理解这三个概念更加简单:

文法G1[S]:
S→AB
A→bB
A→Aa
B→a
B→Sb

2869373-9da4aa12dcd3c1c7.png

语法树

  1. 短语:若S=*=>αAδ且A=+=>β,则称β是相对于非终结符A的句型αβδ的短语。

    即:语法树中以非终结符的作为根的子树的叶子所组成的字符串。

    如:ba是相对于非终结符A的句型AB的短语。句型baSb的短语有ba,a,Sb,baSb。

  2. 直接短语:若S=*=>αAδ且A=>β,则称β是相对于非终结符A的句型αβδ的直接短语。

    即:语法树中以非终结符的作为根的子树,它的孩子都是叶子,没有其他子树。

    如:Sb是相对于非终结符B的句型AB的短语。句型baSb的短语有a,Sb。

  3. 句柄:位于句型最左边的直接短语称为该句型的句柄。

    即:位于语法树中最左边的直接短语。

    如:句型baSb的句柄是a。

2.优先关系定义

  1. X和Y优先级相等,表示为 X=·Y,当且仅当G中存在产生式规则A=>···XY···。

    解读:X、Y的优先级相同,当XY存在一个句柄之中,它们将同时被归约。表现在语法树中S=·b。

2869373-6556e60491a33db0.png

优先级相等在语法树中

  1. X优先级小于Y,表示为 X<·Y ,当且仅当G中存在产生式规则A=>···XB···,B=+=>Y···。

    解读:X优先级小于Y,当XY存在一个句型中时,它们将不可能出现在同一个句柄中,Y一定比X先被规约。表现在语法树中b<·a。

2869373-b21753552a961cd3.png

优先级小于语法树中

  1. X优先级大于Y,表示为 X>·Y ,当且仅当G中存在产生式规则A=>··BD···,B=+=>···X,D=*=>Y···。

    解读:X优先级大于Y,当XY存在一个句型中时,它们将不可能出现在同一个句柄中,X一定比Y先被规约。表现在语法树中a>·S。

2869373-05b519d51cb0d7c0.png

优先级大于在语法树中

  1. X和Y的优先级为空,表示在文法的任何句型中都不会出现该符号对相邻出现的情况。

注意:以上优先关系之间不具有对成性。

3.简单优先文法定义

一个文法是简单优先文法,需要满足以下两个条件:

  1. 在文法符号集中V,任意两个符号之间必须之后一种优先关系存在。(显然满足)
  2. 在文法中,两个产生式不能有相同的右部。

4.简单优先分析法的操作步骤

  1. 将输入输入串a1a2···an#依次压栈,不断比较栈顶符号ai和下一个待输入符号aj的优先级,若ai>·aj则进行下一步,否则重复此步骤。

    解读:停止条件是ai>·aj表示前面输入串一定比后面先归约,所以只需要在前面找句柄就行了。

  2. 栈顶符号ai即为句柄尾,从此处向左寻找句柄头ak,满足ak-1<·ak。

    解读:从后向前找ak-1<·ak表示ak之前的输入串一定比ai···ak后归约,由此确定现在就是要归约ai···ak。

  3. 由句柄ai···ak在文法中寻找右部为ai···ak的产生式;找到则将句柄替换为相应左部,找不到则说明该输入串不是该文法的句子。

  4. 重复以上步骤直到归约完成。

5.实例

由于还是以上面的例子不满足简单优先文法定义(b和b的优先关系不唯一),这里我们用另一个文法来举例。

文法G2[S]:
S→bAb ①
A→(B ②
A→a ③
B→Aa) ④

输入串为b(aa)b#

  1. 首先我们做出文法符号的优先关系矩阵:
 SABab()#
S        
A   ==   
B   >>   
a   >> = 
b = < <  
( <=< <  
)   >>   
#        

这里#比其相邻所有符号的优先性都要小。

  1. 然后按照简单优先分析法进行归约:
步骤栈S当前输入符输入串剩余部分动作
1#b(aa)b#移进
2#b(aa)b#移进
3#b(aa)b#移进
4#b(aa)b#归约③
5#b(Aa)b#移进
6#b(Aa)b#移进
7#b(Aa)b#归约④
8#b(Bb#归约②
9#bAb#移进
10#bAb# 归约①
11#S# 接受

其语法树如下:

2869373-66185eacc00a4423.png

语法树

  • 32
    点赞
  • 130
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
摘 要 编译程序的工作过程通常是词法分析、语法分析、语义分析、代码生成、代码优化。编译程序的这些过程的执行先后就构成了编译程序的逻辑结构,但是这些逻辑结构不一定是按照某一个固定顺序的,也有可能是按照平行或者互锁的方式执行的。 本次课程设计是就简单优先文法原理来做一个简单优先分析器。简单优先分析文法的基本思想是对一个文法按一定的原则求出该文法所有符号包括终结符和非终结符之间的优先关系,按照这种关系确定规约过程中的句柄,它的规约过程实际上是规范规约。在算法实现过程中,主要使用visual C++进行编程。 关键字 简单优先关系 大于关系 小于关系 等于关系 Abstract Compiler of the process is usually lexical analysis, grammar analysis, semantic analysis, code generation, code optimization. Compiler of the implementation of these processes have posed a compiler on the logical structure, but these may not necessarily be in accordance with the logical structure of a fixed order, may also be in accordance with the parallel or interlocking approach to the implementation of the. This course is designed on the simple principle of priority to do a simpegrammar priority Analyzer。Simple grammar priority of the basic idea of a grammar obtained by certain principles of the grammar, including all the symbos at the end and at the end of the non-priority, according to this relationship in the process of determining the statute handler, it is actually the process of regulating the Statute of the Statute. In the algorithm process, the main use of visual C programming. Key Words Simple priority relations Over relations Less than relations Equal relations 目 录 摘要…………………………………………………………………………………………2 一、概述……………………………………………………………………………………4 (一)实验环境与开发工具 ………………………………………………………‥4 (二)简单优先文法简介 ……………………………………………………………4 (三)基本概念 ………………………………………………………………………4 (四)优先关系 ………………………………………………………………………4 二、需求分析 ……………………………………………………………………………5 (一)总体功能需求 …………………………………………………………………5 (二)系统的主要功能函数 …………………………………………………………5 (三)系统的设计思想 ………………………………………………………………6 三、详细设计 ……………………………………………………………………………7 (一)等于关系模块 …………………………………………………………………7 (二)小于关系模块 …………………………………………………………………8 (三)大于关系模块 …………………………………………………………………10 (四)句子识别模块 …………………………………………………………………12 四、测试结果………………………………………………………………………………16 五、小结……………………………………………………………………………………19 六、参考文献 ……………………………………………………………………………20 附录 源程序 ………………
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值