编译原理——自下而上的语法分析方法(算符优先分析法)

自下而上的语法分析方法(算法优先分析法)

概述

  • 归约:自上而下的语法分析过程
    在这里插入图片描述
    在这里插入图片描述

过程:

  • 初态:栈中只有#,读头指向最左边的单词符号
  • 语法分析程序执行动作
    • 移进读入一个单词并压入栈中,读头后移
    • 归约,检查栈顶若干符号,能否进行归约,若能,以产生式左部代替该符号,同时输出产生式编号
  • 例子:该例子使用的是简单优先分析法
    在这里插入图片描述在这里插入图片描述
    这种方式的问题,只有在有树图的情况下才好判断句柄,也就是难以寻找句柄,对于电脑来说,不容易实现,且耗费时间多

相邻文法符号之间的优先关系:

  • 句柄寻找:
    • 句柄的概念:在一棵树中,这棵树的最左直接短语。
    • 只有在同一个候选项内的符号才可能是句柄
      在这里插入图片描述
      #号的优先级最小

简单优先文法:

在这里插入图片描述在这里插入图片描述

解释:X=Y关系相当于,XY在同一个产生式内;X<Y关系相当于,Y要先于X被归约;X>Y关系相当于,X要先于Y被归约,且如果出现了>号那么就一定出现了可以被归约产生式。
为什么能存在空串产生式:如果存在空串产生式,那么在输入串中也会出现将空串进行归约的形式,但是输入串不能出现空串

在这里插入图片描述

算符优先分析法

  • 仿四则运算的计算过程
  • 特点:简单直观,方便表达式分析,易于手工实现,是自下而上的归约过程,但未必按句柄归约
  • 指定算符的优先级及结合性质
  • 例如:
    在这里插入图片描述在这里插入图片描述这里通过优先级的设置,让归约的过程只有一种。
  • 分析:
    在这里插入图片描述这里只关心会相继出现的终结符之间的关系,而不用关系非终结符之间的关系
    在这里插入图片描述在这里插入图片描述的其中的左符为栈顶的第一个非终结符,右符为读头下的符号,我们可以看到,当栈顶出现了+,且读头下是+先对栈中的符号进行归约操作,这样取出两个操作数和一个符号就可以进行加运算了。
    在这里插入图片描述
直观算符分析法:
  • 操作:
    在这里插入图片描述
    因为只需要考虑运算符之间的关系,当遇到数字就当是遇到非终结符,只需要将它压入操作数栈中,当遇到运算符就将他压入操作符栈中。
    操作数栈和操作符栈,每次操作符入栈比较操作符栈和其的优先级,若这个符号比操作符栈中的优先级大或相等,入栈,否则去除操作数栈中的两个数和操作符栈中的一个符号运算,将运算结果放入操作数栈中。
    在这里插入图片描述
    操作符栈中,已经入栈的符号之间的关系,必然是下面的符号的优先级小于上面的符号,可以看成左括号,而如果出现栈顶符号大于读头,那么右括号就出现了。
    在这里插入图片描述在这里插入图片描述

  • 算符优先分析法必须是算符文法

  • 算符文法的定义:
    在这里插入图片描述
    当出现ii+的形式只能有一种表达,不会出现二义性
    在这里插入图片描述
    为什么这个有R-+>Qb这个选项,因为Q不参与优先级的比较。
    在这里插入图片描述
    在这里插入图片描述
    可以得知:将Ai的所有首终结符推出,这个集合的优先级大于Ai-1,同时Ai的所有尾终结符推出,这个集合的优先级大于Ai+1
    在这里插入图片描述在这里插入图片描述
    在这里插入图片描述

  • 构造算法

    • 构造FIRSTVT§算法
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      解释:S->aB B->Cd C->c
      首先使用S->aB;求它的终结首符集,入栈(S,a) 布尔数据F(p,a)为真
      使用B->Cd;求它的终结符集,入栈(B,d)
      使用C->c;入栈(C,c)
      出栈(C,c),查看所有终结符是否有p->C……的表达式,如果有c不属于FIRSTVT§,将c加入其中
    • 构造算符优先表
      • 过程:
        在这里插入图片描述在这里插入图片描述
  • 非规范分析:
    在这里插入图片描述在这里插入图片描述最左素短语:非规范归约中的名词,非规范归约就是通过归约最左素短语来加快归约速度的
    在这里插入图片描述短语:子树根的 所有孩子结点通过不同组合而成。例如E的短语包括E+T,T+T,T+T*I等等。
    素短语:就是一个短语,至少有一个终结符,且除它自生外没有其他素短语,最左边的素短语称为最左素短语

    在这里插入图片描述在这里插入图片描述

  • 一些理解:
    这一章中,主要讲了自下而上的分析方法,优先分析法,也就是归约的过程,其中先讲了简单优先分析法,它的文法要求是二型文法,而且不产生空串和相同的产生式,但是这种分析方法对于终结符和非终结符的关系都列了出来,空间上浪费大;然后讲了算符优先分析法,以直观算符优先分析法引入,让我们知道通过算符是如何进行分析的,这个文法的定义是:首先算符文法要求是二型文法,在此基础上产生式不含有两个非终结符连在一起的情况,算符优先文法要求:在算符文法的基础上,一个终结符和另一个终结符只有四种关系之一。

  • 为什么二义性文法不能使用算符优先分析法:
    二义性文法对于某个句子,可以有多颗语法树形成,因此两个终结符之间的关系就不止一种了,不遵从算符优先文法的两两非终结符之间只有四种关系之一的规定,通过对算符优先级的定义,才可以确定唯一的优先级。

  • 为什么算符优先文法需要是算符文法。
    因为算符文法规定两个非终结符不能出现在一起,那为什么算符优先文法中两个非终结符不能在一起,因为,非终结符不能直接输入,只能依靠我们的终结符归约而成,当两个非终结符在一起时,我们进行归约,例如:P->aXYb,这样的情况,则我们需要将lastvt(X)>firstvt(Y),只有这样填写才能按照规则将X归约成功,但是当X归约成功后,对Y的归约,因为没有非终结符和终结符之间的关系表示,我们需要last(X)<firstvt(Y)这样的关系,显然这样的关系让算符优先分析表的一个格子中存在了两种关系。

  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值