项目文档中假设结构体成员与变量不重名,且不同结构体中的成员不能重名,我们支持这两种重名,在出现这种情况时,认为它们不是语义错误。对于项目提供的基本样例,我们对假设的更新不影响分析结果。
test_1:没什么特别的的样例。 test_2:各种错误都有。 test_3:一道洛谷平台上的DP题解,将其中spl不支持的语法改为支持的等价实现。 test_4:没什么特别的的样例。 test_5:没什么特别的的样例。
如果某个结点的属性或动作中的副作用,因为发生语义错误而没能正常完成,这个结点将被标记为错误;依赖这个结点的其他结点将在接下来的遍历求值过程中,发现其依赖被标记为错误,从而跳过属性求值或副作用执行并将自身标记为错误。这样做可以使语义分析只汇报一连串语义错误中根本的那个。
维护一组符号表,进入新的一层局部作用域则压入一张新符号表,退出一层局部作用域则弹出最近的一张符号表。查询符号时,从最近的一张符号表开始查找,直到找到为止。
样例输入输出见test-ex
。