编译原理课件语法制导翻译__翻译方案_SDD
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Fig. Syntax-directed definition of a simple desk calculator
L-属性文法 D TL 和自上而下 T int 语法分析 T real
L L1, id D T .type = real real
综合 属性
wk.baidu.com
L id
L.in := T.type T. type := integer T. type := real L1.in := L.in; addtype (id.entry,L.in ) addtype (id.entry,L.in )
3. 一遍扫描的处理方法
• 一遍扫描的处理方法
在语法分析的同时计算属性值 无需构造实际的语法树
• 自上而下分析
L-属性文法 S-属性文法
• 自下而上分析
S-属性文法和自下而上语法分析
• S-属性文法: 仅使用综合属性的属性文法
Production LEn E E1 + T ET T T1 * F TF F (E) F digit Semantic Rules L.val := 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
语法制导翻译
描述一棵语法树中结点的属性之间的 相互依赖关系 词法分析 语法分析 依赖图 输入串 语法树 语义规则计算次序 ( 拓扑排序) 树遍历
一遍扫描:在语法分析的同时完成语义规则的 计算, 无需构造实际的语法树
1. 依赖图的拓扑排序
• 依赖图 • 拓扑排序
2. 树遍历的属性计算方法
练习: 以下SDD是L-属性的吗?
产生式 语义规则
ALM
AQR
L.i := l(A.i) M.i := m(L.s) A.s := f(M.s) R.i := r(A.i) Q.i := q(R.s) A.s := f(Q.s)
• 表达式2 ☆
• 以某种次序遍历语法树,直至计算出所有属性 • 最常用的遍历方法是深度优先,从左到右的遍 历方法.如果需要的话,可使用多次遍历
例 S有继承属性a, 综合属性b X有继承属性c, 综合属性d Y有继承属性e, 综合属性f Z有继承属性h, 综合属性g
初值 S.a=0 , 输入串 xyz 的语法树如下
dependencygraph edges can go from left to right
(2) 产生式 Xj 的左边符号 X1,X2,…,Xj-l 的属性
(3) Xj 自己的属性
• S-属性文法一定是L-属性文法 表达式 ☆
Example 非L-属性文法
产生式 A BC 语义规则 A.s = B.b B.i = f ( C.c , A.s )
(a)初始状态 (b)VisitNode(S)第一次调用后 (c)VisitNode(S)第二次调用后 (d)VisitNode(S)第三次调用后 的最终状态
下面算法可对任何无循环的属性文法进行计算
While 还有未被计算的属性 do VisitNode(S) /*S是开始符号*/ procedure VisitNode(N: Node); begin if N ∈VN then /* 假设它的产生式为N→X1 X2…Xm*/ for i:=1 to m do if Xi∈VN then /* 即Xi 是非终结符 */ begin 计算 Xi 的所有能够计算的继承属性; VisitNode (Xi) end; 计算 N 的所有能够计算的综合属性 end
S:a=0 , b=0 X.c=1 .d=2 x Y .e=0 Z .h=0 .f=0 .g=1 y z
产生式 语义规则 S XYZ S.b:=X.d-2 X.c=Z.g Y.e:=S.b Z.h:=S.a X.d:=2*X.c X x Y.f:=Y.e*3 Y y Z.g:=Z.h+1 Z z
L .in = real
继承属性
L .in = real
,
, id2
id3
L .in = real
id1
L-属性文法
如果对于每个产生式 A→X1X2…Xn
其每个语义规则中的每个属性
或者是综合属性, 或者是Xj(1<=j<= n)的一个继承属性 , 且这个继承属性仅依赖于: (1) A的继承属性