已阅读5页,还剩80页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
LI Wensheng, SCST, BUPT 第5章 语法制导翻译技术 知识点:语法制导定义、翻译方案 S属性、L属性 S-属性定义的翻译 L-属性定义的翻译 1 Wensheng Li BUPT 2008 语法制导翻译技术 n语义分析涉及到语言的语义 n形式语义学的研究开始于20世纪60年代初 n形式语义学可以分为三类 操作语义学:模拟数据加工过程中计算机系统的操作 指称语义学:描述数据加工的结果 公理语义学:用公理化的方法描述程序对数据的加工 n语法制导翻译技术 多数编译程序普遍采用的一种技术 比较接近形式化 2 Wensheng Li BUPT 2008 语法制导翻译技术 5.1 语法制导定义及翻译方案 5.2 S-属性定义的自底向上翻译 5.3 L-属性定义的自顶向下翻译 5.4 L-属性定义的自底向上翻译 5.5 非L属性定义的翻译 小 结 3 Wensheng Li BUPT 2008 5.1 语法制导定义及翻译方案 n对上下文无关文法的推广 n每个文法符号都可以有一个属性集,可以包括两类 属性:综合属性和继承属性。 分析树中一个结点的综合属性是从其子结点的属性值 计算出来的 继承属性是从其兄弟结点和/或父结点的属性值计算 出来的 分析树中某个结点的属性值是由与在这个结点上所用 产生式相应的语义规则决定的。 n和产生式相联系的语义规则建立了属性之间的关系 ,这些关系可用有向图(即:依赖图)来表示。 4 Wensheng Li BUPT 2008 内容安排 一、语法制导定义 二、依赖图 三、计算次序 四、S属性定义和L属性定义 五、翻译方案 5 Wensheng Li BUPT 2008 一、语法制导定义 在一个语法制导定义中,对应于每一个文法产生 式A,都有与之相联系的一组语义规则,其形式 为:b=(c1,c2,ck) 这里,是一个函数,而且或者 (1) b是A的一个综合属性,且c1、c2、ck是 产生式右部文法符号的属性,或者 (2) b是产生式右部某个文法符号的一个继承属性 ,且c1、c2、ck是A或产生式右部文法符号的属性 。 n 属性b依赖于属性c1、c2、ck。 n 语义规则函数都不具有副作用的语法制导定义称 为属性文法 6 Wensheng Li BUPT 2008 语义规则 n一般情况: 语义规则函数可写成表达式的形式。 n某些情况下: 一个语义规则的唯一目的就是产生某个副作用,如打 印一个值、向符号表中插入一条记录等; 这样的语义规则通常写成过程调用或程序段。 看成是相应产生式左部非终结符号的虚拟综合属性。 虚属性和符号=都没有表示出来。 7 Wensheng Li BUPT 2008 简单算术表达式求值的语法制导定义 n综合属性val与每一个非终结符号E、T、F相联系 n表示相应非终结符号所代表的子表达式的整数值 nLn的语义规则是一个过程,打印出由E产生的算术表达式 的值,可以认为是非终结符号L的一个虚拟综合属性。 产生式 LEn EE1+T ET TT1*F TF F(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 8 Wensheng Li BUPT 2008 综合属性 n分析树中,如果一个结点的某一属性由其子结点的 属性确定,则这种属性为该结点的综合属性。 n如果一个语法制导定义仅仅使用综合属性,则称这 种语法制导定义为S-属性定义。 n对于S-属性定义,通常采用自底向上的方法对其分 析树加注释,即从树叶到树根,按照语义规则计算每 个结点的属性值。 n简单台式计算机的语法制导定义是S-属性定义 9 Wensheng Li BUPT 2008 3*5+4n的分析树加注释的过程 n属性值的计算可以在语法分析过程中进行。 L E n E + T T F T * F digit F digit digit.lexval=3 .val=3 .val=3 .lexval=5 .val=5 .val=15 .val=15 .lexval=4 .val=4 .val=4 .val=19 Print (19) 10 Wensheng Li BUPT 2008 继承属性 n分析树中,一个结点的继承属性值由该结点的父结 点和/或它的兄弟结点的属性值决定。 n可用继承属性表示程序设计语言结构中上下文之间 的依赖关系 可以跟踪一个标识符的类型 可以跟踪一个标识符,了解它是出现在赋值号的右边 还是左边,以确定是需要该标识符的值还是地址。 11 Wensheng Li BUPT 2008 一个带有继承属性L.in的语法制导定义 nD产生的声明包含了类型关键字int或real,后跟一个标 识符表。 nT有综合属性type,其值由声明中的关键字确定。 nL的继承属性L.in,表示从父结点或兄弟结点继承下来的 类型信息。 产生式 DTL Tint Treal LL1,id Lid 语义规则 L.in=T.type T.type=integer T.type=real L1.in=L.in addtype(id.entry,L.in) addtype(id.entry,L.in) 12 Wensheng Li BUPT 2008 语句real id1,id2,id3的分析树加注释 L产生式的语义规则使用继承属性L.in把类型信息在分析 树中向下传递; 并通过调用过程addtype,把类型信息填入标识符在符 号表中相应的表项中。 D T L L , id2 L , id3 id1 real .type=real .in=real .in=real .in=real addtype(id3.entry,L.in) addtype(id1.entry,L.in) addtype(id2.entry,L.in) 13 Wensheng Li BUPT 2008 二、依赖图 n分析树中,结点的继承属性和综合属性之间的相互 依赖关系可以由依赖图表示。 n为每个包含过程调用的语义规则引入一个虚拟综合 属性b,以便把语义规则统一为b=(c1,c2,ck)的 形式。 n依赖图中: 为每个属性设置一个结点 如果属性b依赖于c,那么从属性c的结点有一条有向 边连到属性b的结点。 14 Wensheng Li BUPT 2008 算法5.1 构造依赖图 输入:一棵分析树 输出:一张依赖图 方法: for (分析树中每一个结点n) for (结点n处的文法符号的每一个属性a) 为a在依赖图中建立一个结点; for (分析树中每一个结点n) for (结点n处所用产生式对应的每一个 语义规则 b=(c1,c2,ck) for (i=1;i=k;i+) 从ci结点到b结点构造一条有向边; 15 Wensheng Li BUPT 2008 依赖图构造举例 产生式 依赖规则 AXY A.a=(X.x,Y.y) X.i=g(A.a,Y.y) A X Y .a .x.i .y D T L L , id2 L , id3 id1 real 4 type 9 in10 addtype 7 in 8 addtype 5 in6 addtype 1 entry 2 entry 3 entry 16 Wensheng Li BUPT 2008 三、计算次序 n有向非循环图的拓扑排序 图中结点的一种排序m1,m2,mk 有向边只能从这个序列中前边的结点指向后面的结 点 如果mimj是从mi指向mj的一条边,那么在序列 中mi必须出现在mj之前。 n依赖图的任何拓扑排序 给出了分析树中结点的语义规则计算的有效顺序 在拓扑排序中,一个结点上语义规则 b=(c1,c2,ck) 中的属性c1,c2,ck在计算b时都 是可用的。 n拓扑排序: 1、2、3、4、5、6、7、8、9、10 4、5、3、6、7、2、8、9、1、10 17 Wensheng Li BUPT 2008 计算顺序 n从拓扑排序中可以得到下面的程序,an代表依赖图 中与序号n的结点有关的属性: a4=real; a5=a4; addtype(id3.entry,a5); a7=a5; addtype(id2.entry,a7); a9=a7; addtype(id1.entry,a9); 18 Wensheng Li BUPT 2008 语法制导翻译过程 n最基本的文法用于建立输入符号串的分析树; n为分析树构造依赖图; n对依赖图进行拓扑排序; n从这个序列得到语义规则的计算顺序; n照此计算顺序进行求值,得到对输入符号串的翻译 。 输入符号串 分析树 依赖图 语义规则的计算顺序 计算结果 19 Wensheng Li BUPT 2008 四、L属性定义和L属性定义 n L属性定义:一个语法制导定义是L属性定义,如 果 与每个产生式AX1X2Xn相应的每条语义规则计 算的属性都是A的综合属性,或是 Xj(1jn)的继承属性,而该继承属性仅依赖于: 产生式中Xj左边的符号X1、X2、Xj-1的属性; A的继承属性。 n 每一个S属性定义都是L属性定义 20 Wensheng Li BUPT 2008 例:非L属性定义的 语法制导定义 产生式 语义规则 ALM L.i=l(A.i) M.i=m(L.s) A.s=f(M.s) AQR R.i=r(A.i) Q.i=q(R.s) A.s=f(Q.s) 产生式 DTL Tint Treal LL1,id Lid 语义规则 L.in=T.type T.type=integer T.type=real L1.in=L.in addtype(id.entry,L.in) addtype(id.entry,L.in) 例:是L属性定义 的 语法制导定 义 21 Wensheng Li BUPT 2008 属性计算顺序深度优先遍历分析树 void deepfirst(n:node) for (n的每一个子结点m,从左到右) 计算m的继承属性; deepfirst(m); ; 计算n的综合属性; . n以分析树的根结点作为实参 nL属性定义的属性都可以用深度优先的顺序计算。 进入结点前,计算它的继承属性 从结点返回时,计算它的综合属性 22 Wensheng Li BUPT 2008 五、翻译方案 n上下文无关文法的一种便于翻译的书写形式 n属性与文法符号相对应 n语义动作括在花括号中,并插入到产生式右部某个 合适的位置上 n给出了使用语义规则进行属性计算的顺序 n分析过程中翻译的注释 23 Wensheng Li BUPT 2008 例:一个简单的翻译方案 ETR Raddop T print(addop.lexeme) R1 | Tnum print(num.val) 9-5+2的分析树:E T R 9 - T R 5 + T R 2 语义动作作为相应产生式左部符号对应结点的子结点 深度优先遍历树中结点,执行其中的动作,打印出95- 2+ print(9) print(-) print(5) print(+) print(2) 24 Wensheng Li BUPT 2008 翻译方案的设计 n对于S属性定义: 为每一个语义规则建立一个包含赋值的动作 把这个动作放在相应的产生式右边末尾 例:产生式 语义规则 TT1*F T.val=T1.val*F.val 如下安排产生式和语义动作: TT1*FT.val=T1.val*F.val 25 Wensheng Li BUPT 2008 为L属性定义设计翻译方案的原则 n产生式右部文法符号的继承属性必须在这个符号以 前的动作中计算出来 计算该继承属性的动作必须出现在相应文法符号之前 n一个动作不能引用这个动作右边的文法符号的综合 属性 n产生式左边非终结符号的综合属性只有在它所引用 的所有属性都计算出来之后才能计算 这种属性的计算动作放在产生式右端末尾 26 Wensheng Li BUPT 2008 例:考虑如下翻译方案 SA1A2 A1.in=1;A2.in=2 Aa print(A.in) S A1 A2 A1.in=1;A2.in=2 a print(A.in) a print(A.in) a print(A.in) S A1.in=1;A2.in=2 A1 A2 a print(A.in) 27 Wensheng Li BUPT 2008 例:为如下L属性定义设计翻译方案 产生式 语义规则 SB B.ps=10 S.ht=B.ht BB1B2 B1.ps=B.ps B2.ps=B.ps B.ht=max(B1.ht,B2.ht) BB1subB2 B1.ps=B.ps B2.ps=shrink(B.ps) B.ht=disp(B1.ht,B2.ht) Btext B.ht=text.hB.ps 28 Wensheng Li BUPT 2008 把语义规则插入到产生式中适当的位置 SB.ps=10 B S.ht=B.ht S B.ps=10 B S.ht=B.ht B B1.ps=B.ps B1 B2.ps=B.ps B2 B.ht=max(B1.ht,B2.ht) B B1.ps=B.ps B1 sub B2.ps=shrink(B.ps) B2 B.ht=disp(B1.ht,B2.ht) Btext B.ht=text.hB.ps 29 Wensheng Li BUPT 2008 5.2 S-属性定义的自底向上翻译 nS属性定义: 只用综合属性的语法制导定义 一、语法树 二、构造表达式的语法树 三、构造表达式的语法树的语法制导定义 四、表达式的有向非循环图(dag) 五、S属性定义的自底向上实现 30 Wensheng Li BUPT 2008 一、语法树 n把语法规则中对语义无关紧要的具体规定去掉,剩 下来的本质性的东西称为抽象语法。 n如: 赋值语句:x=y、x:=y、或yx 抽象形式: assignment(variable,expression) n语法树: 分析树的抽象(或压缩)形式。 也称为语法结构树或结构树。 内部结点表示运算符号,其子结点表示它的运算分量 。 31 Wensheng Li BUPT 2008 语法树示例 nSif E then S1 else S2 的语法树 if - then - else E S1 S2 + * 4 3 5 n表达式 3*5+4 的语法树 L E n E + T T F T * F digit F digit digit 32 Wensheng Li BUPT 2008 二、构造表达式的语法树 n表达式的语法树的形式 每一个运算符号或运算分量都对应树中的一个结点 运算符号结点的子结点分别是与该运算符的各个运算 分量相应的子树的根。 每一个结点可包含若干个域: 标识域、指针域、属性值域等 n在运算符结点中 一个域标识运算符号 其它各域包含指向与各运算分量相应的结点的指针 称运算符号为该结点的标号 33 Wensheng Li BUPT 2008 构造函数 nmakenode(op,left,right) 建立一个运算符号结点,标号是op; 域left和right是指向其左右运算分量结点的指针。 nmakeleaf(id,entry) 建立一个标识符结点,标号是id; 域entry是指向该标识符在符号表中的相应条目的指 针。 nmakeleaf(num,val) 建立一个数结点,标号为num; 域val用于保存该数的值。 34 Wensheng Li BUPT 2008 建立表达式a-4+c的语法树 p1=makeleaf(id,entrya ); p2=makeleaf(num,4); p3=makenode(- ,p1,p2); p4=makeleaf(id,entryc) ; p5=makenode(+,p3,p4 ); id 符号表中a的入口 P1 num 4 P2 - P3 id 符号表中c的入口 P4 + P5 + - c a 4 35 Wensheng Li BUPT 2008 三、构造表达式语法树的语法制导定义 n目标:为表达式创建语法树 n产生式语义:创建与产生式左部符号代表的子表达 式对应的子树,即创建子树的根结点。 n文法符号的属性:记录所建结点, E.nptr、 T.nptr 指向相应子树根结点的指针 n产生式的语义动作: EE1+T E.nptr=makenode(+,E1.nptr,T.nptr) Tid T.nptr=makeleaf(id,id.entry) Tnum T.nptr=makeleaf(num,num.val) 36 Wensheng Li BUPT 2008 构造表达式语法树的语法制导定义 产生式 EE1+T EE1-T ET T(E) Tid Tnum E.nptr= makenode(+,E1.nptr,T.nptr) E.nptr= makenode(-,E1.nptr,T.nptr) E.nptr= T.nptr T.nptr= E.nptr T.nptr= makeleaf(id,id.entry) T.nptr= makeleaf(num,num.val) 语义规则 37 Wensheng Li BUPT 2008 表达式a-4+c的语法树的构造 num 4 id 符号表中a的入口 a E E E T c 4 . nptr . nptr . nptr . nptr. nptr . nptr - id 符号表中c的入口 + -T +T 38 Wensheng Li BUPT 2008 四、表达式的有向非循环图(dag) ndag与语法树相同的地方: 表达式的每一个子表达式都有一个结点 一个内部结点表示一个运算符号,且它的子结点表 示它的运算分量。 ndag与语法树不同的地方: dag中,对应一个公共子表达式的结点具有多个父 结点 语法树中,公共子表达式被表示为重复的子树 n为表达式创建dag的函数makenode和makeleaf 建立新结点之前先检查是否已经存在一个相同的结 点 若已存在,返回一个指向先前已构造好的结点的指 针; 否则,创建一个新结点,返回指向新结点的指针。 39 Wensheng Li BUPT 2008 为表达式 a+a*(b-c)+(b-c)*d 构造dag 函数调用 p1=makeleaf(id,a); p2=makeleaf(id,a); p3=makeleaf(id,b); p4=makeleaf(id,c); p5=makenode(-,p3,p4) ; p6=makenode(*,p2,p5 ); p7=makenode(+,p1,p6 ); p8=makeleaf(id,b); p9=makeleaf(id,c); p10=makenode(- ,p8,p9); p11=makeleaf(id,d); p12=makenode(*,p10, p11); p13=makenode(+,p7,p 12); a bc - * + d * + p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 40 Wensheng Li BUPT 2008 五、S-属性定义的自底向上实现 n已知 自底向上的分析方法中,分析程序使用一个栈来存 放已经分析过的子树的信息。 分析树中某结点的综合属性由其子结点的属性值计 算得到 自底向上的分析程序在分析输入符号串的同时可以 计算综合属性 n考虑 如何保存文法符号的综合属性值? 保存属性值的数据结构怎样与分析栈相联系? 怎样保证:每当进行归约时,由栈中正在归约的产 生式右部符号的属性值计算其左部符号的综合属性值。 41 Wensheng Li BUPT 2008 扩充分析栈 目的:使之能够保存综合属性 做法:在分析栈中增加一个域,来存放综合属性 值 例:带有综合属性域的分析栈 n栈由一对数组state和val实现 nstate元素是指向LR(1)分析表 中状态的指针(或索引) n如果statei对应的符号为A ,vali中就存放分析树中与结 点A对应的属性值。 n假设综合属性刚好在每次归约前计算 AXYZ对应的语义规则是A.a=(X.x,Y.y,Z.z) Z Z.z Y Y.y X X.x top state val 42 Wensheng Li BUPT 2008 修改分析程序 n对于终结符号 其综合属性值由词法分析程序产生 当分析程序执行移进操作时,其属性值随终结符号 (或状态符号)一起入栈。 n为每个语义规则编写一段代码,以计算属性值 n对每一个产生式AXYZ 把属性值的计算与归约动作联系起来 归约前,执行与产生式相关的代码段 归约:右部符号及其属性出栈 左部符号及其属性入栈 nLR分析程序中应增加计算属性值的 代码段 Z Z.z Y Y.y X X.x top . . . . . . state val A A.a 43 Wensheng Li BUPT 2008 例:用LR分析程序实现表达式求值 产生式 LEn EE1+T ET TT1*F TF F(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 代码段 print(valtop) valntop=valtop-2+valtop valntop=valtop-2*valtop valntop=valtop-1 44 Wensheng Li BUPT 2008 对 3*5+4n 进行分析的动作序列 步骤 输入 分析栈 分析动作 (1) 3*5+4n state: 0 val: - 移进 (2) *5+4n state: 0 5 val: - 3 归约,用Fdigit (3) *5+4n state: 0 3 val: - 3 归约,用TF (4) *5+4n state: 0 2 val: - 3 移进 (5) 5+4n state: 0 2 7 val: - 3 - 移进 (6) +4n state: 0 2 7 5 val: - 3 - 5 归约,用Fdigit (7) +4n state: 0 2 7 10 val: - 3 - 5 归约,用TT*F 45 Wensheng Li BUPT 2008 步骤 输入 分析栈 分析动作 (8) +4n state: 0 2 val: - 15 归约,用ET (9) +4n state: 0 1 val: - 15 移进 (10) 4n state: 0 1 6 val: - 15 - 移进 (11) n state: 0 1 6 5 val: - 15 - 4 归约,用Fdigit (12) n state: 0 1 6 3 val: - 15 - 4 归约,用TF (13) n state: 0 1 6 9 val: - 15 - 4 归约,用EE+T (14) n state: 0 1 val: - 19 接受 46 Wensheng Li BUPT 2008 5.3 L-属性定义的自顶向下翻译 n在自顶向下的分析过程中实现L属性定义的翻译 n预测分析方法对文法的要求 不含左递归 A FIRST()FIRST()= 一、消除翻译方案中的左递归 二、预测翻译程序的设计 47 Wensheng Li BUPT 2008 一、消除翻译方案中的左递归 n例:考虑关于表达式的语法制导定义 产生式 语义规则 EE1+T E.val=E1.val+T.val EE1-T E.val=E1.val-T.val ET E.val=T.val T(E) T.val=E.val Tnum T.val=num.val 翻译方案: (1) EE1+T E.val=E1.val+T.val (2) EE1-T E.val=E1.val-T.val (3) ET E.val=T.val (4) T(E) T.val=E.val (5) Tnum T.val=num.val 由(1)和(3)有: (1) ET E.val=T.val R (3) R+T E.val=E1.val+T.val R1 (3“) R 继承属性R.i:表示在R之前已经推导出的子表达式的值 综合属性R.s:表示在R完全展开之后得到的表达式的值 消除左递归的方法: AA| 替换为:AR RR| 48 Wensheng Li BUPT 2008 R1 .i的语义规则为:R1.i=R.i+T.val R.s的语义规则为:R.s=R1.s 于是得到: (3) R+T R1.i=R.i+T.val R1 R.s=R1.s 同样可得到: (2) R-T R1.i=R.i-T.val R1 R.s=R1.s 为(3“)设置把R.i传递给R.s的语义动作,得到: (3“) R R.s=R.i 对于(1), ET E.val=T.val R 通过R的属性R.s和 R.i完成E和T的综合属性的传递E.val=T.val,得到: (1) ET R.i=T.val R E.val=R.s 对于(3) R+T E.val=E1.val+T.val R1 49 Wensheng Li BUPT 2008 翻译方案 E T R num + T R num - T R num .val=8 .val=8.i=8 .val=5 .val=5 .i=13 .val=7 .val=7.i=6.s=6 .s=6 .s=6 .val=6 ET R.i=T.val R E.val=R.s R+ T R1.i=R.i+T.val R1 R.s=R1.s R- T R1.i=R.i-T.val R1 R.s=R1.s R R.s=R.i T( E ) T.val=E.val Tnum T.val=num.val 表达式8+5-7的翻译过程 50 Wensheng Li BUPT 2008 消除翻译方案中左递归的一般方法 翻译方案: AA1Y A.a=g(A1.a,Y.y) AX A.a=f(X.x) 为R设置继承属性R.i和综合属性R.s R.i:表示在R之前已经扫描过的符号串的属性值 R.s:表示在R完全展开为终结符号之后得到的符号串的属性 值。 消除基本文法中的左递归 : AXR RYR| 翻译方案转换为: AX R.i=f(X.x) R A.a=R.s RY R1.i=g(R.i,Y,y) R1 R.s=R1.s R R.s=R.i A X R . x. i. s . a A X R . x. i. s . a Y R. y. i. s 51 Wensheng Li BUPT 2008 例:考虑建立表达式语法树的语法制导定义 翻译方案 (1) EE1+T E.nptr=makenode(+,E1.nptr,T.nptr) (2) EE1-T E.nptr=makenode(- ,E1.nptr,T.nptr) (3) ET E.nptr=T.nptr (4) T(E) T.nptr=E.nptr (5) Tid T.nptr=makelead(id,id.entry) (6) Tnum T.nptr=makeleaf(num,num.val) 消除左递归: ETR R+TR|-TR| 非终结符号R,具有继承属性R.i和综合属性R.s R.i:保存指向在R之前建立的子树的根结点的指针 R.s:保存指向R完全展开之后建立的子树的根结点的指针 52 Wensheng Li BUPT 2008 构造表达式语法树的翻译方案 ET R.i=T.nptr R E.nptr=R.s R+ T R1.i=makenode(+,R.i,T.nptr) R1 R.s=R1.s R- T R1.i=makenode(-,R.i,T.nptr) R1 R.s=R1.s R R.s=R.i T(E)T.nptr=E.nptr Tid T.nptr=makelead(id,id.entry) Tnum T.nptr=makeleaf(num,num.val) 53 Wensheng Li BUPT 2008 使用继承属性构造 a-4+c 的语法树 num 4 id 符号表中a的入口 . nptr - id 符号表中c的入口 E T R id - T R num + T R id . nptr . nptr . i . i . i + . s . s . s . nptr 54 Wensheng Li BUPT 2008 二、预测翻译程序的设计 n从翻译方案出发构造自顶向下的语法制导翻译程序 算法5.2:构造语法制导的预测翻译程序 输入:基础文法适合于预测分析的语法制导翻译方案 输出:语法制导翻译程序 方法:(修改预测分析程序的构造技术) (1) 为每个非终结符号A建立一个函数(可以是递归函数) A的每一个继承属性对应函数的一个形参 A的综合属性作为函数的返回值 A产生式中的每个文法符号的每个属性都对应一个局 部变量 (2) A的函数的代码由多个分支组成 55 Wensheng Li BUPT 2008 按照从左到右的顺序考虑产生式右部的记号、非终 结符号和语义动作 对带有综合属性x的记号X 把属性x的值保存于为X.x声明的变量中 产生一个匹配记号X的调用 推进扫描指针 对非终结符号B 产生一个函数调用语句c=B(b1,b2,bk) bi(i=1,2,k)是对应于B的继承属性的变量 c是对应于B的综合属性的变量 对每一个语义动作 把动作代码复制到分析程序中 用代表属性的变量代替翻译方案中引用的属性 (3) 与每个产生式相关的程序代码 56 Wensheng Li BUPT 2008 例:为构造表达式语法树的翻译方案 构造翻译程序 n为每个非终结符号构造一个函数 function E:syntax_tree_node; function(in:syntax_tree_node):syntax_tree_no de; function T:syntax_tree_node; n两个R产生式结合起来,用符号addop代表+和- Raddop T R1.i=makenode(addop.lexeme,R.i,T.nptr) R1R.s=R1.s R R.s=R.i 57 Wensheng Li BUPT 2008 与RaddopTR| 相应的分析过程 void proc_R(void) if (lookahead=addop) match(addop); proc_T(); proc_R(); ; 58 Wensheng Li BUPT 2008 实现翻译方案的函数 syntax_tree_node fun_R(syntax_tree_node in) syntax_tree_node tnptr, i1, s1, s; char addoplexeme; if (lookahead=addop) /* 产生式RaddopTR */ addoplexeme=lexval; match(addop); tnptr=fun_T(); i1=makenode(addoplexeme, in, tnptr); s1=R(i1); s=s1; ; else /* 产生式R */ s=in; return s ; ; 59 Wensheng Li BUPT 2008 5.4 L属性定义的自底向上翻译 n在自底向上的分析过程中实现L属性定义的翻译 n可以实现任何基于LL(1)文法的L属性定义 n可以实现许多(不是全部)基于LR(1)文法的L属性 定义 一、从翻译方案中去掉嵌入的动作 二、分析栈中的继承属性 三、模拟继承属性的计算 四、用综合属性代替继承属性 60 Wensheng Li BUPT 2008 一、从翻译方案中去掉嵌入的动作 n自底向上地处理继承属性 n等价变换: 使所有嵌入的动作都出现在产生式的右端末尾 n方法: 在基础文法中引入新的产生式,形如:M M:标记非终结符号,用来代替嵌入在产生式中的动 作 把被M替代的动作放在产生式M的末尾 61 Wensheng Li BUPT 2008 例:去掉如下翻译方案中嵌入的动作: ETR R+T print(+) R |-T print(-) R | Tnum print(num.val) n标记非终结符号M和N,及产生式 M 和 N n用M和N替换出现在R产生式中的动作 n新的翻译方案 ETR R+TMR | -TNR | Tnum print(num.val) M print(+) N print(-) 62 Wensheng Li BUPT 2008 变换前、后的翻译方案是等价的 num print(num.val) - T print(-) R 4 num print(num.val) 5 num print(num.val) + T print(+) R 3 E T R n深度优先的顺序进行遍历 nprint(num1.val) print(num2.val) print(+) print(num3.val) print(-) n动作执行的结果是:34+5- 变换前,表达式3+4-5的分析树: 63 Wensheng Li BUPT 2008 变换后,表达式3+4-5的分析树: n深度优先的顺序进行遍历 nprint(num1.val) print(num2.val) print(+) print(num3.val) print(-) n动作执行的结果是:34+5- Num print(num.val) print(+) - T N R 4 Num print(num.val) print(-) 5 Num print(num.val) + T M R 3 E T R 64 Wensheng Li BUPT 2008 二、分析栈中的继承属性 nLR分析程序对产生式AXY的归约 n考虑分析过程中属性的计算 65 Wensheng Li BUPT 2008 复制规则的重要作用 翻译方案: DT L.in=T.type L Tint T.type=integer Treal T.type=real L L1.in=L.in L1,id addtype(id.entry,L.in) Lid addtype(id.entry,L.in) D T L real L , r L , q p . type. in . in . in. s . entry . s . entry . s . entry 输入符号串:real p,q,r 66 Wensheng Li BUPT 2008 例:应用继承属性,用复制规则传递标识符的类型 输入 栈 分析动作 real p,q,r$ state: val: 移进 p,q,r$ state: real val: real 归约,用Treal p,q,r$ state: T val: real 移进 ,q,r$ state: T p val: real pentry 归约,用Lid ,q,r$ state: T L val: real - 移进 q,r$ state: T L , val: real - , 移进 ,r$ state: T L , q val: real - , qentry 归约,用LL,id ,r$ state: T L val: real - 移进 r$ state: T L , val: real - , 移进 $ state: T L , r val: real - , rentry 归约,用LL,id $ state: T L val: real - 归约,用DTL $ state: D val: - 接受 67 Wensheng Li BUPT 2008 计算属性值的代码段 产生式 代码段 DTL Tint valntop=integer Treal valntop=real LL,id addtype(valtop,valtop-3) Lid addtype(valtop,valtop-1) 68 Wensheng Li BUPT 2008 三、模拟继承属性的计算 n要想从栈中取得继承属性,当且仅当文法允许属性值在栈 中存放的位置可以预测。 例:属性值在栈中的位置不可预测的语法制导定义 产生式 语义规则 (1) SaAC C.i=A.s (2) SbABC C.i=A.s (3) Cc C.s=g(C.i) n引入标记非终结符号,对原语法制导定义进行等价变换 产生式 语义规则 (1) SaAC C.i=A.s (2) SbABMC M.i=A.s; C.i=M.s (3) Cc C.s=g(C.i) (4) M M.s=M.i S b A .s B .i M .s .i C 69 Wensheng Li BUPT 2008 用标记非终结符号模拟 非复制规则的语义规则 例:考虑如下的产生式及语义规则 : SaAC C.i=f(A.s) Cc C.s=g(C.i) a A N c A.s N.s top a A c A.s top n引入标记非终结符号N SaANC N.i=A.s; C.i=N.s N N.s=f(N.i) n所有继承属性均由复制规则实现 n继承属性在栈中的位置可以预测 70 Wensheng Li BUPT 2008 例:用复制规则设置所有的继承属性 产生式 语义规则 SLB B.ps=L.s S.ht=B.ht L L.s=10 BB1MB2 B1.ps=B.ps
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025北京大学城市与环境学院招聘劳动合同制人员1人考试笔试备考题库及答案解析
- 2025云南昆明市卓衡高级中学招聘笔试考试参考题库及答案解析
- 2025年西咸新区渭城卫生院招聘考试笔试备考试题及答案解析
- 2025山东菏泽苏菏高级中学餐厅招聘6人笔试考试备考题库及答案解析
- 2025西安市东城第一中学教师招聘考试笔试备考题库及答案解析
- 2025四川成都市锦江区考核招聘教师60人笔试考试参考题库及答案解析
- 2025浙江温州市平阳县中医院招聘院前急救护士1人笔试考试备考试题及答案解析
- 2026天津市卫生健康委员会所属天津市第四中心医院招聘40人笔试考试备考题库及答案解析
- 2025年瑞安市安阳街道公开招聘社会治理协管员与禁毒社工5人考试笔试参考题库附答案解析
- 2025广东云浮市招聘教育人才19人(华南农业大学专场)笔试考试备考试题及答案解析
- 第三节汉字的结构
- 格式塔治疗:人格中的兴奋与成长
- 2024年中共党史考研题库【考研真题精选+章节题库】
- 个案管理课件
- 2023第十一届贵州人才博览会黔西南州农业林业科学研究院引进高层次人才和急需紧缺人才8人笔试备考题库及答案解析
- 细菌和病毒的遗传分析
- (完整word版)扣字词汇124
- 全口无牙颌解剖标志的识别
- GB/T 1348-1988球墨铸铁件
- 三相异步电机电气原理图
- 农民合作社的运营与管理
评论
0/150
提交评论