龙的第五条腿被尘封的故事龙在哪里里

3744人阅读
编译原理(11)
这一章重要的是2个概念:
SDD:语法制导定义,由一个上下文无关文法和属性及规则组成
SDT:语法制导翻译,是在其产生式体内嵌入了程序片段的一个上下文无关文法
5.1 语法制导定义
图5.5中计算过程比较复杂,看完5.2节求值顺序就会理解更多
5.1.1比较简单,就是自底向上语法树中加上 .val就行
5.2 SDD的求值顺序
5.2.1 保证下表中从左到右排就行
5.2.2 依赖图比注释语法分析树增加了依赖关系
本题中的注释语法分析树完全类似图5-9
5.2.3 A-&BCD
求值顺序是否影响规则(中文书中翻译有问题)
A.s=B.i+C.s
no(有继承属性)
A.s=B.i+C.s
D.i=A.i+B.s
A.s=B.s+D.s
B.i=A.s+C.s
D.i=B.i+C.i
S-&L1.L2 & & &L1.side = left L2.side=right S.value=L1.value+L2.value
S-&L & & & & & & &L1.side = left S.value=L.value
L-&L1B & & & & L1.side=L.side if(L.side==left) L.value=L1.value*2+B.value else L.value=L1.value+B/2^(length(L1))
L-&B & & & & & & &if(L.side==left) L.value=B.value else L.value=B.value/2
B-&0 & & & & & & &B.value = 0
B-&1 & & & & & & &B.value = 1
S-&LEFT.RIGHT | LEFT
LEFT-&LEFT B | B
RIGHT-&B RIGHT | B
5.3&语法制导翻译的应用
E-&E1+T & & & & & & &if(E1.type==float||T.type==float) E.type=float else E.type=int
E-&T & & & & & & & & & & E.type=T.type
T-&num.num & & &T.type=float
T-&num & & & & & & & T.type = int
E-&E1+T & & & & & if(E1.t==T.t)&E1.b T.b + else if(E1.t==float) E1.b intToFloat(E2.b) + else intToFloat(E1.b) E2.b +
E-&T & & & & & & & & &E.b = T.b
T-&num.num & T.b = num.num
T-&num & & & & & &T.b = num
5.3.2 首先添加语义,继承属性t导出每个非终结符号是怎么组成的(+or*or exp or (+)),综合属性b表示表达式
如果exp=(expr1),则RemoveBra(exp)=exp1
E -& E1+T&&&&& E.t = +; 如果E1或T为(+)类型,则将其两边括号去掉
E -& T&&&&&&&&&&&E.t = T.t
T&-& T1*F&&&&&&&T.t = *
T -&F&&&&&&&&&&& T.t = F.t
F&-& (E)&&&&&&&&if(E.t==* || E.t==exp) { F.b=E.b; F.t = E.t } else { F.b='('+E.b+')',F.t = (+); }
F-&exp&&&&&&&& F.t = exp F.b = exp
E -& E1+T&& E.v=E1.v+T.v E.diff=E1.diff+T.diff
E -& T&&&&&&&&&& E.v=T.v E.diff=T.diff
T -& T1*F&&&& T.v = T1.diff*F.v + T1.v*F.diff
T -&F&&&&&&&&&&&& T.v = F.v& T.diff=F.diff
F -& (E)&&&&&&&&& F.v = E.v&& F.diff=E.diff
F -& EXP&&&&&&& F.v = EXP, F.diff=1
F -& NUM&&&&&&F.v = NUM,F.diff=0
5.4 语法制导的翻译方案
5.4.1 这是LR语法分析的特征
C -& {a}BC | B{b}C
D -& {c}AD | A{d}D
5.4.3 类似图5-23,需要增加一个继承属性,综合属性变为向上传值的属性,生成的SDT应该类&#.4结尾的一组式子
B -& 1 { C.i=1 } C { B.a=C.a }
C -& 0 { C1.i=2*C.i } C1 { C.a=C1.a }
C -& 1 { C1.i=2*C.i+1 } C1 { C.a=C1.a }
最后的B.val就等于B.a
5.4.4 考虑S-&if(C) S1 else S2
L1 = new() & & // S1开始代码处
L2 = new()&& & // S2开始代码处
S1.next = S.next
S2.next = S.next
C.true = L1
C.false = L2
S.code = C.code label L1 S1.code label L2 S2.code
S-&if( & & & &{ L1=new(); L2=new(); C.true=L1; C.false=L2 }
C) & & & & & & { S1.next = S. S2.next=S.next }
S2 & & & & & &{&S.code = C.code label L1 S1.code label L2 S2.code }
5.4.6 5.4.7
B.le=B1.le+B2.le
B-&B1 sub B2
B.le=B1.le+B2.le
B-&B1 sup B2
B.le=B1.le+B2.le
B1.ps=B.ps
B2.ps=0.7*B.ps
B.ht=max(B1.ht, B2.ht+0.25*B.ps)
B.dp=max(B1.dp, B2.dp-0.25*B.ps
B.le=B1.le
B.le=getLe(B.ps,text.lexval)
5.5 实现L属性的SDD
考虑 S -& if ( C ) S1 else S2 语句的实现,类似while,
S包含继承属性.next和综合属性.code,C包含继承属性.true和.false,综合属性.code
string S(label next)
string Ccode, S1code, S2
label L1, L2;
if(current input==token while)
check '(' is next on the input,
L1 = new(); L2 = new();
Ccode = C(L1, L2);
check ')' is next on the input,
S1code = S(next);
S2code = S(next);
return (Ccode L1 S1code L2 S2code);
// other statement types
void S(label next)
label L1, L2;
if(current input==token while)
check '(' is next on the input,
L1 = new();
L2 = new();
Ccode = C(L1, L2);
check ')' is next on the input,
printf(&label&, L1);
printf(&label&, L2);
// other statement types
5.5.3 首先不考虑综合属性,仿照例5.23
stack[top-1].false = L2
stack[top-1].true = L1
stack[top-3].al1 = L1
stack[top-5].al2 = L2
S1前面Action printf(&label&, al1) & & &S2前面Action&printf(&label&, al2)
例5.24中对于每个包含代码的非终结符号下面增加了一个记录综合属性的位置,其它与例5.23基本相同
5.5.4&S -& if ( X C ) Y S1 else Z S2
X-& ε; Y-& ε; Z-& ε;
L1 = new()
L2 = new()
C.true = L1
C.false = L2
tempCode = C.code label stack[top-4].L1 stack[top-3].code&label stack[top-4].L2 stack[top].code
stack[top].code = tempCode
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:144233次
积分:2607
积分:2607
排名:第11502名
原创:114篇
转载:16篇
评论:16条
(2)(1)(2)(1)(4)(6)(8)(12)(1)(1)(1)(1)(2)(1)(2)(1)(4)(2)(1)(1)(4)(10)(4)(1)(11)(3)(13)(16)(6)(2)(3)(3)(1)笑死我了,有人和我讨论五爪金龙的时候居然跟我说龙有五条腿!_凡人修仙传吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0可签7级以上的吧50个
本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:1,801,618贴子:
笑死我了,有人和我讨论五爪金龙的时候居然跟我说龙有五条腿!
五爪。五腿?傻傻分不清楚。无论是皇帝的还是宫殿的雕刻,龙都是四条腿,每条腿上有几个爪指(相当于人的手指),被叫做几爪龙。三爪为蛟,四爪为龙,五爪最为尊贵,皇室御用。
元宵节到了,我们来一起...
谈谈冯叔叔的恋爱史。
骑了还是吃了?
别怀疑,这就是迪丽热巴。
你家本命上榜没?
可以说连基本的立意都没...
手把手教你成为美食摄影...
安利《大唐荣耀》
风云稻米——特邀微博贴吧...
吧友:装X界四大金刚横...
“小鲜肉这个话题”我一直...
《龙珠》的那个悟空
百度小说人气榜
贴吧热议榜
使用签名档&&
保存至快速回贴}

我要回帖

更多关于 被尘封的故事龙在哪里 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信