阶段任务
这一阶段的任务是与 PA1-A 相同,也是进行语法分析器的构造。 不同之处在于,这一阶段要求你借助 LL(1) 分析方法进行递归下降语法分析,并支持一定程度的错误恢复——即语法分析器在遇到语法错误时不终止分析过程, 而是继续分析,直至读到 EOF。
词法分析
本阶段的无需考虑手工构造词法分析器,请沿用 PA1-A 阶段 JFlex 工具生成的词法分析器,即保留上一阶段的 Decaf.jflex
。
LL(1) 分析表生成
本阶段实验给出了一种工作量可控的语法分析“半手工”构造方案——先利用 ll1pg 工具从文法描述文件自动生成 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 一致。
Last updated
Was this helpful?