简单说明句的翻译
程序设计语言中最简单的说明句的语法描述为:
D→integer〈namelist〉|real〈namelist〉
〈namelise〉→〈namelist〉,id|id
即使用关键字integer和real定义一串名字的性质。对这种说明句的翻译是指在符号表中登录该名和性质。
用上述文法来制导翻译(自下而上)存在着这样一个问题,我们只能在把所有的名字都归约成namelist后才能把它们的性质登记进符号表。这意味着namelist必须用一个队列(或栈)来保存所有这些名字。但我们可以把上述的文法改写成:
D→D1,id
|integer id
|realid
这样,就能把所说明的性质及时地告诉每个名字id,或者说,每当读进一个标识符时,就可以把它的性质登记在符号表中,不用把它们集中起来最后再成批登记了。
现在来定义这些产生式所对应的语义动作,给非终结符D一个语义变量D.ATT,用以记录说明句所引入的名字的性质(int还是real),使用过程enter(id,A)把名字id和性质A登录在名表中。
(1) D→integerid {enter(id,int);
D.ATT∶=int}
(2) D→realid {enter(id,real);
D.ATT∶=real}
(3) D→D1,id {enter(id,D1.ATT);
D.ATT∶=D1.ATT}
|