Skip to content

Commit b33394c

Browse files
committed
for 2025: remove contest, add parser stage, rename 2024->2025
1 parent a39806e commit b33394c

File tree

10 files changed

+68
-55
lines changed

10 files changed

+68
-55
lines changed

README.md

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,11 @@ int qsort(int a[], int l, int r) {
2222
}
2323
```
2424
25-
2024 年秋季学期基本沿用了 2023 年秋季学期《编译原理》课程的语法规范。为了贴合课程教学内容,提升训练效果,课程组设计了比较完善的编译器框架,包括词法分析、语法分析、语义分析、中间代码生成、数据流分析、寄存器分配、目标平台汇编代码生成等步骤。每个 step 同学们都会面对一个完整的编译器流程,但不必担心,实验开始的几个 step 涉及的编译器框架知识都比较初级,随着课程实验的深入,将会循序渐进地引入各个编译器功能模块,并通过文档对相关技术进行分析介绍,便于同学们实现相关编译功能模块。
26-
27-
从2023年起,课程组增加了大实验环节,大实验是一个**可选**环节。可以参考[大实验参考文档](docs/contest/intro.md)获取更多信息。
25+
2025 年秋季学期基本沿用了往年《编译原理》课程的语法规范。为了贴合课程教学内容,提升训练效果,课程组设计了比较完善的编译器框架,包括词法分析、语法分析、语义分析、中间代码生成、数据流分析、寄存器分配、目标平台汇编代码生成等步骤。每个 step 同学们都会面对一个完整的编译器流程,但不必担心,实验开始的几个 step 涉及的编译器框架知识都比较初级,随着课程实验的深入,将会循序渐进地引入各个编译器功能模块,并通过文档对相关技术进行分析介绍,便于同学们实现相关编译功能模块。
2826
2927
## 实验起点和基本要求
3028
31-
本次实验一共设置 13 个步骤(其中 step 0 和 step 1 为实验框架熟悉,不需要修改框架代码)。后续的 step 2-13 我们将由易到难完成 MiniDecaf 语言的所有特性,由于编译器的边界情况很多,你**只需通过我们提供的正例与负例即可**。
29+
本次实验一共设置 14 个步骤(其中 step 0 和 step 1 为实验框架熟悉,不需要修改框架代码)。后续的 step 2-13 我们将由易到难完成 MiniDecaf 语言的所有特性,由于编译器的边界情况很多,你**只需通过我们提供的正例与负例即可**。此外,parser step 为同学们提供了一个上手语法分析器的机会
3230
3331
我们以 stage 组织实验,各个 stage 组织如下:
3432
@@ -41,9 +39,11 @@ int qsort(int a[], int l, int r) {
4139
</li>
4240
<li>
4341
变量和赋值(step5)。在这个 stage 中你将第一次支持变量声明与赋值。
42+
作用域和块语句(step6)。在这个 stage 中你的编译器将支持作用域,以便支持后续的条件和循环。
4443
</li>
4544
<li>
46-
作用域和块语句(step6)。在这个 stage 中你的编译器将支持作用域,以便支持后续的条件和循环。
45+
手工自顶向下语法分析器(parser step)。在这个 step 中你将实现一个手工的自顶向下语法分析器,来替代当前框架中使用的 ANTLR 生成的语法分析器。
46+
这个语法分析器只需要支持前面的几个 step,在随后的各个 step 中我们仍然使用 ANTLR 生成的语法分析器。
4747
</li>
4848
<li>
4949
条件和循环(step7-step8)。在这个 stage 中你将支持条件判断和循环语句,此时,你的编译器可以编译的程序就从线性结构程序到了有分支结构的程序。
@@ -61,9 +61,9 @@ int qsort(int a[], int l, int r) {
6161
6262
6363
其中,stage0 为环境配置和框架学习,无需进行编程,不计入成绩。
64-
stage1 - stage5 为 5 个基础关卡,你需要通过它们以拿到一定的分数(35%)。
65-
stage6 为升级关卡,如果你学有余力,完成它们可以减少期末考试在总评中所占的比重(完整完成可以获得占总评 7% 的成绩并替代期末考试对应权重)。
66-
stage7 为进阶关卡,如果你依然学有余力,你可以在这里实现一些编译优化(完整完成可以获得占总评 8% 的成绩并替代期末考试对应权重)。注意,你需要在完成 stage6 后才能尝试 stage7,否则无法获得对应分数。
64+
stage1 - stage4 与 parser-stage 为 5 个基础关卡,你需要通过它们以拿到一定的分数(35%)。
65+
stage5 为升级关卡,如果你学有余力,完成它们可以减少期末考试在总评中所占的比重(完整完成可以获得占总评 7% 的成绩并替代期末考试对应权重)。
66+
stage6 为进阶关卡,如果你依然学有余力,你可以在这里实现一些编译优化(完整完成可以获得占总评 8% 的成绩并替代期末考试对应权重)。注意,你需要在完成 stage5 后才能尝试 stage6,否则无法获得对应分数。
6767
6868
我们以 step 组织文档,每个 step 的文档都将以如下形式组织:首先我们会介绍当前 step 需要用到的知识点,其次我们会以一个当前 step 具有代表性的例子介绍它的整个编译流程。在之前 step 中已经介绍的知识点,我们会略过,新的知识点和技术会被详细介绍。
6969
@@ -75,7 +75,7 @@ stage7 为进阶关卡,如果你依然学有余力,你可以在这里实现
7575
7676
## 实验提交
7777
78-
大家在网络学堂提交 **git.tsinghua.edu.cn** 的帐号名后,助教会给每个人建立一个私有的仓库,URL 为 https://git.tsinghua.edu.cn/compiler24/stu24/minidecaf-你的学号 ,将作业提交到那个仓库即可。
78+
大家在网络学堂提交 **git.tsinghua.edu.cn** 的帐号名后,助教会给每个人建立一个私有的仓库,URL 为 https://git.tsinghua.edu.cn/compiler25/stu25/minidecaf-你的学号 ,将作业提交到那个仓库即可。
7979
每个 stage 会对应于一个 branch,当切换到一个新的 branch 上实现时,你可以用 `git checkout -b` 来创建一个新的分支。
8080
8181
本学期我们使用清华大学代码托管服务(git.tsinghua)的 CI(持续集成)来**测试**大家的代码实现及**提交实验报告**。

SUMMARY.md

Lines changed: 12 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -41,22 +41,27 @@
4141
* [通过例子学习](docs/step4/example.md)
4242
* [规范](docs/step4/spec.md)
4343

44-
## Stage2:变量
44+
## Stage2:变量和作用域
4545

4646
* step5:局部变量和赋值
4747
* [实验要求](docs/step5/intro.md)
4848
* [通过例子学习](docs/step5/example.md)
4949
* [规范](docs/step5/spec.md)
5050

51-
## Stage3:作用域
52-
5351
* step6:作用域和块语句
5452
* [实验要求](docs/step6/intro.md)
5553
* [通过例子学习](docs/step6/example.md)
5654
* [数据流分析](docs/step6/dataflow.md)
5755
* [规范](docs/step6/spec.md)
5856

59-
## Stage4:条件和循环
57+
## Parser Stage:手工自顶向下语法分析器
58+
59+
* parser step
60+
* [实验要求](docs/step-parser/intro.md)
61+
* [通过例子学习](docs/step-parser/example.md)
62+
* [规范](docs/step-parser/spec.md)
63+
64+
## Stage3:条件和循环
6065

6166
* step7:条件语句
6267
* [实验要求](docs/step7/intro.md)
@@ -68,14 +73,14 @@
6873
* [通过例子学习](docs/step8/example.md)
6974
* [规范](docs/step8/spec.md)
7075

71-
## Stage5:函数
76+
## Stage4:函数
7277

7378
* step9:函数
7479
* [实验要求](docs/step9/intro.md)
7580
* [通过例子学习](docs/step9/example.md)
7681
* [规范](docs/step9/spec.md)
7782

78-
## Stage6(升级):全局变量和数组
83+
## Stage5(升级):全局变量和数组
7984

8085
* step10:全局变量
8186
* [实验要求](docs/step10/intro.md)
@@ -92,26 +97,14 @@
9297
* [通过例子学习](docs/step12/example.md)
9398
* [规范](docs/step12/spec.md)
9499

95-
## Stage7(升级):寄存器分配与代码优化
100+
## Stage6(升级):寄存器分配与代码优化
96101

97102
* [选做二说明](docs/step13/readme.md)
98103

99104
* step13:寄存器分配算法改进
100105
* [实验要求](docs/step13/intro.md)
101106
* [实验指导](docs/step13/example.md)
102107

103-
## 大实验参考文档
104-
105-
* [大实验简介](docs/contest/intro.md)
106-
* [前端设计](docs/contest/frontend.md)
107-
* [中端设计](docs/contest/midend/midend.md)
108-
* [中间表示设计](docs/contest/midend/ir.md)
109-
* [中间代码生成](docs/contest/midend/irgen.md)
110-
* [静态单赋值](docs/contest/midend/ssa.md)
111-
* [常量传播](docs/contest/midend/cp.md)
112-
* [死代码消除](docs/contest/midend/dce.md)
113-
* [后端设计](docs/contest/backend.md)
114-
115108
## 参考资料
116109

117110
* [参考资料](REFERENCE.md)

docs/step-parser/spec.md

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,55 +1,69 @@
11
# parser-stage 语法规范(同 step6)
22

3-
43
<pre id='vimCodeElement'>
54
<code></code>
65
<span class="SpecRuleStart">program</span>
76
<span class="SpecRuleIndicator"> :</span> <span class="SpecRule">function</span>
7+
88
<span class="SpecRuleStart">function</span>
9-
<span class="SpecRuleIndicator"> :</span> <span class="SpecRule">type</span> <span class="SpecToken">Identifier</span> <span class="SpecToken">'('</span> <span class="SpecToken">')'</span> <span class="SpecToken">'{'</span> <span class="SpecRule">block_item</span><span class="SpecOperator">*</span> <span class="SpecToken">'}'</span>
9+
<span class="SpecRuleIndicator"> :</span> <span class="SpecRule">type</span> <span class="SpecToken">Identifier</span> <span class="SpecToken">'('</span> <span class="SpecToken">')'</span> <span class="SpecRule">compound_statement</span>
1010
<span class="SpecRuleStart">type</span>
1111
<span class="SpecRuleIndicator"> :</span> <span class="SpecToken">'int'</span>
12+
13+
<span class="SpecRuleStart">compound_statement</span>
14+
<span class="SpecRuleIndicator"> :</span> <span class="SpecToken">'{'</span> <span class="SpecRule">block_item</span><span class="SpecOperator">*</span> <span class="SpecToken">'}'</span>
15+
1216
<span class="SpecRuleStart">block_item</span>
1317
<span class="SpecRuleIndicator"> :</span> <span class="SpecRule">statement</span>
1418
<span class="SpecRuleIndicator"> |</span> <span class="SpecRule">declaration</span>
19+
1520
<span class="SpecRuleStart">statement</span>
1621
<span class="SpecRuleIndicator"> :</span> <span class="SpecToken">'return'</span> <span class="SpecRule">expression</span> <span class="SpecToken">';'</span>
17-
<span class="SpecRuleIndicator"> |</span> <span class="SpecRule">expression</span><span class="SpecOperator">?</span> <span class="SpecToken">';'</span>
18-
<span class="SpecRuleIndicator"> |</span> <span class="SpecToken">'if'</span> <span class="SpecToken">'('</span> <span class="SpecRule">expression</span> <span class="SpecToken">')'</span> <span class="SpecRule">statement</span> <span class="SpecOperator">(</span><span class="SpecToken">'else'</span> <span class="SpecRule">statement</span><span class="SpecOperator">)?</span>
22+
<span class="SpecRuleIndicator"> |</span> <span class="SpecRule">compound_statement</span>
1923
<span class="SpecRuleStart">declaration</span>
2024
<span class="SpecRuleIndicator"> :</span> <span class="SpecRule">type</span> <span class="SpecToken">Identifier</span> <span class="SpecOperator">(</span><span class="SpecToken">'='</span> <span class="SpecRule">expression</span><span class="SpecOperator">)?</span> <span class="SpecToken">';'</span>
25+
2126
<span class="SpecRuleStart">expression</span>
2227
<span class="SpecRuleIndicator"> :</span> <span class="SpecRule">assignment</span>
28+
2329
<span class="SpecRuleStart">assignment</span>
2430
<span class="SpecRuleIndicator"> :</span> <span class="SpecRule">conditional</span>
2531
<span class="SpecRuleIndicator"> |</span> <span class="SpecToken">Identifier</span> <span class="SpecToken">'='</span> <span class="SpecRule">expression</span>
32+
2633
<span class="SpecRuleStart">conditional</span>
2734
<span class="SpecRuleIndicator"> :</span> <span class="SpecRule">logical_or</span>
2835
<span class="SpecRuleIndicator"> |</span> <span class="SpecRule">logical_or</span> <span class="SpecToken">'?'</span> <span class="SpecRule">expression</span> <span class="SpecToken">':'</span> <span class="SpecRule">conditional</span>
36+
2937
<span class="SpecRuleStart">logical_or</span>
3038
<span class="SpecRuleIndicator"> :</span> <span class="SpecRule">logical_and</span>
3139
<span class="SpecRuleIndicator"> |</span> <span class="SpecRule">logical_or</span> <span class="SpecToken">'||'</span> <span class="SpecRule">logical_and</span>
40+
3241
<span class="SpecRuleStart">logical_and</span>
3342
<span class="SpecRuleIndicator"> :</span> <span class="SpecRule">equality</span>
3443
<span class="SpecRuleIndicator"> |</span> <span class="SpecRule">logical_and</span> <span class="SpecToken">'&amp;&amp;'</span> <span class="SpecRule">equality</span>
44+
3545
<span class="SpecRuleStart">equality</span>
3646
<span class="SpecRuleIndicator"> :</span> <span class="SpecRule">relational</span>
3747
<span class="SpecRuleIndicator"> |</span> <span class="SpecRule">equality</span> <span class="SpecOperator">(</span><span class="SpecToken">'=='</span><span class="SpecOperator">|</span><span class="SpecToken">'!='</span><span class="SpecOperator">)</span> <span class="SpecRule">relational</span>
48+
3849
<span class="SpecRuleStart">relational</span>
3950
<span class="SpecRuleIndicator"> :</span> <span class="SpecRule">additive</span>
4051
<span class="SpecRuleIndicator"> |</span> <span class="SpecRule">relational</span> <span class="SpecOperator">(</span><span class="SpecToken">'&lt;'</span><span class="SpecOperator">|</span><span class="SpecToken">'&gt;'</span><span class="SpecOperator">|</span><span class="SpecToken">'&lt;='</span><span class="SpecOperator">|</span><span class="SpecToken">'&gt;='</span><span class="SpecOperator">)</span> <span class="SpecRule">additive</span>
52+
4153
<span class="SpecRuleStart">additive</span>
4254
<span class="SpecRuleIndicator"> :</span> <span class="SpecRule">multiplicative</span>
4355
<span class="SpecRuleIndicator"> |</span> <span class="SpecRule">additive</span> <span class="SpecOperator">(</span><span class="SpecToken">'+'</span><span class="SpecOperator">|</span><span class="SpecToken">'-'</span><span class="SpecOperator">)</span> <span class="SpecRule">multiplicative</span>
56+
4457
<span class="SpecRuleStart">multiplicative</span>
4558
<span class="SpecRuleIndicator"> :</span> <span class="SpecRule">unary</span>
4659
<span class="SpecRuleIndicator"> |</span> <span class="SpecRule">multiplicative</span> <span class="SpecOperator">(</span><span class="SpecToken">'*'</span><span class="SpecOperator">|</span><span class="SpecToken">'/'</span><span class="SpecOperator">|</span><span class="SpecToken">'%'</span><span class="SpecOperator">)</span> <span class="SpecRule">unary</span>
60+
4761
<span class="SpecRuleStart">unary</span>
4862
<span class="SpecRuleIndicator"> :</span> <span class="SpecRule">primary</span>
4963
<span class="SpecRuleIndicator"> |</span> <span class="SpecOperator">(</span><span class="SpecToken">'-'</span><span class="SpecOperator">|</span><span class="SpecToken">'~'</span><span class="SpecOperator">|</span><span class="SpecToken">'!'</span><span class="SpecOperator">)</span> <span class="SpecRule">unary</span>
64+
5065
<span class="SpecRuleStart">primary</span>
5166
<span class="SpecRuleIndicator"> :</span> <span class="SpecToken">Integer</span>
5267
<span class="SpecRuleIndicator"> |</span> <span class="SpecToken">'('</span> <span class="SpecRule">expression</span> <span class="SpecToken">')'</span>
5368
<span class="SpecRuleIndicator"> |</span> <span class="SpecToken">Identifier</span>
5469
</pre>
55-

docs/step0/intro.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# 实验环境简介
22

3-
2024年秋季学期,助教给大家提供了服务器。同学们可以选择使用我们已经配置好的机器,节省一定的时间花费。
3+
2025 年秋季学期,助教给大家提供了服务器。同学们可以选择使用我们已经配置好的机器,节省一定的时间花费。
44

55
服务器环境如下:
66
- Ubuntu 23.04
@@ -15,8 +15,8 @@
1515
1. 如何使用 ssh 登陆服务器?
1616
```bash
1717
ssh username@ip -p port
18-
# 假如你的账号为 2024000001,服务器 ip 地址为 192.168.1.1,端口为 223,则命令为:
19-
ssh 2024000001@192.168.1.1 -p 223
18+
# 假如你的账号为 2023000001,服务器 ip 地址为 192.168.1.1,端口为 223,则命令为:
19+
ssh 2023000001@192.168.1.1 -p 223
2020
```
2121
2. 建议配置 ssh 免密登录,方便大家使用服务器,然后在服务器上运行。你可以参考[这里](https://blog.csdn.net/qq_51447496/article/details/132089964)。
2222

docs/step0/testing.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,17 @@
11
## 运行实验框架
2+
23
配好环境以后,我们强烈推荐你构建运行我们提供的实验框架初始代码。
34
> 接下来我们会用到 git。
45
> git 的安装和使用会在软件工程课上讲述,同学们也自行查阅相关资料,也可以参考[这里](https://www.liaoxuefeng.com/wiki/896043488029600)
56
67
1. 按照本文档的前几节([RISCV 环境配置](./riscv_env.md)[实验框架环境配置](./env.md))配置好实验环境。
78

8-
2. 助教已经为每位同学在 git.tsinghua.edu.cn 创建了一个仓库,其中 minidecaf 的[测例仓库](https://git.tsinghua.edu.cn/compiler/2024/minidecaf-tests)为其中的一个子模块,你可以通过以下指令来在克隆主仓库的同时克隆子模块 `git clone --recursive <repository>`
9+
2. 助教已经为每位同学在 git.tsinghua.edu.cn 创建了一个仓库,其中 minidecaf 的[测例仓库](https://git.tsinghua.edu.cn/compiler/2025/minidecaf-tests)为其中的一个子模块,你可以通过以下指令来在克隆主仓库的同时克隆子模块 `git clone --recursive <repository>`
910
由于测例仓库会有所更新,在克隆之后你需要在主仓库目录下使用 `git submodule update --remote --merge` 来手动更新。
1011

1112
> 注意:由于子模块使用 ssh 链接,你需要将你的 ssh 公钥添加到你的 git.tsinghua 账号上,才能将其克隆下来。
1213
13-
3. 按照[测例](https://git.tsinghua.edu.cn/compiler/2024/minidecaf-tests)的 README 运行测试 step1,实验框架给出的初始代码可以通过 step1 的所有测例。
14+
3. 按照[测例](https://git.tsinghua.edu.cn/compiler/2025/minidecaf-tests)的 README 运行测试 step1,实验框架给出的初始代码可以通过 step1 的所有测例。
1415

1516
测试运行的 **输出结果** 大致如下。
1617

0 commit comments

Comments
 (0)