实际上,在一个表达式中可能会出现各种不同类型的变量或常数,而不是像图8.9中的id假定为都是同一类型。也就是说,编译程序还应执行这样的语义动作:对表达式中的运算对象应进行类型检查,如不能接受不同类型的运算对象的混合运算,则应指出错误;如能接受混合运算,则应进行类型转换的语义处理。假如,图8.9中的表达式可以有混合运算,id可以是实型量也可以是整型量,并且约定,当两个不同类型的量进行运算时,必须首先将整型量转换为实型量。为进行类型转换的语义处理,增加语义变量,用E.type表示E的类型信息,E.type的值或为int或为real,此外,为区别整型加(乘)和实型加(乘),把+(*)分别写作+i(*i)和+r(*r)。用一目算符itr表示将整型运算对象转换成实型。 |