Skip to content

Commit

Permalink
[lab 2] refine docs
Browse files Browse the repository at this point in the history
  • Loading branch information
chiakicage committed Apr 3, 2024
1 parent 11ee706 commit eaa5ef4
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 3 deletions.
21 changes: 19 additions & 2 deletions docs/semantics.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ y += x; // x1

在变量的指向确定后, 你同时也可能发现一些语义错误, 例如使用的变量是未定义的或者在同一个作用域内变量有重复定义, 这时你应该向使用者报错. 同时, 为了后面的类型检查, 你还需要在符号表里记录每个符号的类型.

除了变量之外, 你还需要考虑函数的符号. 你完全可以把函数当作一个变量来处理, 只不过它的类型是类似于 `int -> int` 的形式.
除了变量之外, 你还需要考虑函数的符号. 你完全可以把函数当作一个变量来处理, 只不过它的类型有些特殊. 比如一个 `int gcd(int a, int b)` 函数可以当作一个类型为 `(int, int) -> int` 的变量.

为了简单起见, 我们只通过名字去进行判断符号是否重定义, 不考虑函数重载等特性. 也就是说, 不可以定义两个同名的函数, 即使他们的参数不同. 同时, 我们将函数和变量放在两个不同的符号表进行处理, 这样允许你在同一个作用域内 (全局作用域) 去定义一对同名的函数和变量. 这里我们只允许在全局作用域内定义函数 (和 C 一致, 和 Tiger 不一致), 并且所有符号所有符号在使用前必须被定义 (我们不区分定义和声明).

Expand Down Expand Up @@ -145,6 +145,14 @@ Type type_check(Ident ident, Table table) {
- 对非数组型变量使用 "[...]" (数组访问) 操作符
- 对普通变量使用 "(...)" (函数调用) 操作符, 也可以认为是调用未定义的函数
实际上你应该把构建符号表和进行类型检查放在同一个函数内执行. 在 Lab 2 里你构建的符号表只需要知道变量/函数的类型, 这个符号表在进行完类型检查后就没有用了.
符号表不是一个固定含义的东西, 你在不同阶段可能会用到不同的符号表. 对于 Lab 2, 你构建的符号表中只需要维护 `name -> type` 的关系, 并且这个符号表是随着你的语义检查动态构建的, 里面的内容会随着你进入/离开作用域而加入/删除. 这个符号表仅在进行语义检查的过程中使用, 也就是说, **语义检查的目的不是为了得到符号表, 而是你在语义检查的过程中需要符号表**.
你在后续的 Lab 会重新构建更复杂的符号表, 比如包含每个符号的地址等信息. 同样的, 这些符号表也仅在你进行中间代码生成/汇编生成的过程当中构建并被使用.
由于我们的语言比较简单, Lab 2 的内容仅起到一个检查的作用, 不会生成其他的东西用于后续工作.
> 除此之外你还需要考虑 `putint` 和 `getint` 等运行时函数, 用户不需要定义也可以直接使用.
> 对于我们测试集没有覆盖到的情况, 你可以自行决定是否报错. 你可以在报告中注明这些没有覆盖到的情况.
Expand Down Expand Up @@ -196,12 +204,21 @@ int main () {
实验一和实验二统一提交一次. 你需要提供:
1. 源程序的压缩包.
1. 源程序.
2. 一份 PDF 格式的实验报告, 内容包括:
- 你的程序实现了哪些功能? 简要说明如何实现这些功能.
- 你的程序应该如何被编译? 请详细说明应该如何编译你的程序. 无法顺利编译将导致助教无法对你的程序所实现的功能进行任何测试, 从而丢失相应的分数.
- 实验报告的长度不得超过 6 页. 所以实验报告中需要重点描述的是你的程序中的亮点, 是你认为最个性化/最具独创性的内容, 尤其要避免大段地向报告里贴代码.
- 测试集中并没有覆盖所有的语法/语义规则, 你可以将你遇到的未覆盖的情况写到报告中, 或者你也可以设计一些新的测试一并提交上来.
你应当提供一个 `.zip` 文件, 文件名为 `lab1-lab2-小组序号.zip` (比如 `lab1-lab2-0.zip`), 包含以上两项内容. 文件夹结构应该如下:
```bash
lab1-lab2-0/
├── code/
└── report.pdf
```


> 建议使用 Git 管理你的代码
2 changes: 1 addition & 1 deletion docs/syntax.md
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,7 @@ int main(){
实验一和实验二统一提交一次. 你需要提供:
1. 源程序的压缩包.
1. 源程序.
2. 一份 PDF 格式的实验报告, 内容包括:
- 你的程序实现了哪些功能? 简要说明如何实现这些功能.
Expand Down

0 comments on commit eaa5ef4

Please sign in to comment.