第五章 语法制导翻译和中间代码产生.ppt
《第五章 语法制导翻译和中间代码产生.ppt》由会员分享,可在线阅读,更多相关《第五章 语法制导翻译和中间代码产生.ppt(73页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、编译原理,第六章 属性文法和语法制导翻译,编译原理,编译原理,6.1 属性文法,属性文法(也称属性翻译文法)Knuth在1968年提出在上下文无关文法的基础上,为每个文法符号(终结符或非终结符)配备若干相关的“值”(称为属性)。属性代表与文法符号相关信息,如类型、值、代码序列、符号表内容等属性可以进行计算和传递语义规则:对于文法的每个产生式都配备了一组属性的计算规则,编译原理,属性综合属性:“自下而上”传递信息继承属性:“自上而下”传递信息在一个属性文法中,对应于每个产生式A都有一套与之相关联的语义规则,每条规则的形式为:b:=f(c1,c2,ck)这里,f是一个函数,而且或者1. b是A的一
2、个综合属性并且c1,c2,ck是产生式右边文法符号的属性,或者2. b是产生式右边某个文法符号的一个继承属性并且c1,c2,ck 是A或产生式右边任何文法符号的属性。属性b依赖于属性c1,c2,ck。,编译原理,说明终结符只有综合属性,由词法分析器提供非终结符既可有综合属性也可有继承属性,文法开始符号的所有继承属性作为属性计算前的初始值对出现在产生式右边的继承属性和出现在产生式左边的综合属性都必须提供一个计算规则。属性计算规则中只能使用相应产生式中的文法符号的属性出现在产生式左边的继承属性和出现在产生式右边的综合属性不由所给的产生式的属性计算规则进行计算,它们由其它产生式的属性规则计算或者由属
3、性计算器的参数提供,编译原理,语义规则所描述的工作可以包括属性计算、静态语义检查、符号表操作、代码生成等等。例,考虑非终结符A,B和C,其中,A有一个继承属性a和一个综合属性b,B有综合属性c,C有继承属性d。产生式ABC可能有规则 C.d:=B.c+1 A.b:=A.a+B.c而属性A.a和B.c在其它地方计算,编译原理,产 生 式 LEn EE1+T ETTT1*FTFF (E)Fdigit,语 义 规 则print(E.val) E.val := E1.val+T.val E.val :=T.val T.val :=T1.val* F.val T.val :=F.val F.val :=
4、E.val F.val :=digit.lexval,编译原理,综合属性在语法树中,一个结点的综合属性的值由其子结点的属性值确定。使用自底向上的方法在每一个结点处使用语义规则计算综合属性的值仅仅使用综合属性的属性文法称S属性文法,编译原理,产 生 式 LEn EE1+T ETTT1*FTFF (E)Fdigit,语 义 规 则print(E.val) E.val := E1.val+T.val E.val :=T.val T.val :=T1.val* F.val T.val :=F.val F.val :=E.val F.val :=digit.lexval,编译原理,3*5+4n的带注释的
5、语法树,digit.lexval=3,F.val=3,T.val=3,*,digit.lexval=5,F.val=5,T.val=15,E.val=15,+,digit.lexval=4,F.val=4,T.val=4,E.val=19,n,L,产 生 式 语 义 规 则 LEn print(E.val) EE1+T E.val := E1.val+T.val ET E.val :=T.val TT1*F T.val :=T1.val* F.val TF T.val :=F.val F (E) F.val :=E.val Fdigit F.val :=digit.lexval,编译原理,继承
6、属性在语法树中,一个结点的继承属性由此结点的父结点和/或兄弟结点的某些属性确定用继承属性来表示程序设计语言结构中的上下文依赖关系很方便,编译原理,产 生 式 语 义 规 则 DTLL.in := T.type TintT.type := integer TrealT.type := real LL1, idL1.in :=L.in addtype(id.entry, L.in) Lid addtype(id.entry, L.in),编译原理,句子real id1,id2,id3的带注释的语法树,id1,L,id2,L,id3,L,real,T,D,T.type=real,L.in=real,
7、L.in=real,L.in=real,产 生 式 语 义 规 则 DTL L.in := T.type Tint T.type := integer Treal T.type := real LL1, id L1.in :=L.in addtype(id.entry, L.in) Lid addtype(id.entry, L.in),编译原理,6.2 基于属性文法的的处理方法,由源程序的语法结构所驱动的处理办法就是语法制导翻译法语义规则的计算产生代码在符号表中存放信息给出错误信息执行任何其它动作对输入符号串的翻译也就是根据语义规则进行计算的结果。,输入串,语法树,依赖图,语义规则计算次序,
8、编译原理,6.2 基于属性文法的的处理方法,依赖图树遍历一遍扫描,编译原理,6.2.1 依赖图,在一棵语法树中的结点的继承属性和综合属性之间的相互依赖关系可以由称作依赖图的一个有向图来描述为每一个包含过程调用的语义规则引入一个虚综合属性b,这样把每一个语义规则都写成b:=f(c1,c2,ck)的形式依赖图中为每一个属性设置一个结点,如果属性b依赖于属性c,则从属性c的结点有一条有向边连到属性b的结点。,编译原理,for 语法树中每一结点n do for 结点n的文法符号的每一个属性a do 为a在依赖图中建立一个结点;for语法树中每一个结点n do for 结点n所用产生式对应的每一个语义规
9、则b:=f(c1,c2,ck ) dofor i:=1 to k do 从ci结点到b结点构造一条有向边;,编译原理,EE1E2 E.val:=E1.val+E2.val,E1,+,E2,E,val,val,val,编译原理,句子real id1,id2,id3的带注释的语法树的依赖图,id1,L,id2,L,id3,L,real,T,D,4type,5in,6 - addtype(id.entry, L.in),7in,8 addtype,9in,10 addtype,1entry,2entry,3entry,产 生 式 语 义 规 则 DTL L.in := T.type Tint T.t
10、ype := integer Treal T.type := real LL1, id L1.in :=L.in addtype(id.entry, L.in) Lid addtype(id.entry, L.in),编译原理,如果一属性文法不存在属性之间的循环依赖关系,那么称该文法为良定义的,编译原理,属性的计算次序,一个依赖图的任何拓扑排序都给出一个语法树中结点的语义规则计算的有效顺序属性文法说明的翻译是很精确的基础文法用于建立输入符号串的语法分析树根据语义规则建立依赖图从依赖图的拓扑排序中,我们可以得到计算语义规则的顺序,输入串,语法树,依赖图,语义规则计算次序,编译原理,句子real
11、id1,id2,id3的带注释的语法树的依赖图,a4:=real;a5:=a4addtype (id3.entry,a5);a7:=a5;addtype (id2.entry,a7);a9:=a7addtype (id1.entry,a9);,编译原理,6.2 基于属性文法的的处理方法,依赖图树遍历一遍扫描,编译原理,6.2.2 树遍历的属性计算方法,通过树遍历的方法计算属性的值 假设语法树已建立,且树中已带有开始符号的继承属性和终结符的综合属性 以某种次序遍历语法树,直至计算出所有属性深度优先,从左到右的遍历,编译原理,While 还有未被计算的属性 doVisitNode(S) /*S是开
12、始符号*/procedure VisitNode (N:Node) ;begin if N是一个非终结符 then /*假设它的产生式为NX1Xm*/ for i :=1 to m do if XiVN then /*即Xi是非终结符*/ begin 计算Xi的所有能够计算的继承属性; VisitNode (Xi) end; 计算N的所有能够计算的综合属性end,编译原理,产 生 式语 义 规 则 SXYZ Z.h := S.a X.c := Z.g S.b := X.d -2 Y.e := S.bXx X.d :=2*X.cYy Y.f := Y.e*3Zz Z.g :=Z.h+1,例 考虑
13、属性的文法G。其中,S有继承属性a,综合属性b;X有继承属性c、综合属性d;Y有继承属性e、综合属性f;Z有继承属性h、综合属性g,编译原理,假设S.a的初始值为0,输入串为xyz,S:a=0,X,Y,Z,x,y,z,Z:h=0 g=1,X:c=1 d=2,S:a=0, b=0,Y:e=0 f=0,产 生 式语 义 规 则 SXYZ Z.h := S.a X.c := Z.g S.b := X.d -2 Y.e := S.bXx X.d :=2*X.cYy Y.f := Y.e*3Zz Z.g :=Z.h+1,编译原理,6.2 基于属性文法的的处理方法,依赖图树遍历一遍扫描,编译原理,6.2.
14、3 一遍扫描的处理方法,一遍扫描的处理方法是在语法分析的同时计算属性值 所采用的语法分析方法属性的计算次序L属性文法适合于一遍扫描的自上而下分析S属性文法适合于一遍扫描的自下而上分析,编译原理,所谓语法制导翻译法,直观上说就是为文法中每个产生式配上一组语义规则,并且在语法分析的同时执行这些语义规则 语义规则就被计算的时机在自上而下语法分析中,一个产生式匹配输入串成功时在自下而上分析中,当一个产生式被用于进行归约时,编译原理,6.2.4 抽象语法树,在语法树中去掉那些对翻译不必要的信息,从而获得更有效的源程序中间表示。这种经变换后的语法树称之为抽象语法树(Abstract Syntax Tree
15、),Sif B then S1 else S2,3*5+4,编译原理,建立表达式的抽象语法树,mknode (op,left,right) 建立一个运算符号结点,标号是op,两个域left和right分别指向左子树和右子树。mkleaf (id,entry) 建立一个标识符结点,标号为id,一个域eutry指向标识符在符号表中的入口。mkleaf (num,val) 建立一个数结点,标号为num,一个域val用于存放数的值。,编译原理,建立抽象语法树的语义规则,产 生 式 语 义 规 则 EE1+TE.nptr := mknode( +, E1.nptr, T.nptr ) EE1-TE.np
16、tr := mknode( -, E1.nptr, T.nptr ) ETE.nptr := T.nptr T (E) T.nptr := E.nptr TidT.nptr := mknode( id, id.entry ) Tnum T.nptr := mknode( num, num.val ),编译原理,a4c的抽象语法树,E nptr,T nptr,E nptr,To entry for a,E,T nptr,id,-,T nptr,id,To entry for c,编译原理,一遍扫描的处理方法,一遍扫描的处理方法是在语法分析的同时计算属性值 所采用的语法分析方法属性的计算次序L属性
17、文法适合于一遍扫描的自上而下分析S属性文法适合于一遍扫描的自下而上分析,编译原理,6.3 S-属性文法的自下而上计算,S-属性文法:只含有综合属性综合属性可以在分析输入符号串的同时由自下而上的分析器来计算。分析器可以保存与栈中文法符号有关的综合属性值,每当进行归约时,新的属性值就由栈中正在归约的产生式右边符号的属性值来计算。,编译原理,在分析栈中使用一个附加的域来存放综合属性值 假设语义规则A.a:=f(X.x,Y.y,Z.z)是对应于产生式AXYZ的,编译原理,产生式 代 码 段 LEnprint(valtop) EE1+Tvalntop := valtop-2+valtop ETTT1*F
18、valntop := valtop-2*valtop TFF (E)valntop :=valtop-1Fdigit,产 生 式 语 义 规 则 LEn print(E.val) EE1+T E.val := E1.val+T.val ET E.val :=T.val TT1*F T.val :=T1.val* F.val TF T.val :=F.val F (E) F.val :=E.val Fdigit F.val :=digit.lexval,编译原理,输入 statesym val 用到的产生式 3*5+4n 0 # - *5+4n 05#3 -3 *5+4n 03 #F -3 Fd
19、igit *5+4n 02 #T -3 TF 5+4n 027#T* -3 - +4n 0275 #T*5 -3 - 5,产生式 代 码 段 LEnprint(valtop) EE1+Tvalntop := valtop-2+valtop ETTT1*Fvalntop := valtop-2*valtop TFF (E)valntop :=valtop-1Fdigit,编译原理,输入 statesym val 用到的产生式 +4n 0275 #T*5 -3 - 5 +4n 02710#T*F -3 - 5 Fdigit +4n 02 #T -15 TT*F +4n 01 #E -15 ET 4
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第五 语法 制导 翻译 以及 中间 代码 产生 发生
限制150内