5.4简单算术表达式和 赋值语句的翻译 ·约定 1.E中仅含简单变量; 2.全部变量同类型 3.翻译时不做语义检查 辅助安义 1.int NewTemp(void)产生临时变量的函数,每次调用 都定义一个新的临时变量。返回值为该变量的编号。 2.X.PLACE文法符号X的属性,其值为整型(◇0表示在符 号表中序号,〈0表示临时变量编号) 3. int GEN(int Op,int Arg1,int Arg2,int Result) 据所给实参产生士个四元式:(Op,Arg1 Arg2,Rs, 宜送入四元式表中,返同值为该西元武的序号。Arg1或 A「g2为零时表示该参数缺省
5.4 简单算术表达式和 赋值语句的翻译 • 约定 1. E中仅含简单变量; 2. 全部变量同类型; 3. 翻译时不做语义检查. • 辅助定义 1. int NewTemp(void) 产生临时变量的函数,每次调用 都定义一个新的临时变量。返回值为该变量的编号。 2. X.PLACE 文法符号X的属性,其值为整型(>0表示在符 号表中序号,<0表示临时变量编号) 3. int GEN(int Op,int Arg1,int Arg2,int Result) 根 据所给实参产生一个四元式:(Op,Arg1,Arg2,Result), 且送入四元式表中,返回值为该四元式的序号。Arg1或 Arg2为零时表示该参数缺省
赋值语的S-属性潮泽女法 1.Statement-AssignSt { 2.AssignSt-Varable:Expr GEN(:=,$4.PLACE,0,$1.PLACE) 3.Expr→Expr+Expr $.PLACE=NewTemp(); GEN(+,$1.PLACE,$3.PLACE,$$.PLACE);} 4.|Expr Expr {.PLACE=NewTemp(); GEN(*,$1.PLACE,$3.PLACE,$.PLACE);} 5.Expr )$$.PLACE=$2.PLACE;} 6.|identifier {$.PLACE=Entry($1);} 7.Varable-identifier {$$.PLACE=Entry($1);}
赋值语句的S-属性翻译文法 1.Statement→AssignSt {} 2.AssignSt→Varable : = Expr {GEN(:=,$4.PLACE, 0 , $1.PLACE);} 3.Expr→Expr + Expr {$$.PLACE=NewTemp(); GEN(+,$1.PLACE,$3.PLACE,$$.PLACE);} 4. | Expr * Expr {$$.PLACE=NewTemp(); GEN(*, $1.PLACE,$3.PLACE,$$.PLACE);} 5. | ( Expr ) {$$.PLACE=$2.PLACE;} 6. | identifier {$$.PLACE=Entry($1);} 7.Varable→ identifier {$$.PLACE=Entry($1);}
语义属性的表示 前面的语义动作中,Entry)的含义见5.3.2节。 终结符identifier具有的属性为该变量的词文(标识符),由词法 分析程序的yytext:给出。 $$,$1,$2.…的含义同5.2节。 由于每个非终结符的属性可能不止一个,在C语言中往往用 一个结构来描述它的全部属性。比如,Expr和Variable 的属性至少有两个,故可定义 struct Attr_Of_Expr_Var{ int PLACE;/用于表示符号表中的序号或临时变量的编号 char Type;/表示该表达式的类型
语义属性的表示 前面的语义动作中,Entry()的含义见5.3.2节。 终结符identifier具有的属性为该变量的词文(标识符),由词法 分析程序的yytext给出。 $$,$1,$2.…的含义同5.2节。 由于每个非终结符的属性可能不止一个,在C语言中往往用 一个结构来描述它的全部属性。比如,Expr和Variable 的属性至少有两个,故可定义 struct Attr_Of_Expr_Var{ int PLACE;//用于表示符号表中的序号或临时变量的编号 char Type;//表示该表达式的类型 }
优先关系和结合规则 ·不难看出,前面所给文法是二义性的,且不能刻画各运算 符的优先关系和结合规则。 ·如果我们能按某种规定(参阅5.10节),赋予各运算符优 先顺序和结合规则,那么就能对它所产生的句子进行有效 的语法分析和翻译。 ·从所给属性支法的语义动作可以看出,Expr代表了一个变 量(产生式6)或一个子表达式(产生式5)的运算(四元式)序 列,该序列的运算结果存放于一个临时变量中,这个变量 的编号将作为Expr的PLACE属性被传递给了Expr
优先关系和结合规则 • 不难看出,前面所给文法是二义性的,且不能刻画各运算 符的优先关系和结合规则。 • 如果我们能按某种规定(参阅5.10 节),赋予各运算符优 先顺序和结合规则,那么就能对它所产生的句子进行有效 的语法分析和翻译。 • 从所给属性文法的语义动作可以看出,Expr代表了一个变 量(产生式6)或一个子表达式(产生式5)的运算(四元式)序 列,该序列的运算结果存放于一个临时变量中,这个变量 的编号将作为Expr的PLACE属性被传递给了Expr
表达式中的类型匹配问题 。 在上面的讨论中,我们未考虑表达式运算中的类型 冲突问题。 。 许多语言允许混合运算,不过在运算前应先进行类 型转换,使运算对象具有相同的类型。 ● 因此,我们还应定义类型转换算符,以便产生对运 算对象进行转换的四元式。例如,若我们仅考虑整 型到实型的转换,则可定义运算符t,相应的四 元式(tr,A,O,T)的作用是把整型变量A转换为等值 的实型量T。 。 另外,为阅读上的直观性,在书写语义子程序时, 我们用+r,*r表示实型运算符,用+i,*表示整型 运算符
表达式中的类型匹配问题 • 在上面的讨论中,我们未考虑表达式运算中的类型 冲突问题。 • 许多语言允许混合运算,不过在运算前应先进行类 型转换,使运算对象具有相同的类型。 • 因此,我们还应定义类型转换算符,以便产生对运 算对象进行转换的四元式。例如,若我们仅考虑整 型到实型的转换,则可定义运算符itr,相应的四 元式(itr,A,0,T)的作用是把整型变量A转换为等值 的实型量T。 • 另外,为阅读上的直观性,在书写语义子程序时, 我们用+ r ,* r表示实型运算符,用+ i ,* i表示整型 运算符