【编译原理笔记06】语法分析,移入-归约分析:自底向上的分析,LR(0)分析法,LR(0)分析表的构建(基于自动机)

本文深入探讨自底向上的语法分析,重点介绍LR(0)分析法,包括LR(0)分析表的构建和自动机形式化定义。通过实例解析移入-归约分析的工作过程,讨论分析过程中的冲突问题,为后续的LR分析冲突消解奠定基础。

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

本次笔记内容:
4-8 自底向上的分析概述
4-9 LR分析法概述
4-10 LR0分析
4-11 LR0分析表构造

本节课幻灯片,见于我的 GitHub 仓库:第6讲 语法分析_3.pdf

本节课介绍了自底向上的分析,并且举了例子,发现移入-归约分析存在问题,因此引出了LR分析法,以LR(0)分析法为例。在LR(0)分析法中,最重要的就是构建LR(0)分析表,基于自动机。这个解决方案不错。但是有时,造表时可能出现一些冲突,导致这个LR(0)分析法用不了,未来将讲解LSRLR(1)分析法是如何消解冲突的。

自底向上的语法分析

  • 从分析树的底部(叶节点)向顶部(根节点)方向构造分析树
  • 可以看成是将输入串w归约为文法开始符号S的过程
  • 的语法分析采用最左推导方式
  • 的语法分析采用最左归约方式(反向构造最右推导
  • 自底向上语法分析的通用框架:移入-归约分析(Shift-Reduce Parsing)
例:移入-规约分析

逐步分析如图右侧“动作”,很明确;个人理解是从闻法得右侧向左推导。

注意到,每一个蓝色虚线划分的区域中,栈+剩余输入的内容,总是构成一个相同的“规范句型”。

移入-归约分析的工作过程

在对输入串的一次从左到右扫描过程中,语法分析器将零个或多个输入符号移入的顶端,直到它可以对栈顶的一个文法符号串β进行归约为止;

  • 然后,它将β归约为某个产生式的左部;
  • 语法分析器不断地重复这个循环,直到它检测到一个语法错误,或者栈中包含了开始符号且输入缓冲区为空(当进入这样的格局时,语法分析器停止运行,并宣称成功完成了语法分析)为止。
移入-归约分析器可采取的4种动作
  • 移入:将下一个输入符号移到栈的顶端;
  • 归约:被归约的符号串的右端必然处于栈顶。语法分析器在栈中确定这个串的左端,并决定用哪个非终结符来替换这个串;
  • 接收:宣布语法分析过程成功完成;
  • 报错:发现一个语法错误,并调用错误恢复子例程。
移入-归约分析中存在的问题

如图,对一个语句 var iA , iB : real 进行分析,最后剩余输入中已经没有任何符号了,而栈中并没有归约出文法的开始符号<S>,因此分析失败。

但是,这个文法其实是合法的句子,那么问题出在:错误地识别了句柄,如上图;应该如下图一样进行分析。

那么,如何避免这种错误?正确识别句柄呢?

将在接下来地LR分析技术中详细介绍。

LR分析法

  • LR文法(Knuth, 1963) 是最大的、可以构造出相应移入-归约语法分析器的文法类
    • L: 对输入进行从到右的扫
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值