关于函数重定义的处理。
今天由于解决了“没有调用的函数不生成代码”和“函数前向定义”bug,又重新引入了过去已经解决的“函数重定义”bug。关于函数重定义,我下的定义是,只要所定义的1个以上的函数的名称相同,都认为是重定义(暂不考虑以形参区分)。由于在检查函数是否重定义时,会先扫描一个全局函数列表,例如,函数test1重定义,扫描第一个定义时,编译器并不知道存在重定义,于是把函数信息写入全局列表;扫描第二个或以后的定义时,从全局列表发现了已有定义,则判断为重定义。基于上述前提,编译器原来的逻辑是,发现重定义则不生成函数局部符号表(包含函数语法树指针)。于是产生的问题是,后继的操作例如判断当前函数是否入口过程,或判断当前过程是否被调用等等,都涉及到函数局部符号表,会因为得不到正确的符号表而出错。如此一来就有两种选择方案,一,对于重定义函数不生成符号表和语法树,即除了报错不做处理;或正常生成符号表和语法树,同时报错。考虑到重定义函数内也应该检查语义错误等其它错误,于是选用第二种方法,这样一来,在需要时能够生成一个详尽的错误列表,有助于源码的勘误,也为编译器对重定义函数的后继处理留下广阔的空间。不过从节省编译器存储空间考虑,第一种方法也不失可行性。

本文探讨了编译器在处理函数重定义问题时遇到的挑战。当函数名称相同被视为重定义,原有逻辑会导致错误。作者提出两种处理方案:不生成符号表或同时报错并生成符号表。为了全面检查错误,选择了后者,同时也考虑了存储效率。通过示例代码展示了函数重定义的情况。
——关于函数重定义的处理&spm=1001.2101.3001.5002&articleId=1673713&d=1&t=3&u=65105b3a843b4e9aaa3169701990e3b8)

被折叠的 条评论
为什么被折叠?



