在设计L语言变量说明语句的翻译模式时,采用了自下而上的一遍处理方式,如表6-9所示。
表6-9 L语言变量说明语句的翻译模式
其中,属性type表示非终结符D的类型;entry(i)表示变量i在符号表中的入口;函数fill(entry(i),T)则用来把变量i的类型T填入到符号表中,若符号表中该变量不存在,则返回0。对于上述翻译模式中后四个产生式而言,其语义动作相似,在对其进行归约时,表明所有变量名已全部进入分析栈,且首先把最后一个变量名的类型填入符号表中。由于归约后句柄“i:real(或其他)”将出栈,因此必须把类型type的值赋予产生式“D→i,D1”左边的语义变量D.type,以便后续归约时使用。
例如,对于说明语句“var id1,id2,id3:integer;”来说,其自下而上语法制导的翻译过程是:首先,根据自下而上的语法分析方法,将符号串从左到右移入栈中,如图6-13(a)所示;使用产生式D→i:integer对栈顶符号串id3:integer进行归约,结果如图6-13(b)所示,同时调用该产生式的语义动作将id3的类型integer填入符号表,并置栈顶符号D的语义变量D.type为integer;进一步利用产生式D→i,D1将栈顶符号串id2,D规约为D,如图6-13(c)所示,并且根据D1.type可知id2的类型为integer,同时置栈顶符号D的语义变量D.type为D1.type的值,即integer;类似地,可将栈顶符号串id1,D规约到D,得到id1的类型为integer,如图6-13(d)所示;最后,利用产生式S→var D进行归约,不执行任何语义动作,此时关于变量说明语句的处理工作完毕,如图6-13(e)所示。
(www.xing528.com)
图6-13 语句“var id1,id2,id3:integer;”的归约过程
在分析了变量说明语句的翻译模式之后,下面给出具体的实现算法。由于语义处理工作是在语法分析的同时展开的,因此,只需在语法分析程序的基础上加入语义分析代码(标有下划线的部分)即可实现语义处理功能,从而完成语义的检查操作和符号表的查填操作。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。