decaf-doc
  • Introduction
  • pa1a
    • 实验内容
    • lalr1使用指导
      • 编写lexer
      • impl块的可选属性
      • 产生式和语法动作
      • 解决冲突
      • 一个完整的例子
    • 抽象语法树
    • 框架中部分实现的解释
    • 文件结构
  • pa1b
    • 实验内容
    • lalr1使用指导
    • 错误恢复
    • 文件结构
  • pa2
    • 实验内容
    • 语义分析
    • 符号表
    • 语句的返回类型
    • visitor模式
    • 框架中部分实现的解释
  • pa3
    • 实验内容
    • 中间代码
    • 中间代码中的类型信息
    • 运行时存储布局
    • 面向对象机制
    • tacvm介绍
  • pa4
    • 实验内容
    • 基本块
    • 数据流分析概述
    • 数据流优化概述
    • 公共表达式提取
    • 复写传播
    • 常量传播
    • 死代码消除
  • pa5
    • 实验内容
    • 图着色基本原理
    • 改进干涉图节点
    • 着色算法
    • 预着色节点
    • 干涉图节点合并
    • 调用约定
Powered by GitBook
On this page

Was this helpful?

  1. pa1b

实验内容

在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)文法实现我们要求的拓展语法。新语法具体细节可以参考专门的文档。如果有什么特别需要注意的地方,之后会在这里补充。

Previouspa1bNextlalr1使用指导

Last updated 5 years ago

Was this helpful?