这里首先讨论简单赋值语句的翻译,先不考虑对数组元素的寻址和引用。表6-10给出了将简单算术表达式及赋值语句翻译为四元式代码的翻译模式。之前,在学习三地址代码这种中间语言时,直接使用变量名来表示指向符号表中该名字的入口指针,现在则使用属性id.name表示id的名字,使用过程lookup(id.name)来检查符号表中是否存在该名字,若存在,则返回一个指向该表项的指针,否则,返回nil,表示没有找到。并且,使用过程emit将生成的四元式语句发送到输出文件中,不再使用表6-6中的code属性。
表6-10 简单赋值语句的翻译模式
假设表6-10中的赋值语句出现在表6-8的上下文环境中,即表6-10中的开始符号S就是表6-8中的非终结符S,此时可将这两个文法结合起来进行分析。通过6.4节的学习我们已经知道,对于程序中的每一个过程都将建立一张独立的符号表,每个符号表的表头均有一个指针指向其直接外围过程的符号表,且当前正在被处理的过程的符号表指针必定位于tblptr的栈顶。
由S所产生的赋值语句中的名字要么在S所在的过程中被定义,要么在其外层过程中被定义。过程lookup(id.name)工作时,首先通过tblptr栈顶指针在当前符号表中查找name,若未找到,则利用当前符号表表头的指针找到该符号表的外围符号表,然后在那里查找名字name,直到找到name为止。如果所有外围过程的符号表中均无name,则lookup返回nil,表明查找失败。
例如,根据表6-10中的翻译模式可将赋值语句x:=-a*b+c翻译成如下的四元式代码序列(假定语句序号从100开始):(www.xing528.com)
100(uminus,a,_,T1)
101(*,T1,b,T2)
102(+,T2,c,T3)
103(:=,T3,_,x)
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。