uminus: 代表一元负运算符; 注意语义过程中形式参数的书写次序与 四元式的对应关系: Emit(T,V1,op,V2 ) 或 Emit(op,V1,V2,T ) 输出四元式(op,V1,V2,T) 当然也可以使用其它书写次序
实际上,在一个表达式中可能会出现各 种不同类型的变量或常数,而不是像图5.1中 的 i 假定为都是同一类型。 也就是说,编译程序还应执行这样的语 义动作:对表达式中的运算对象应进行类型 检查,如不能接受不同类型的运算对象的混 合运算,则应指出错误;如能接受混合运算, 则应进行类型转换的语义处理。
i或id表示的单词,定义一属性 ,用做语 义变量, LookUp(i. name)表示审查是否出现 在符号表中,如在,则返回一指向该登录项的 指针,否则返回nil或null。 Emit(T,V1,op,V2 )输出四元式(op,V1,V2,T) Newtemp( )或NewT ()表示生成一个临时变量, 每调用一次,生成一个新的临时变量。 E.place表示存放E值的变量名在符号表的登录 项或一整数码(若此变量是一个临时变量)
E→E1 * E2 /*语义动作*/ { E.place:=newtemp; E.type:=real ; If E1.Type= int and E2.type=int then {emit(E.place,E1.place,*i,E2.place); E.type:= int } else if E1.Type=real and E2.Type= real then emit(E.place,E1.place,*r,E2.place) else if E1.type=Int then /* E2.type=real */ { t:=newtemp; emit(t, -, itr, E1.place); emit(E.place,t,*r ,E2.place) } else /*E1.type=real and E2.type=Int*/ { t:=newtemp;emit(t, -, itr, E2.place) emit(E.Place,E1.place,*r,t)} } 图 5.2 类型转换的语义处理