编译器的构造方法

本文介绍了编译器的两种主要分析方法:自顶向下和自底向上。自顶向下分析包括递归下降和预测分析,其中LL(1)是一种常见实现。自底向上分析通常采用LR(1)方法,更适用于处理各种递归。移进和归约是自底向上分析的核心操作。冲突处理部分讨论了移进/归约和归约/归约冲突,前者通常可接受,后者则需要修改文法来解决。
摘要由CSDN通过智能技术生成

一、自顶向下 (top-down) 分析方法

读取一个 (先行) 语素,即可确定匹配哪一条语法规则。

  • 1、递归下降分析法

    算法构造简单,依据语法图或扩展BNF文法。大多采用手工方法,如之前我们的 elan 项目。实际中大量使用。

  • 2、预测分析法

    大多采用 LL(1),即:从左向右,最左推导,1个先行符号。为了自动处理的需要,采用表驱动。自动工具如 LLGen。

    文法支持右递归,不支持左递归。

二、自底向上 (bottom-up) 分析方法

读取一个 (先行) 语素,还不能确定匹配哪一条语法规则,该语素放到分析栈中 (shift, 移进),在分析栈顶的语素足够多时再去匹配语法规则 (reduce,归约)。

大多采用 LR(1),即:从左向右,最右推导,1个先行符号。

算法构造复杂,实际中编译程序难以用纯手工构造,而是采用自动工具如 yacc/bison 辅助构造。

文法支持左递归、右递归和一般递归。比自顶向下方法更为强大。

三、移进和归约

自底向上分析也称移进-归约分析。

  • 1.移进 (shift)

    读入的语素(符号)不马上处理,而是移进(shift)到分析栈里。

  • 2.归约 (reduce)

    待到栈顶中的若干符号匹配某个文法规则的右端时,该串符号替换为该规则的左端。

四、移进和归约的例子


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值