控制流语句的SDT
在此SDT中它的基础文法不是一个LL1文法,因此不能在自顶向下的分析中实现语义翻译。而在此SDT的产生式的右部中又含有内嵌的语义动作,因此要想在自底向上的语法分析中进行语义翻译需要修改这个文法引入一些标记非终结符。
此SDT的基础文法在之前已经分析过是能通过LR分析进行分析的,因此我们可以利用LR分析技术为输入的句子构造语法分析树,然后按照从左到右的深度优先顺序来执行这些动作。
为了直观地说明这个SDT,下面将使用通用的实现方法来实现SDT。
SDT的通用实现方法
任何SDT都可以通过下面的方法实现:首先建立一棵语法分析树,然后按照从左到右的深度优先顺序来执行这些动作。
例子
假设临时生成的标号为L1,当S分析完后即S对应的三地址码生成以后,S的下一条指令的标号也就确定了,这时候我们将下一条指令的标号赋值给S.next。
假设L2等于1。
问:S1后的语义动作是gen('goto'S.begin)那么S1之前的S1.next=S.begin此赋值有什么意义?因为根本看不到S1.next在接下来语义动作的用处?
答:查看对应的S1的产生式可知,在其语义动作中就使用到了S1.next此继承属性,因为它在之前的产生式中被赋值为S.begin,因此可以利用它重新跳转到while循环的开始。如下图
注:newlabel与label是相互配合的,对应label所在之处便是判断newlabel()对应的布尔值后所要执行代码的位置。