The Decaf Book
  • Introduction
  • 语言规范
  • Java 框架分阶段指导
    • 本章导引
    • PA1-A:语法分析器的自动构造
      • 阶段任务
      • 词法分析
      • 抽象语法树
      • 文法分析
    • PA1-B:基于 LL(1) 的语法分析器半自动构造
      • 阶段任务
      • LL(1) 文法分析
      • 错误恢复
    • PA2:语义分析
      • 阶段任务
      • 类型、符号和作用域
      • 访问者模式
      • 符号表构建
      • 类型检查
    • PA3:中间代码生成
      • 阶段任务
      • TAC 程序
      • 面向对象机制
      • 控制流的翻译
    • PA4:中间代码优化
      • 实验内容
      • 基本块
      • 数据流分析概述
      • 数据流优化概述
      • 公共表达式提取
      • 复写传播
      • 常量传播
      • 死代码消除
  • Scala 框架分阶段指导
    • 本章导引
    • PA1:语法分析器的自动构造
      • 阶段任务
      • 词法分析
      • 抽象语法树
      • 文法分析
      • 访问者模式
    • PA2:语义分析
      • 阶段任务
      • 类型、符号和作用域
      • 符号表构建
      • 类型检查
    • PA3:中间代码生成
      • 阶段任务
      • TAC 程序
      • 面向对象机制
      • 控制流的翻译
    • PA3-JVM:JVM 字节码生成
      • 阶段任务
      • JVM 字节码简介
      • 翻译过程
    • PA4:中间代码优化
      • 实验内容
      • 基本块
      • 数据流分析概述
      • 数据流优化概述
      • 公共表达式提取
      • 复写传播
      • 常量传播
      • 死代码消除
  • Rust 框架分阶段指导
    • 本章导引
    • PA1-A:语法分析器的自动构造
      • 实验内容
      • lalr1使用指导
        • 编写lexer
        • impl块的可选属性
        • 产生式和语法动作
        • 解决冲突
        • 一个完整的例子
      • 抽象语法树
      • 框架中部分实现的解释
      • 文件结构
    • PA1-B:基于 LL(1) 的语法分析器半自动构造
      • 实验内容
      • lalr1使用指导
      • 错误恢复
      • 文件结构
    • PA2:语义分析
      • 实验内容
      • 语义分析
      • 符号表
      • visitor模式
    • PA3:中间代码生成
      • 实验内容
      • 中间代码
      • 中间代码中的类型信息
      • 运行时存储布局
      • 面向对象机制
      • tacvm简述
    • PA4:中间代码优化
      • 基本块
      • 数据流分析概述
      • 数据流优化概述
      • 公共表达式提取
      • 复写传播
      • 常量传播
      • 死代码消除
    • PA5:寄存器分配
      • 实验内容
      • 图着色基本原理
      • 着色算法
      • 预着色节点
      • 干涉图节点合并
      • 调用约定
Powered by GitBook
On this page

Was this helpful?

  1. Rust 框架分阶段指导
  2. PA1-B:基于 LL(1) 的语法分析器半自动构造

实验内容

在pa1a中,我们借助lalr1提供的基于lalr(1)文法的parser generator实现了decaf的parser。在这一部分,我们的目标与pa1a相同,但不再使用lalr(1)文法,而是使用ll(1)文法,并希望支持一定程度的错误恢复。

目前lalr1中的parser和lexer耦合的比较紧,这主要是为了lalr1能更方便地检查产生式中的终结符和非终结符是否都有定义,所以没法分开成单独的lexer和parser,至少我还没有想到什么比较优雅的解决方案。因此,对于本阶段的lexer部分,大家需要把pa1a的内容复制过来。

目前的框架中,为了实现可空的else语句,使用的产生式并不完全符合ll(1)文法,对此lalr1会汇报一个冲突警告,这是最终版本的parser中唯一一个允许的警告,大家要设法消除自己编写的产生式中的冲突警告。

pa1b的目标与pa1a是一致的,框架中已经提供了decaf的基础语法的parser,大家需要在此基础上使用ll(1)文法实现我们要求的拓展语法。新语法具体细节可以参考专门的文档。如果有什么特别需要注意的地方,之后会在这里补充。

PreviousPA1-B:基于 LL(1) 的语法分析器半自动构造Nextlalr1使用指导

Last updated 5 years ago

Was this helpful?