如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
第五章语法制导翻译程序设计语言中更重要的一个方面,是附着在语言结构上的语义语义分析的任务:①检查语言结构的语义是否正确语法制导翻译的基本思想:当digit为常数时,digitlexval为digit在常数表中的入口EE1+T换句话说是:为每一个产生式配上语义规则并且在适当的时候执行这些规则。语法制导翻译是目前最常用的语义分析技术例1台式计算器程序的语法制导定义3digitlexval:=35.1语法制导定义(Syntax-directeddefinitions)◆属性5.1.1属性在两种情况下,都说属性b依赖于属性c1,c2,…,ck。5.1.2综合属性例1台式计算器程序的S-属性定义3digitlexval:=3在分析树中为每个文法符号上加上它们的属性,则称为带注释的分析树,简称注释分析树5.1.3继承属性继承属性值是由此结点的父结点和/或兄弟结点的某些属性值来决定的。表2带有继承属性L.in的语法制导定义练习:设AS为文法的综合属性集,AI为继承属性集,则下列语法制导定义中P→yQRQ.b=R.fR.c=Q.aR.e=2解:由1知:Q.b,R.e∈AI5.2语义规则5.2.1语法制导定义产生式语法制导定义L→Eprint(E.val)E→E1+E2E.val=E1.val||E2.val||‘+’E→digitE.val=Digit.lexval翻译模式也叫翻译方案这是一种语法分析和语义动作交错的表示法,例2:一个简单的翻译模式(中缀变后缀)E→TRR→addopT{print(addop.lexeme)}R1|εT→num{print(num.val)}3+5的语义翻译过程翻译方案不仅要考虑“做什么”,还要考虑“怎么做”带有继承属性L.in的翻译方案D例:文法G的产生式如下:S→(L)S→aL→L,SL→S1.试写出一个语法制导定义,输出配对括号个数2.写一个翻译方案,打印每个a的嵌套深度解:1.为S,L引入属性h产生式语法制导定义S→(L)S.h=L.h+1S→aS.h=0L→L1,SL.h=L1.h+S.hL→SL.h=s.hS’→Sprint(S.h)(2.为S,L引入属性d,翻译方案如下S’→{S.d=0}SS→({L.d=S.d+1}L)S→a{print(s.d)}L→{L1.d=L.d}L1,{S.d=L.d}SL→{S.d=L.d}SS’5.3S-属性定义及其自底向上的计算Ab:=f(c1,c2,…,ck)state例5.10用LR分析器实现台式计算器产生式代码段(和表5.1对比)LEnprintf(val[ntop])EE+Tval[ntop]:=val[top-2]+val[top]ETTT*Fval[ntop]:=val[top-2]*val[top]TFF(E)val[ntop]:=val[top-1]Fdigit表5.5翻译输入3*5+4n所做的移动+4nT15TT*F在这种分析模式中,5.4L-属性定义◆深度优先顺序计算属性PROCEDUREdfvisit(n:node);BEGINFORn的每个子结点m,从左至右DOBEGIN计算m的继承属性;dfvisit(m)END;计算n的综合属性END;一个语法制导定义是L-属性定义,例.一个简单的翻译模式E→TRR→addopT{print(addop.lexeme)}R1|εT→num{print(num.val)}E设计翻译模式(根据语法制导定义)产生式左边非终结符号的综合属性只有在它所引用的所有属性都计算出来以后才能计算。下面的翻译模式不满足要求:SA1A2{A1in:=1;A2in:=2}Aa{print(Ain)}5.5自顶向下的翻译--用翻译模式构造自顶向下翻译。EE1+T{Eval:=E1val+Tval}EE1-T{Eval:=E1val-Tval}ET{E.val:=Tval}T(E){Tval:=Eval}Tnum{Tval:=numval}图5.13带左递归的文法的翻译模式E→T{Ri:=Tval}R{Eval:=Rs}R→+T{R1i:=R.i+T.val}R1{R.s:=R1s}R→-T{R1i:=Ri-Tval}R1{Rs:=R1s}R→ε{Rs:=Ri}T→(E){Tval:=E.val}T→num{Tval:=numval}经过转换的带有右递归文法的翻译模式E关于左递归翻译模式更一般化的讨论再考虑语义动作,翻译模式