编译原理
  • 编译原理
  • 一些简答题
  • 绪论
    • 编译器简介
    • 程序设计语言
    • 静态与动态
    • 参数传递机制
  • 词法分析
    • 词法单元、模式、词素
    • 串和语言
    • 正则表达式
    • 状态转换图
    • 不确定有穷自动机NFA
    • 确定有穷自动机DFA
    • 算法:正则表达式转NFA
    • 自动机到词法分析器
  • 语法分析
    • 语法分析器
    • 上下文无关文法
    • 二义性和左递归
    • 递归下降语法分析
    • 算法:求解FIRST集和FOLLOW集
    • 算法:LL(1)
    • 自底向上语法分析
    • 移入-归约语法分析
    • 算法:LR(0)
    • 算法:SLR(1)
    • 算法:LR(1)
    • 算法:LALR
    • LR分析器和LALR分析器
  • 语法制导
    • 语法制导定义(SDD)
    • 综合属性和继承属性
    • 语法树上的SDD求值
    • 依赖图
    • L属性的SDD
    • 类型
    • SDD的应用
  • 中间代码生成
    • 三地址代码
    • SSA(静态单赋值)
    • 类型和声明
    • 表达式的翻译
    • 类型检查
    • 控制流
    • 回填
  • 运行时刻环境
    • 存储组织
    • 栈式分配
    • 栈中非局部数据的访问
    • 堆管理
    • 垃圾回收
  • 代码生成
    • 代码生成器的设计
    • 目标语言
    • 目标代码中的地址
    • 基本块和流图
    • 基本块的优化
Powered by GitBook
On this page
  • 移入-归约分析中的冲突
  • LR语法分析器
  • LR语法分析思路
  1. 语法分析

移入-归约语法分析

Previous自底向上语法分析Next算法:LR(0)

Last updated 4 months ago

使用一个栈来保存归约/扫描移入的文法符号,栈中符号(从底向上)和待扫描的符号组成了一个最右句型。

四个操作

  • 移入:将下一个输入符号移入到栈顶

  • 归约:将句柄规约为相应的非终结符号

    句柄总是在栈顶,具体操作时弹出句柄,压入被规约到的非终结符号。

  • 接受:宣布分析过程成功完成

  • 报错:发现语法错误,调用错误恢复子程序

移入-归约分析中的冲突

对于有些不能使用移入-规约分析的文法,不管用什么样的移入-归约分析器都会达到同样的结果

即使知道栈中所有内容,以及后续k个输入符号,仍然:

  • 无法知道是否该进行归约(移入-归约冲突)

  • 无法知道按照什么产生式进行归约(归约-归约冲突)

LR语法分析器

LR(k)的语法分析概念:

  • L表示最左扫描,R表示反向构造出最右推导

  • k表示最多向前看k个符号

当k增大时,相应的语法分析器的规模急剧增大

  • k=2时,程序语言的语法分析器的规模通常非常庞大

  • 当k=0或1时,已经可以解决很多语法分析问题,因此具有实践意义

LR语法分析器的优点

  1. 由表格驱动,虽然手工构造表格工作量很大,但是表格可以自动生成

  2. 对于几乎所有的程序设计语言,只要写出上下文无关文法,就能够构造出识别该语言的LR语法分析器

  3. 最通用的无回溯移入-归约分析技术

  4. 能分析的文法比LL(k)文法更多

LR语法分析思路

核心任务:识别句柄,规约句柄

句柄:栈中内容(已扫描/规约的串)的最右可规约子串

关键问题:如何知道栈中内容可以归约了?

  • 维护一个状态,记录当前句柄识别的进度

项(term):一个文法产生式加上在其中某处的一个点