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
  • 词法分析
  • LL(1) 分析表生成
  • 相关文件

Was this helpful?

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

阶段任务

PreviousPA1-B:基于 LL(1) 的语法分析器半自动构造NextLL(1) 文法分析

Last updated 5 years ago

Was this helpful?

这一阶段的任务是与 PA1-A 相同,也是进行语法分析器的构造。 不同之处在于,这一阶段要求你借助 LL(1) 分析方法进行递归下降语法分析,并支持一定程度的错误恢复——即语法分析器在遇到语法错误时不终止分析过程, 而是继续分析,直至读到 EOF。

词法分析

本阶段的无需考虑手工构造词法分析器,请沿用 PA1-A 阶段 JFlex 工具生成的词法分析器,即保留上一阶段的 Decaf.jflex。

LL(1) 分析表生成

本阶段实验给出了一种工作量可控的语法分析“半手工”构造方案——先利用 工具从文法描述文件自动生成 LL(1) 分析表, 再完善 LLParser.java 中的 LL(1) 分析算法(会调用相关接口来访问工具生成的 LL(1) 分析表),以支持错误恢复。 框架中已经给出的分析算法只能处理语法正确的程序。对于存在语法错误的程序,此算法有可能抛出运行时错误。 同学们需要为其添加错误恢复功能,使其也能正确处理存在语法错误的程序,不抛出任何运行时错误。

相关文件

与本阶段相关的文件有:

src
└── main
    ├── jflex
    │   └── Decaf.jflex         词法描述(同 PA1-A)
    ├── ll1pg
    │   └── Decaf.spec          LL(1) 文法描述
    └── java
        └── decaf
            ├── frontend
            │   ├── parsing
            │   │   ├── AbstractLexer.java      抽象词法分析器,提供词法分析的辅助方法
            │   │   ├── AbstractParser.java     抽象文法分析器,提供文法分析的辅助方法
            │   │   ├── LLParser.java           本阶段文法分析入口
            │   │   ├── SemValue.java           文法分析器使用的语义值
            │   │   └── Tokens.java             单词列表
            │   ├── tree
            │   │   ├── TreeNode.java           语法树基类定义
            │   │   ├── Tree.java               语法树定义
            │   │   ├── Visitor.java            语法树访问者
            │   │   └── Pos.java                语法符号在源码中的位置
            └── printing
                ├── PrettyPrinter.java          格式化缩进打印器
                └── PrettyTree.java             语法树缩进打印

除 LLParser.java 外,其他文件均与 PA1-A 一致。

ll1pg