欢迎来到天天文库
浏览记录
ID:51999386
大小:334.50 KB
页数:36页
时间:2020-03-27
《语法制导翻译和中间代码生成.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第七讲语法制导翻译和中间代码7.1属性文法7.2语法制导翻译概论7.3中间代码7.4一些语句的翻译属性文法属性文法(attributegrammar)是一个三元组:A=(G,V,F)F:关于属性的属性断言或谓词集.每个断言与一个产生式相联.而此断言只引用该产生式左端或右端的终结符或非终结符相联的属性V:有穷的属性集,每个属性与文法的一个终结符或非终结符相连G:是一个上下文无关文法表达式文法E→T+T
2、TorTT→n
3、true
4、falseE→T1+T2{T1.type=intANDT2.type=T1.
5、typeE.type:=int}E→T1orT2{T1.type=boolANDT2.type=T1.typeE.type:=bool}T→n{T.type:=int}T→true{T.type:=bool}T→false{T.type:=bool}类型检查的属性文法:语义规则LEEE1+TETTT1*FTFF(E)FdigitPrint(E.val)E.val:=E1.val+T.valE.val:=T.valT.val:=T1.valF.valT.val:=F.valF.val:=E.valF.v
6、al:=digit.lexval产生式综合属性val综合属性在分析树中,如果一个结点的某一个属性由其子结点的属性确定,则称这种属性为该结点的综合属性。产生副作用的语义规则,如打印一个值、向符号表中插入信息或更新一个全程变量等。语义规则函数都不具有副作用的语法制导定义称为属性文法。在语法制导定义中,一条语义规则完成一个计算属性值的动作。digit是终结符,只使用综合属性,且其属性值由词法分析器提供,通常不要计算属性值。LE.val=19E.val=15T.val=4T.val=15F.val=4T.val
7、=3F.val=3F.val=5digit.lexval=4digit.lexval=5digit.lexval=3+*3*5+4的带注释的分析树如果一个语法制导定义仅仅使用综合属性,则称这种语法制导定义为S属性定义。通常采用自底向上的方法对其分析树加注释,即从树叶到树根,按照语义规则计算每个节点的属性值。继承属性一个结点的继承属性值是由此结点的父结点和/或兄弟结点的某些属性来决定的。生产式语义规则DTLTintTrealLL1,idLidL.in:=T.typeT.type=integerT
8、.type:=realL1.in:=L.inaddtype(id.entry,L.in)addtype(id.entry,L.in)继承属性L.in语句:realid1,id2,id3的分析树,采用自上而下的分析方法产生式语义规则DTLTintTrealLL1,idLidL.in:=T.typeT.type=integerT.type:=realL1.in:=L.inaddtype(id.entry,L.in)addtype(id.entry,L.in)DL.in=realL.in=realL
9、.in=realT.type=realrealid2id1id3..,,语法制导翻译概论在语法分析过程中,随着分析的步步进展,根据每个产生式所对应的语义子程序(或语义规则描述的语义动作)进行翻译的办法称作语法制导翻译。参见P.157-159对表达式2+3*5进行的分析中间代码的形成中间代码的常见形式:逆波兰记号三元式(树形表示)间接三元式四元式逆波兰记号(后缀式)将运算对象写在前面,把运算符号写在后面表达式逆波兰式a+bab+a+b*cabc*+(a+b)*cab+c*a:=b*c+b*dabc*bd*
10、+:=计算方法:自左向右扫描逆波兰式,遇到运算对象则入栈,遇到算符则将相应数目的运算对象出栈计算后结果入栈。逆波兰记号的扩充用途-ii@GotoLLjumpifEthenS1elseS2ES1S2¥A[n][m]nmAsubs复杂性:压栈的可能是地址(如变量赋值),不是值;栈中不一定产生结果。逆波兰示例把下述产生式定义的算术表达式映射到后缀式表示:EE+TETTTFTFF(E)FaE=ET+E=TT=TFT=FF=EF=a产生式翻译成分确定输入a+aa的输出:(E,E)(E+T,ET
11、+)(T+T,TT+)(F+T,FT+)(a+T,aT+)(a+TF,aTF+)(a+FF,aFF+)(a+aF,aaF+)(a+aa,aaa+)EE+TETTTFTFF(E)FaE=ET+E=TT=TFT=FF=EF=a产生式翻译成分将下列语句翻译成后缀式:ifx>ytheny=y+zelsex=x+z错误的翻译:(ifEthenS1elseS2翻译成:ES1S2¥)xyyz>y+=z+xx=
此文档下载收益归作者所有