编译原理答案(张晶)7语法制导翻译与中间代码生成
编译原理课后习题答案
(a) 0 ( 0 | 1)* 0
由0和1组成且以0开始和结束的符号串全体. (b) ( ( | 0 ) 1* ) * 由0和1组成的符号串全体.
(c) ( 0 | 1 )* 0 ( 0 | 1) ( 0 | 1) 由0和1组成且以000,001,010或011结束的符号串全体. 长度大于等于3且倒数第3个字符为0的01符号串全体.
R R ‘|’ S | S S ST | T T U* | U U (R) | a | b
a
a
a
28
4.5 dangling-else文法: stmt if expr then stmt | matched-stmt matched-stmt if expr then matched-stmt else stmt | other 试说明此文法是二义性的。 句子 if e1 then if e2 then s1 else if e3 then s2 else s3 if e1 then if e2 then s1 else if e3 then s2 else s3
0|1 B 1 D E 0 ABDE ABDE ABCDE ABDE 1 ABCDE ABCDE
start
A
1
C
NFA 0
start A' 1
0
B'
0
1
start
A'
1
最小化DFA
24
DFA
3.8 给定右线性文法G: S 0S | 1S | 1A | 0B A 1C |1 B 0C | 1 C 0C | 1C | 0 | 1 试求一个等价的左线性文法G’.
20
3.6 给出接受下列在字母表{0,1}上的DFA。 (a)所有以00结束的符号串的集合; (1|0)*00
编译原理第五章 语法制导翻译及中间代码生成
式①中的运算符U_minus表示一元减运算。
翻译程序中使用的辅助函数
⒈int LookUp(char *Name)—以Name查 符号表,若查到则返回相应登记项的序号 (≥1),否则返回0。 ⒉int Enter(char* Name)—以Name为名 字在符号表中登录新的一项,返回值为该项 的序号。 ⒊int Entry(char *Name)—以Name为名 字查、填符号表:
定义 5.3 对每个产生式p:X0→X1X2…Xn , 设属性定义性出现的集合为 AF(p)={Xi.a|Xi.a=f(Xk1.ak1,…,Xkm.ak m) ∈R(p), 0≤kj≤n} 若Xi 是产生式左部的非终结符(即i=0),则称 属 性 Xi.a 是 综 合 属 性 (Synthesized Synthesized Attributes);若Xi 出现在产生式的右部(即 Attributes 1≤i≤n),则称Xi.a是继承属性(Inherited Inherited Attributes)。 Attributes
逆波兰表示
每一运算符都置于其运算对象之后,故称 为后缀表示。 特点: 特点:表达式中各个运算 运算是按运算符出现的 运算符出现的 顺序进行的,无须使用括号来指示运算顺 顺序进行的 序,因而又称为无括号式 无括号式。
逆波兰表示逆波兰表示-例子
中缀表示 后缀表示
A+B AB+ A+B*C ABC*+ (A+B)*(C+D) AB+CD+* x/y^z-d*e xyz^/de*(a=0∧b>3)∨(e∧x<>y) 思考:能否表示if e then s1 else s2这样的语句? a0=b3>∧exy<>∧∨ ∧ ∧∨ 将后缀式的符号存放在POST[n]中,
编译原理张晶版 第七章 语法制导翻译和中间代码生成
(1)s=s0
(2)s=s1 (3)s=ε
课程名称
第七章 语法制导翻译和中间代码生成(22)
输入输出对可由(,)表示,其中是输入句子形式而是输出句子形 式。
(S,S)开始用产生式s0s来扩展得到(0S,S0).
再用一次规则(1),得到(00S,S00)。 再用规则(2),就得到(001S,S100). 然后应用规则(3)并得到(001,100)。
L id
T.type=integer T.type:=real
L1.in:=L.in addtype(id.entry,L.in) addtype(id.entry,L.in)
课程名称
第七章 语法制导翻译和中间代码生成(17)
Real id1,id2,id3
D T.type=real real L.in= real L.in= real , id3
E T T F F
T T1 * F F (E) digit
设表达式为3*5+4,则语义动作打印数值19
. L
E.val=19 E.val=15
+
T.val=3 F.val=3 digit.lexval=3 F.val=5
*
F.val=4
digit.lexval=4 digit.lexval=5
课程名称
第七章 语法制导翻译和中间代码生成(23)
课程名称
第七章 语法制导翻译和中间代码生成(3)
属性文法 表达式文法 E—>T+T| T or T T—>n | b ET1 + T2 { T1.type = int T2.type= T1.type E.type :=int} E T1 or T2 { T1.type = bool T2.type= T1.type E.type :=bool} T n { T.type := int} T b { T.type := bool}
编译原理-语法制导翻译和中间代码生成
例:类型、运算、维数、越界
–语义处理:
执行真正的翻译,生成程序的中间代码目标代码。
–例:变量的存储分配
–例:表达式的求值
–例:语句的翻译(中间代码的生成)
3
8.1 属性文法
• 语义分析的描述 –描述语法规则的同时,编写相应的语义 动作和计算顺序
• 语义的形式化描述 –操作语义学、公理语义学、指称语义学
例8-3 3*5+4 的 语法树与属性计算
T.val=3 F.val=3 digit.lexval=3
E.val=15 T.val=15
*
L Print(19)
E.val=19 +
T.val=4
F.val=4
F.val=5
digit.lexval=4
dgit.lexval=5
19
T.type=real
• 继承属性 – 从其兄弟结点和父结点的属性值计算出来的 – 如:L.in
• 固有属性(单词属性)
17
属性的计算
• 语法制导翻译:作语法分析,构造语法树,然 后在树的每个结点上添加相应的语义规则
• 综合属性 – 自底向上按照语义规则来计算各结点的综合 属性值
• 继承属性 –需要探讨计算次序
18
文法
E→ -E1 E.p:= mknode('-', 0, E1.p)
E→ (E1) E.p:= E1.p E→ id E.p:= mkleaf(id, id.entry) E→ num E.p:=mkleaf(num,num.val)
37
生成后缀式的属性文法
产生式
语义规则
S→id:=E Print( || E.code || “:=”)
编译原理(第2版)课后习题答案详解
第1 章引论第1 题解释下列术语:(1)编译程序(2)源程序(3)目标程序(4)编译程序的前端(5)后端(6)遍答案:(1)编译程序:如果源语言为高级语言,目标语言为某台计算机上的汇编语言或机器语言,则此翻译程序称为编译程序。
(2)源程序:源语言编写的程序称为源程序。
(3)目标程序:目标语言书写的程序称为目标程序。
(4)编译程序的前端:它由这样一些阶段组成:这些阶段的工作主要依赖于源语言而与目标机无关。
通常前端包括词法分析、语法分析、语义分析和中间代码生成这些阶段,某些优化工作也可在前端做,也包括与前端每个阶段相关的出错处理工作和符号表管理等工作。
(5)后端:指那些依赖于目标机而一般不依赖源语言,只与中间代码有关的那些阶段,即目标代码生成,以及相关出错处理和符号表操作。
(6)遍:是对源程序或其等价的中间语言程序从头到尾扫视并完成规定任务的过程。
第2 题一个典型的编译程序通常由哪些部分组成?各部分的主要功能是什么?并画出编译程序的总体结构图。
答案:一个典型的编译程序通常包含8 个组成部分,它们是词法分析程序、语法分析程序、语义分析程序、中间代码生成程序、中间代码优化程序、目标代码生成程序、表格管理程序和错误处理程序。
其各部分的主要功能简述如下。
词法分析程序:输人源程序,拼单词、检查单词和分析单词,输出单词的机内表达形式。
语法分析程序:检查源程序中存在的形式语法错误,输出错误处理信息。
语义分析程序:进行语义检查和分析语义信息,并把分析的结果保存到各类语义信息表中。
中间代码生成程序:按照语义规则,将语法分析程序分析出的语法单位转换成一定形式的中间语言代码,如三元式或四元式。
中间代码优化程序:为了产生高质量的目标代码,对中间代码进行等价变换处理。
目标代码生成程序:将优化后的中间代码程序转换成目标代码程序。
表格管理程序:负责建立、填写和查找等一系列表格工作。
表格的作用是记录源程序的各类信息和编译各阶段的进展情况,编译的每个阶段所需信息多数都从表格中读取,产生的中间结果都记录在相应的表格中。
编译原理课后习题答案
编译原理课后习题答案编译原理习题答案习题11.1翻译程序:把⽤某种程序设计语⾔(源语⾔)编写的程序(源程序)翻译成与之等价的另⼀种语⾔(⽬标语⾔)的程序(⽬标程序)。
编译程序:⼀种翻译程序,将⾼级语⾔编写的源程序翻译成等价的机器语⾔或汇编语⾔的⽬标程序。
1.2词法分析、语法分析、语义分析和中间代码⽣成、代码优化、⽬标代码⽣成1.3词法分析:根据语⾔的词法规则对构成源程序的符号进⾏扫描和分解,识别出⼀个个的单词。
语法分析:根据语⾔的语法规则,把单词符号串分解成各类语法单位。
语义分析及中间代码⽣成:对语法分析识别出的语法单位分析其含义,并进⾏初步翻译。
代码优化:对中间代码进⾏加⼯变换,以产⽣更⾼效的⽬标代码。
⽬标代码⽣成:将中间代码变换成特定机器上的绝对指令代码、可重定位的指令代码或会变指令代码。
以上5个阶段依次执⾏。
习题22.1 (1)有穷⾮空的符号集合(2)利⽤产⽣是规则A->v将A替换为v时与A的上下⽂⽆关。
(3)略(4)推导是把句型中的⾮终结符⽤⼀个产⽣是规则的右部开替代的过程;直接推导是将⾮终结符的替代结果只⽤了⼀次产⽣式规则。
(5)略(6)⼀个句型的最左直接短语(7)如果⼀个⽂法存在某个句⼦对应两棵不同的语法树或有两个不同的最左(右)推导,则称这个⽂法是⼆义的。
2.2(1)VN ={Z,A,B} VT ={a,b,c,d,e}(2)abbcde,abbbcde是,acde不是。
2.3 (1)L[G]={d|n≥1,m≥0}(2)2.4 (1) A=>B=>c=>fAg=>fBg=>fCg=>feg(2)A=>AaB=>AaC=>Aae=>Bae=>BcCae=>Bceae=>Cceae=>eceae(3)A=>B=>BcC=>BcfAg=>BcfAaBg=>BcfAaCg=>BcfAaeg=>BcfBaeg =>BcfCaeg=>Bcfeaeg=>Ccfeaeg=>ecfeaeg(3)中题⽬有错应为C fCg|e2.5L[G]={a?b?c?|aab,n≥2}2.6 (1)Z→AB A→Aa|ε B→Bb|ε(2)Z→aZb|ab(3)Z→aAb A→aAb|b(4)Z→AB A→aAb|ab B→cB|ε(5)Z→aaAb|ab Z→aaBb|bb A→aaAb|ab B→aaBb|bb2.7 ⼀位数:Z→2|4|6|8两位数:Z→AB A→1|2|3|4|5|6|7|8|9 B→0|2|4|6|8三位以上:Z→ACB A→1|2|3|4|5|6|7|8|9 B→0|2|4|6|8 C→CDD→0|1|2|3|4|5|6|7|8|92.8证明:E=>E+T=>E+T*F短语:T*F E+T*F 直接短语:T*F 句柄:T*F2.9 语法树: E 短语:E*T , (E*T) , F↑(E*T) ,F ,E* F↑(E*T)E *F 直接短语:E*T , FT ↑ F 句柄:FF ( E )E * T2.10(1)语法树(2)直接短语:a , ZZ 句柄:Z( L )L , ZZ ( L )Za2.11最左推导:Z=>ZaB=>BaB=>B+AaB=>A+AaB=>(+)Z*aB=>(+)ZaB*aB =>(+)+aB*aB=>(+)+aA*aB=>(+)+a(*aB=>(+)+a(*aA=>(+)+a(*a(直接短语:(,+句柄:(2.12(1) S=>iSeS=>iiSeS=>iiIeS=>iiIeIS=>iS=>iiSeS=>iiIeS=>iiIeI(2) S=>SaS=>cSaS=>cfaS=>cfafS=>cS=>cSaS=>cfaS=>cfaf(3) E=>EOE=>EOEOE=>iOEOE=>i+EOE=>i+iOE=>i+i-E=>i+i-iE=>EOE=>iOE=>i+E=>i+EOE=>i+iOE=>i+i-E=>i+i-i2.13 Z→aABZ|cCACdA→bAB|aZA|cCCB→bAB|CzbC→cZ|c习题33.1(1)确定的有限⾃动机(2)不确定的有限⾃动机(3)正规集是⼀类特殊的单词集合,正规式是正规集的描述⼯具 3.2 (1) (1|2|3|4|5|6|7|8|9|0)*(1|3|5|7|9) (2) 11(0|1)*00 3.3 证明:b *(a|b)+={a,b,ab,ba,aa,bb …} (a|b)+={a,b,ab,ba,aa,bb …} 3.4 (1)(2)DDDD3.5(1) (2)(3)3.6(1) (01|10) *(01|10)(2) (0(1|00)*)|003.7(1) Z →1AB (2)Z →ABA →(0|1)A A →0A|εA →0|1B →(0|1)B|ε B →0B B →ε3.8 r=a(a|b )*bb3.9 Z →1BB →0Z|0 Z →0Z|ε3.10 3.11DDD习题44.1 (1)若⽂法G[Z]满⾜①⽂法不含左递归②③(2)4.2(1) First(S)={a,d} First(B)={a,d,c,ε}First(A)={a,d,e,c} First(D)={a,d,ε}Follow(S)={#,a,b,d,e} Follow(B)={a,d}Follow(A)={b} Follow(D)={e,a,d,b}(2) 不是4.3 (1) 证明: First(Z)={a,b,c} Follow(S)={#,a,b,c,d} First(A)={a,b,c,d} Follow(A)={ #,a,b,c,d }First(B)={a,d,c} Follow(B)={ a,b,c,d } 是LL(1)⽂法。
编译原理chapter7 语义分析及中间代码生成
编译原理
chapter7
语义分三元式 三元式顾名思义就是带有三个域的记录结构。 三元式顾名思义就是带有三个域的记录结构。 一般形式为: (i)( ,arg1,arg2) 一般形式为: )(op, )( , ) 其中,( )为三元式的编号, 其中,(i)为三元式的编号,也代表了该式的运算 ,( 结果, , 的含义与四元式类似, 结果,op,arg1,arg2的含义与四元式类似,区别在 , 的含义与四元式类似 于arg可以是某三元式的序号,表示用该三元式的结果 可以是某三元式的序号, 可以是某三元式的序号 作为运算对象。 作为运算对象。
编译原理
chapter7
语义分析和中间代码生成
对于文法G[E]: E →E+T | T 例:对于文法 T→ digit 产生式 ) E→ E(1)+T E→ T T→ digit 语 法 分 析 栈 T + E … # 语义子程序 ) {E.Val=E(1).Val+T.Val} {E.Val=T.Val} {T.Val=digit} T.Val 语 义 ‘+’ ) E(1).Val 分 析 … 栈 #
编译原理
chapter7
语义分析和中间代码生成
三地址代码可以看成是抽象语法树一种线性表示。 三地址代码可以看成是抽象语法树一种线性表示。 线性表示 例: a=b*-c+b*-c = a + T1=-c T2=b*T1 T3=-c
*
b
* - b
c
c
T4=b*T3 T5=T2+T4 a=T5
编译原理
语义分析和中间代码生成
图表示法—抽象语法树 图表示法 抽象语法树 在语法树中去掉一些对翻译不必要的信息后 在语法树中去掉一些对翻译不必要的信息后,获得 去掉一些对翻译不必要的信息 的更有效的源程序的中间表示, 的更有效的源程序的中间表示,这种经过变换后的语法 树称为抽象语法树。 树称为抽象语法树。 内部结点代表操作符,它的孩子代表对应的操作数。 内部结点代表操作符,它的孩子代表对应的操作数。 例:a+a*(b-c)+(b-c)*d ( ) ( ) + + a a b
语法制导翻译和中间代码生成
继承属性L.in
语 义 规 则
语句: real id1, id2, id3 的分析树,采用自上而下的分析方法
产 生 式
D TL
T int
T real
L L1,id
L id
L.in:=T.type
T.type=integer
F.val=3
F.val=5
digit.lexval=4
digit.lexval=5
digit.lexval=3
+
*
3*5+4的带注释的分析树
如果一个语法制导定义仅仅使用综合属性,则称这种语法制导定义为S属性定义。通常采用自底向上的方法对其分析树加注释,即从树叶到树根,按照语义规则计算每个节点的属性值。
表达式文法 E→T+T| T or T T → n | true | false
E → T1 + T2 { T1.type = int AND T2.type = T1. type E.type :=int } E → T1 or T2 { T1.type = bool AND T2.type= T1.type E.type :=bool } T → n { T.type := int } T → true { T.type := bool } T → false { T.type := bool }
T.type:=real
L1.in:=L.in
addtype(id.entry,L.in)
addtype(id.entry,L.in)
D
L.in= real
L.in= real
L.in= real
T.type=real
语法制导翻译和中间代码生成【共50张PPT】
例 完成类型检查的属性文法
1) E→T1+T2{T1.t=int AND T2.t=int}
2) E→T1 or T2 {T1.t=bool AND T2.t=bool}
3) T→num
{T.t :=int}
4) T→true {T.t :=bool}
5) T→false
{T.t :=bool}
6.1 属性文法(续)
四元式(续)
四元式的优点:
四元式比三元式更便于优化 优化要求改变运算顺序或删除某些运算,引起编号的变化。 三元式通过编号引用中间结果,编号的变化引起麻烦;四元 式通过临时变量引用中间结果,编号变化无影响。
四元式对生成目标代码有利
四元式表示很类似于三地址指令,很容易转换成机器代 码。
四元式(续)
3) E→T
{ E.val :=T.val }
4) T→T1*F { T.val :=T1.val * F.val }
5) T→F
{ T.val :=F.val }
6) F→(E) { F.val :=E.val }
7) F→digit { F.val :=digit.lexval }
E.val、T.val、F.val都是综合属性
每个使用性标识符是否都有声明? 运算符的分量类型是否相容? 赋值语句的左右部的类型是否相容?
➢ 赋值语句的翻译目标:
在赋值语句右部表达式产生的四元式序列后加一 条赋值四元式
简单赋值语句到四元式的翻译
考虑如下文法描述的简单赋值句的翻译: A→i:=E E→E+E|E*E|-E|(E)|i (6.1)
:=
a
+
叶子结点代表运算量, 非叶子结点代表运算符
编译原理-语法制导翻译技术与中间代码生成共120页文档
例如: 中缀表达式 逆波兰式
a*b
ab*
(a+b)*(c+d) ab+cd+*
5.4.1 逆波兰式
语义动作 (语义子程序) 描述了一个产生式所对应的翻译工作。
语义动作不仅指明了该产生式所产 生符号串的意义,而且还根据这种意 义规定了对应的加工动作(如查填各 类表格、改变编译程序的某些变量的 值、打印各种错误信息及生成中间代 码等),从而完成预定的翻译工作。
5.3 语法制导翻译概述
语法制导翻译法 在语法分析过程中,依随分析的过
5.3 语法制导翻译概述
2. 为上述文法构造LR分析表如下图:
状
ACTION
态 + digit * (
)$
0 1
S4
S3 S5 S2
acc
2
S3
S2
3 4
r4
S3
r4
S2 r4
r4
5
S3
S2
6 7
Sr14
8 9
rr32
S5 Sr25
Sr19
r1
r2 r2
r3
r3 r3
GOTO E 1
6
7 8
5.3 语法制导翻译概述
程,根据每个产生式所对应的语义子 程序(语义规则描述的语义处理的加工 动作)进行翻译的方法。
5.3 语法制导翻译概述
例如,设有简单算术表{7达+8式*5的,3文+8法,6*:5,…}
E→E+E | E*E | (E) | digit 为文法每一产生式设计相应的求值的语义 描述(语义动作):
1.E → E(1)+E(2) {E.val =E(1).val +E(2).val} 2.E → E(1)*E(2) {E.val =E(1).val*E(2).val} 3.E → (E(1)) {E.val =E(1).val} 4.E → digit {E.val =Lex.digit}
编译原理第5章语法制导翻译及中间代码生成
03
生成过程
在编译器中,源代码首先被解析成抽象语法树(Abstract Syntax Tree,
ቤተ መጻሕፍቲ ባይዱ
AST),然后通过遍历AST生成三地址代码。在生成过程中,需要考虑
变量的生命周期、作用域和数据类型等因素。
循环优化
定义
循环优化是指在生成中间代码的 过程中,对循环结构进行优化以 提高程序执行效率的过程。
中间代码优化
对中间代码进行优化,以提高生成的 目标代码的效率。
三地址代码
01
定义
三地址代码是一种中间代码形式,它由一系列运算符和操作数组成,用
于表示程序中的控制流程和数据流。
02
特点
三地址代码具有高度规范化、结构清晰的特点,易于理解和生成。它通
常采用三地址表达式的形式,包括变量、常量、运算符和括号等元素。
解析过程
从文法的终结符号出发,逐步构建语法树或 抽象语法树,直到最终生成目标代码。
优点
能够充分利用语义信息,减少冗余操作,提高解析 效率。
缺点
实现较为复杂,需要构建语法树或抽象语法 树,且对于某些复杂的文法结构,可能存在 无法生成目标代码的情况。
递归下降分析法
解析过程
将文法规则分解为一系列子句,每个子句对应一个递归函数。根据输入的源代 码字符串,从根节点开始递归调用这些函数,直到识别出一个完整的语句或表 达式。
常见优化技术
常见的循环优化技术包括循环展开、 循环合并、循环嵌套、循环不变计算 外提等技术。这些技术可以减少循环 次数、提高循环体内部的计算速度, 从而提升程序的执行效率。
实现方式
循环优化通常在生成三地址代码 后进行,通过对三地址代码进行 分析和变换实现。优化过程中需 要考虑程序的控制流和数据流, 以保持程序的正确性。
编译原理:语法制导翻译和中间代码生成
中间代码生成的常用方法
三地址码
使用类似于三元表达式的形式 来表示指令,使得生成的代码 更加简洁和高效。
间接中间代码
通过引入临时变量和临时操作 符的方式,将复杂的表达式转 化为更简单的形式。
基于栈的代码生成
将表达式的计算过程用栈来组 织,以实现表达式的计算和结 果的存储。
中间代码表示的形式和结构
符号表达式
编译原理:语法制导翻译 和中间代码生成
在编译原理中,语法制导翻译和中间代码生成是至关重要的步骤。本次演讲 将深入探讨其基本概念、步骤、目的以及常用方法等内容。
语法制导翻译的基本概念
语法制导翻译是基于文法规则和语义分析,将源程序转化为目标程序的过程。它利用文法规则来进行翻译和转 换,以实现对源程序的解释和执行。
使用符号来表示变量、常量和操 作符等,用于描述程序的特定语 义。
抽象语法树
以树的形式组织代码的结构,表 示程序在语法和语义上的结构。
四元式
使用四元组来表示中间代码的指 令和操作数,以便进行翻译和执 行。
中间代码生成的优化技术
1 常量折叠
对于常量表达式,将其直 接计算为常量的值,以减 少运行时的开销。
语法制导翻译的步骤和原理
1
语法分析
通过词法分析和语法分析,将源程序转化为语法树。
2
ห้องสมุดไป่ตู้语义分析
在语法树的基础上,进行类型检查、语义检测和符号表管理。
3
翻译
根据语法树和语义动作,生成目标代码。
中间代码生成的作用和目的
中间代码生成是将源代码转化为一种介于源代码和目标代码之间的中间形式,用于承载程序的执行。 它提供了优化和跨平台的能力,使编译器的输出能够在不同体系结构上正常运行。
编译原理 之 语法制导翻译和中间代码生成
非终结符 有一个综合属性type,其值有 非终结符T有一个综合属性 有一个综合属性 其值有 关键字决定(int或real). 关键字决定 或 L.in=T.type, L.in是继承属性 它将沿着 是继承属性,它将沿着 是继承属性 语法树传递到下边的结点. 语法树传递到下边的结点 与L相联的语义规则中有一个过程调 相联的语义规则中有一个过程调 用—addtype把标识符的类型信息登录 把标识符的类型信息登录 在符号表中. 在符号表中 一个结点的继承属性值是由此结点的 父结点和/或兄弟结点的某些属性来决 父结点和 或兄弟结点的某些属性来决 定的. 定的
2+3*5的分析和计值过程 语义栈(值栈 值栈) 步骤 动作 状态栈 语义栈 值栈 符号栈 余留输入串
1) 2) 3) r6 4) r4 5) r2 6) 7) 8) r6 9)r4 10) 10) 11) 11) 12) 12)r6 13) 13)r3 14) 14)r1 15) 15)接受 0 - 05 -- 03 -2 02 -2 01 -2 016 -2- 0165 -2-- 0163 -2-3 0169 -2-3 01697 -2-3- 016975 -2-3-- 01697(10) -2-3-5 0169 -(15 15) -2-(15) 01 17) - (17) # 2+3*5# 5 #2 +3 *5# 5 #F +3*5# 5 #T +3*5# 5 #E +3*5# 5 #E+ 3*5# 5 #E+3 *5# #E+3 5 #E+F *5# #E+F 5 #E+T *5# #E+T 5 #E+T* 5# #E+T #E+T*5 #E+T 5 # #E+T*F # #E+T F #E+T # #E #
属性有两种— 属性有两种 继承属性和综合属性 综合属性用于“自下而上”传递 综合属性用于“自下而上” 信息. 信息 继承属性用于“自上而下”传递 继承属性用于“自上而下” 信息. 信息