Skip to content

Commit

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

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

除了变量之外, 你还需要考虑函数的符号. 当然你完全可以把函数当作一个变量来处理, 只不过它的类型是类似于 `int -> int` 的形式. 为了简单起见, 我们只通过名字去进行判断符号是否重定义, 不考虑函数重载等特性. 也就是说, 不可以定义两个同名的函数, 即使他们的参数不同.
除了变量之外, 你还需要考虑函数的符号. 你完全可以把函数当作一个变量来处理, 只不过它的类型是类似于 `int -> int` 的形式.

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

### 符号表实现

Expand Down Expand Up @@ -125,12 +127,12 @@ Type type_check(Ident ident, Table table) {
其中的 `type_check` 函数负责的就是检查某个表达式的类型是否正确, 并返回其类型.
不过我们会涉及到的类型只有
不过我们会涉及到的类型只有 `int`, `void` 和 `int` 数组, 并且所有单元/二元运算符的操作数和输出均为 `int`.
## 你的任务
你的任务就是在实验 1 所构建的语法树基础上完成上述语义分析, 对语法树进行遍历以进行符号表的相关操作以及类型的构造与检查. 对于违反语义的程序进行报错. 你应该支持检测出以下错误:
你的任务就是在实验 1 所构建的语法树基础上完成上述语义分析, 对语法树进行遍历以进行符号表的构建以及类型的检查. 对于违反语义的程序进行报错. 你应该支持检测出以下错误:
1. 符号表相关:
- 调用未定义的函数, 使用未定义的变量
Expand Down
2 changes: 0 additions & 2 deletions tests/lab2/redef_fun_var.sy
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
// Semantic Error: redefinition of f

void f() { return; }
int f;

Expand Down

0 comments on commit 11ee706

Please sign in to comment.