lr分析程序的设计与实现_编译原理学习笔记(四):语法分析

本文详细介绍了编译原理中的LR分析程序设计与实现,包括自上而下的语法分析方法,如LL(1)文法、递归下降分析器和预测分析程序,以及自下而上的算符优先分析法和LR分析法,重点讨论了如何消除左递归和回溯问题,以及各种分析表的构造方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

语法分析

  • 语法分析方法
    • 自下而上:算符优先分析法、LR分析法
    • 自上而下:递归下降分析法、预测分析程序

56c46c8ceb0de4e88a77981ba7d193a5.png

一、自上而下分析

1.1 左递归 & 回溯

1.1.1 面临的问题

  • 回溯问题
    • 分析过程中,当一个非终结符用某一个候选匹配成功时,这种匹配可能是暂时的
    • 因此如果在后续匹配中出错的话,不得不“回溯”

86d345bff186b0f6c52c0fc4be132d04.png
  • 文法左递归问题
    • equation?tex=P+%5Crightarrow+P%5Calpha,匹配过程会无限循环下去

2d46992e7c4199ca5308868add665122.png

1.1.2 消除左递归

「消除直接左递归」

  • 核心思想:左递归变右递归

5c248593988ecd81e27430bfc5f64f37.png
  • 例题

512d74321d13f6f7fd8bf336e967998b.png

「消除间接左递归」

  • 要求

155e5ad3159fc7efda5e1b62b49d9a7f.png
  • 核心思想
    • 消除回路中的节点

caf4816645685a6dca62aaacb57518d0.png
  • 算法

5c6e5b87923ace003d7eb52f8f125a78.png
  • 例题
S -> Qc | c
Q -> Rb | b
R -> Sa | a

顺序 1:R、Q、S
答案:
S -> abcS' | bcS' | cS'
S' -> abcS' | 空字

顺序 2:S、Q、R
答案:
S -> Qc | c
Q -> Rb | b
R -> bcaR' | caR' | aR'
R' -> bcaR' | 空字

1.1.3 消除回溯

  • 消除回溯的核心在于能确定非终结符 A 所有候选可能推出的第一个符号,因此引入 FIRST 集

9ed2ef076703f1b32e6028d4fee7d26e.png
  • 提取左公共因子 —— 令非终结符的所有候选首符集两两不相交

ade057e7abf2600cb0c1c69d8a72185a.png
  • 由于有一些非终结符会推出空字,因此我们需要定义 FOLLOW 集

c3c5963324ed8664775c2cd0b0503f46.png

1.2 LL(1) 文法

1.2.1 LL(1)定义

  • 文法定义
    • 第一个 L 表示 “从左到右扫描串”
    • 第二个 L 表示 “最左推导”
    • 第三个 1 表示 “每一步只需向前查看一个符号”

c20287277d0e24c5c937497cbecccbc7.png
  • LL(1) 分析法
    • LL(1) 文法可以对输入串进行有效的无回溯的自上而下分析

ef3915b0411bf9b0f52779f41455c1b0.png

1.2.2 FIRST

  • 定义

07fcdc16ba17efa81f84e0e36b7f61c9.png
  • 求解算法
    • 核心思想:用 “对有限产生式的反复扫描” 代替 “穷尽所有推导”
  • 构造每个文法符号的 FIREST 集

e1618191ce9e042b9bbda9ca241d9b63.png
  • 构造任何符号串的 FIRST 集

34c6b2e0596917c068932021f04d5dcf.png

1.2.3 FOLLOW

  • 定义

6b8bdda4e2f69ae281771467f3a6d358.png
  • 构造每个非终结符的 FOLLOW 集

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值