编译原理——语法分析

语法分析

  1. 本章内容:根据token流生成AST

上下文无关文法(CFG)

在这里插入图片描述

  1. 最左推导:即对每个产生式先从左端的非终结符开始推导
  2. 二义性:给定文法,若存在某个句子有多个最左/右推导,既可以生成多棵解析树,则这个文法就是二义的
    1. 消除二义性:主要方式E—>E+E1 | E1 ; E1—>num
    2. 在这里插入图片描述

自顶向下语法分析技术

1.回溯算法

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

2.消除左递归

注意这里的=+>,意思是可能经过一步或多步到达

重点是先观察
在这里插入图片描述

2.预测分析技术

  1. 在这里插入图片描述
1. LL(1)文法
  1. 在这里插入图片描述
  2. 构建解析表: 在这里插入图片描述
    根据解析表和下一步看到的非终结符来比较,查看解析表中对应位置的序号,然后进行展开,若展开后得到的非终结符与句子中的非终结符一致,则匹配该非终结符
  3. 构建解析表需要两个函数:FIRST() FOLLOW()
    1. 在这里插入图片描述
    2. 在这里插入图片描述
    3. 在这里插入图片描述
    4. LL(1)文法的条件:在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
2.递归下降算法
  1. 有了解析表的概念,对于LL(1)文法,又是我们不必实际构建解析表,并且可以借助系统栈来实现预测分析,此即递归下降算法
  2. 在这里插入图片描述
  3. 在这里插入图片描述

自底向上的语法分析

  1. 基本思想:一边从左—>右扫描输入,一边自叶—>根构建解析树,不成功便报错
  2. 自底向上语法分析的通用框架:移入—归约
  3. 因为自底向上是自左向右归约,也就是自右向左推导,即最右推导。
  4. 移入归约的过程(也是通过栈的方式,根据栈顶的句柄来决定如何归约)在这里插入图片描述
  5. 为了应对如何识别句柄的问题,人们提出了LR语法分析技术

LR技术

  1. 特点:由表格驱动。只要写出上下文无关文法就能够造出识别该语言的LR语法分析器。最通用的无回溯移入归约分析技术
  2. 例子:在这里插入图片描述
    图中的意思是:Sn即shift(移入)之后栈顶切换到状态n,然后去读下一token
    Rn即按第n条产生式reduce(归约),归约后状态弹出,弹出的状态数量为当前symbols中的数量,然后根据归约得到的非终结符以及栈项目目前状态,找到GOTO相应位置的状态码然后压入栈顶
LR(0)项
  1. 引入的目的是确定多个状态及他们之间的转移关系,即构建ACTION表,通过项的手段来确立。
  2. LR(0)项的含义:项描述了句柄识别的状态在这里插入图片描述
  3. 增广文法
    在这里插入图片描述
  4. 核心点在于LR(0)项的定义中先归约后面的再合起来一起归约
  5. 意思即将I中点后有X的点后移,然后求闭包
  6. 首先从0状态开始,0状态即所有都等待归约,然后根据不同的GOTO构建不同的状态,形成图之后,就可以构建表,状态散发出去的边为s(shift),只有进入的边,那么就按产生式的序号来进行ruduce
  7. 为了解决简单LR(0)文法中会出现的移入归约冲突,采用SLR(1)分析,
    前提条件是在这里插入图片描述,即有两类,一类是点在中间,一类是点在最后,所以有两种解决方式:
    在这里插入图片描述
    简单概括就是若下一个输入符号在点紧跟着的后面,那么就移入(shift)这个输入符号
  8. 但是SLR(1)仍然不能解决所有问题
LR(1)项集族的构造算法:
  1. 采用展望符在这里插入图片描述
    2.关键点在于点后面仍有一个非终结符时应该怎么构建族,主要是观察该非终结符在左边的产生式以及合理判断使用什么展望符 在这里插入图片描述
LALR

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值