作业3说明
作业3 – 杰克编译器
加权和到期日期
- 此作业的分数占整个课程分数的10%。
- 功能标记将由Web提交系统自动授予。
- 截止日期: 里程碑 – 第11周星期五晚上11:55, 决赛 – 第12周星期五晚上11:55。
- 延迟处罚: 对于每个部分,最高分数将被延迟每天/每天减少25%。如果您的标记大于最大值,它将减少到最大值。
- 核心知识体系(CBOK)领域: 抽象,设计,硬件和软件,数据和信息以及编程。
项目描述
在此作业中,您将完成nand2tetris课程中项目10和11的变体,Nand2Tetris项目10和11的重新编写描述如下所示。特别是,您将编写以下程序,这些程序用于实现优化Jack编译器的不同组件,该编译器将Jack类编译为Hack Virtual Machine(VM)代码:
- jparser – 解析Jack程序并构造一个抽象语法树。
- jcodegen – 这需要一个抽象语法 树并输出 等效的 VM代码。
- jpretty – 这需要一个抽象的语法树,并生成一个精心格式化的Jack程序。
- jopt-r – 这会复制 一个抽象语法 树并删除 冗余代码。
SVN存储库
您必须在svn存储库中创建一个名为:<year> / <semester> / cs / assignment3的目录。此目录必须仅包含以下文件和目录- Web提交系统将检查:
- Makefile – make使用此文件来编译您的提交 – 请勿修改此文件。
- .cpp C ++源文件 – 在组件程序要求中指定的命名。
- .h C ++包含文件- 在组件程序要求中指定的命名。
- lib – 此目录包含预编译的程序和组件 – 请勿修改此目录。
- includes – 此目录包含预编译类的.h文件 – 不要修改此目录。
- tests – 此目录包含测试脚本和测试数据,您也可以添加自己的测试。
注意:如果文件 lib / lib.a 没有添加到您的svn存储库,则需要使用以下方法显式添加它:
%svn添加lib / lib.a
提交和标记方案
此分配在Web提交系统中有两个分配 命名:作业3 – 里程碑提交和作业3 – 最终提交。评估基于“编程任务评估 ” “。
作业3 – 里程碑提交:第11周星期五下午11:55到期
由Web提交系统授予的标记里程碑提交的里程碑提交最多可为作业3的分数贡献20%。 在应用延迟处罚后,您的里程碑提交标记将在作业标记完成后发布到myuni成绩簿。
您的程序必须使用C ++编写, 并将使用Jack语言程序进行测试,这些程序可能在语法上是正确的,也可能不是 以前生成的抽象语法树。尽管可以运行各种测试,包括一些秘密 测试,但只有那些需要工作的jack_parser 程序的测试才会记录标记 。您的程序将使用lib 目录中的Makefile 和预编译组件进行编译。 注意:即使你问,你也不会得到秘密测试的反馈 !
作业3 – 最终提交:第12周星期五下午11:55到期
最终提交的分数为分配3的分数贡献了高达80%。
您的最终提交标记将是授予的标记的几何平均值Web提交系统Web提交系统Assessment – Mark Calculations
自动标记
自动标记将以与里程碑提交完全相同的方式编译和测试两个令牌生成器。不同之处在于,将记录所有测试的标记,包括 秘密测试。 注意:如果你的程序不能任意这些的秘密 测试,你将不会收到任何反馈有关这些秘密 测试,即使你问!
每个组件程序的自动测试标记将按如下方式加权:
- jparser – 30%
- jcodegen – 40%
- jpretty – 10%
- jopt-r – 20%
测试脚本能够独立测试每个组件程序,但我们强烈建议您按上述顺序尝试组件程序,以便获得最大的回报。您应该通过完成jparser 和 jcodegen 程序获得最重要的学习好处。
日志标记
代码审查标记
Nand2Tetris项目10和11:编译器I和II
背景
现代编译器,如Java和C#,都是多层的:编译器的前端从高级语言转换为中间VM语言; 编译器的后端从VM语言进一步转换为主机平台的本机代码。在之前的研讨会上,我们开始构建Jack Compiler的后端层(我们将其称为VM Translator); 我们现在转而构建编译器的前端。这种结构将跨越两部分:语法分析和代码生成。
目的
在这个项目中,我们构建了一个Syntax Analyzer,它根据Jack语法解析Jack程序,生成一个捕获程序结构的抽象语法树。然后我们可以选择,我们可以将生成抽象语法树的逻辑转换为生成VM代码的逻辑,或者我们可以编写可以将任意数量的转换应用于抽象语法树的单独逻辑。转换可以包括相当打印原始程序,将特定优化应用于抽象语法树或生成VM代码。这反映了研讨会中使用的替代方法。
资源
该项目的相关阅读材料是第10章和第11章。但是,您应该遵循早期研讨会中使用的程序结构,而不是第10章和第11章中提出的结构。您必须用C ++编写程序。您应该使用Linux命令 diff 将程序输出与我们提供的示例输出文件进行比较。类似于研讨会和之前作业中使用的一组预编译类在下面附带的zip文件中。下面附带的zip文件中提供了此项目所需的所有测试文件和测试脚本。
组件功能
我们在其自己的页面上提供了对每个组件程序的要求的描述。这包括有关如何编译,运行和测试每个组件程序的说明。
jparser
该jparser 程序使用提供tokeniser解析杰克程序并构建一个等效抽象语法树。中描述了该组件程序的特定要求jack_parser()
jcodegen
jpretty
该jpretty 程序遍历产生的抽象语法树,并打印格式化到一个特定的编码标准杰克程序。 此组件程序的具体要求在jack_pretty()中描述
JOPT-R
测试
测试中描述了数据,包括用于命名每个测试的预期输出的约定Testing页面。