January 1, 0001
原来我在迭代化的时候写的this_*
都是没用的……行吧,后序遍历太强大了。
这个call
带返回值的设计说实话,有点难搞。
我的符号表dedent
操作写得还有点问题,改了一下,设计又精妙了一点,同时又hacky了一点……
草啊,我就说怎么符号类型不对,原来是复制粘贴的时候忘记改tag了,我裂开。
然后符号表的查找还有点问题:引入全局符号之后,同义词的第一项不一定是当前符号,于是还要先往后找。不过事实上用不着改太多东西,只要改一下那个蹩脚的仿C++迭代器idiom就可以了。
接着又有问题:last_item
全局会导致indent
和get
没有任何问题,但是dedent
有问题……我就说怎么从哪漏了180B的内存出来。pair
解决。
然后就是写得非常、非常、非常丑的库函数初始化器。
全局变量倒是好解决:因为符号表第0层有且仅有1个scope,这就意味着在语义分析阶段直接顺次向下处理Decl和FuncDef就可以了——因为没找到的要么就是没有,要么就是在下面还没迭代到。
出现了一个reduce/reduce conflict?但是看不太懂,不太清楚怎么解决。
答案是BType->TYPE
和FuncType->TYPE
……然后我去看了下kira-rs
的实现,直接用"int"
了,压根没写成非终结符,行吧。
事实证明我的这个寄存器分配算法是非常、非常、非常蠢的:它竟然是贪心和online的……然后真的是写了一堆我都不知道是什么东西的东西。算了,就这样吧,写都写了。
然后它是以基本块为单位的,也就是说我又得把哈希表key改一下,继续当人肉模板生成器。