06第6章 语法制导翻译技术PPT课件
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
② E→T
③ T→T*F ⑦ F→b
③ T→T*F@*
④ T→F
⑧ F→c
④ T→F
⑤ F→(E) ⑥ F→a@a ⑦ F→b@b ⑧ F→c@c
➢把中缀表达式文法叫做输入文法;
➢在输入文法上添加动作后形成的文法叫做翻译文法
➢使用中缀表达式文法推导得到终结符号串叫做输入序列;
➢使用翻译文法推导得到的符号串称为活动序列。
E→TE’ E’ →+T@+E’|ε T→FT’
-用T1表示T’
T’ →*F @* T’|ε
T1 ()
F→(E)|a@a| b@b| c@c
{if(ch==‘*’)
{ ch = getnextsymbol();
F ();OUT(“*”); T1 ();
}
else if(ch∈FOLLOW(E’))return;
2020/7/29
#
19
6.5 属性翻译文法
▪ 属性:指与文法符号的类型和值等有关的一些语义信 息,在编译中用属性描述被处理对象的语义特征。
▪ 属性代表与文法符号相关的语义信息。
▪ 属性的设置和语法结构的语义以及翻译程序的需要有
关。例如:
注:教材中用箭头↑和 ↓代替.
➢ 文法符号X的类型属性:X.type
第6章 语法制导翻译技术
2020/7/29
1
标题添加
点击此处输入相 关文本内容
标题添加
点击此处输入相 关文本内容
总体概述
点击此处输入 相关文本内容
点击此处输入 相关文本内容
2
内容提要
➢ 引言 ➢ 翻译文法 ➢ 语法制导翻译 ➢ 自顶向下语法制导翻译 ➢ 属性翻译文法 ➢ 属性文法的自顶向下翻译 ➢ 自底向上语法制导翻译
=>(a+T)*F=>(a+F)*F=>(a+b)*F=>(a+b)*c 用翻译文法推导活动序列(a@a+b@b@+)*c@c@*: E =>T=>T*F@*=>F*F@*=>(E)*F@*=>(E+T@+)*F@*=>(T+T@+)*F@*
=>(F+T@+)*F@*=>(a@a+T@+)*F@*=>(a@a+F@+)*F@*
例:根据算术表达式翻译文法,对于输入序列a+b*c
推导出活动序列:a@a+b@b*c@c@*@+ ① E→E+T@+ ⑤ F→(E)
其中: a+b*c
为输入序列
@a@b@c@*@+ 为动作序列
② E→T
⑥ F→a@a
③ T→T*F@* ⑦ F→b@b
④ T→F
⑧ F→c@c
执行动作序列中的动作产生输出序列abc*+;
即输入序列a+b*c的翻译结果。
➢将二元组(输入序列,动作序列)称为一个对偶
➢对偶集合称为由给定翻译文法所定义的翻译
2020/7/29
9
➢由于翻译文法是在输入文法的产生式右部的适当位置插入动 作符号形成的,因此,翻译文法产生的动作序列受输入语言的 文法控制(语法制导)。 ➢语法制导翻译:根据输入语言的文法,分析各条产生式的语 义(要求计算机所完成的操作),分别编出完成这些操作的子程 序或程序段(称为语义子程序或语义动作),并把这些子程序或 程序段的名字作为动作符号插入到输入文法各产生式右部的适 当位置上,从而实现翻译文法。
2020/7/29
3
6.1 引言
编译程序的逻辑工作过程
中
目
源 程 序
词 法 分 析
语语 间
法义 代
分 析
分 析
码 生 成
代标 码代 优码 化生
成
目 标 代 码
➢ 词法分析和语法分析仅仅对源程序做形式变换和检查。
➢ 语义分析检查程序语义是否正确
➢ 中间代码生成将语义分析后的结果翻译成代码
☻上述工作过程采用串行处理方式 ☻实际应用中语法分析、语义分析、中间代码生成采用并
}
else
error();
}
2020/7/29
13
➢ 对于产生式 E’ →+T@+E’|ε
▪ -用E1表示E’
E→TE’
▪ FIRST(+T@+E’)={+} ▪ FOLLOW(E’)={#,)}
E’ →+T@+E’|ε T→FT’ T’ →*F @* T’|ε
E1() { if(ch==‘+’)
F→(E)|a@a| b@b| c@c
{ ch = getnextsymbol();
T();
OUT(“+”);
E1();
}
else if(ch∈FOLLOW(E’))return;
else error();
}
2020/7/29
14
➢ 对于产生式 T→FT’ -用T1表示T’
- T() -{
if(ch∈FIRST(FT’)) { F(); T1(); }
12
-对改写后文法的每个非终结符号编写一个函数。
➢ 对于产生式 E→TE’ FIRST(TE’)={(,a,b,c}
-用E1表示E’
E()
{
E→TE’
if(ch∈FIRST(TE’))
E’ →+T@+E’|ε
{
T→FT’
T();
T’ →*F @* T’|ε
E1();
F→(E)|a@a| b@b| c@c
=>(a@a+b@b@+)*F@*=>(a@a+b@b@+)*c@c@* 将活动序列(a@a+b@b@+)*c@c@*中的动作符号去掉得到输入序 列:(a+b)*c 所有动作符号组成的符号串即动作序列为:@a@b@+@c@* 去掉动作符号标记得到:ab+c*
2020/7/29
① E→E+T ② E→T ③ T→T*F ④ T→F
*
则翻译器的输入输出动作为: a@a+b@b*c@c@*@+
bc
@为动作符号标记,由符号@开始的符号串称为一个动作符号。 输出结果由紧跟在符号@之后的各符号组成,即abc*+。
2020/7/29
6
例:构造中缀表达式文法的翻译文法。
① E→E+T ⑤ F→(E)
① E→E+T@+
② E→T
⑥ F→a
消除左递归得到: E→TE’
E’ →+T@+E’|ε
T→FT’
T’ →*F @* T’|ε
F→(E)|a@a| b@b| c@c
求FIRST集和 FOLLOW集 不考虑动作 符号
FIRST(TE’)={(,a,b,c} FIRST(+T@+E’)={+} FOLLOW(E’)={#,)} FIRST(FT’ )={(,a,b,c} FIRST(*F @* T’)={*} FOLLOW(T’)={#,+,)} FIRST((E))={(} FIRST(a@a)={a} FIRST(b@b)={b} FIRST(c@c)={c}
① E→E+T ② E→T ③ T→T*F ④ T→F
⑤ F→(E) ⑥ F→a ⑦ F→b ⑧ F→c
① E→E+T@+ F→(E) ⑥ F→a@a ⑦ F→b@b ⑧ F→c@c
2020/7/29
10
语法制导翻译的基本思想 通俗地讲,以语法分析为基础,伴随语法分析的各个步骤,执 行相应的语义动作。 具体方法:
行处理方式
2020/7/29
4
并行处理方式:
对文法中的每个产生式都附加一些动作(语义分 析、操作符号表、代码生成等),在语法分析过程 中,每当需要使用一个产生式进行推导或归约, 语法分析程序除执行相应的语法分析动作外,还 要执行相应的其它动作,完成语义分析和代码生 成等工作。(边分析边翻译)
并行处理方式涉及几个概念
翻译文法的动作符号同样入栈,当其处
于栈顶时,无条件出栈并执行其规定的
操作,不移动读符号指针。
18
a……
A . . #
@v
a @v出栈并执行,
@w
a出栈,@w出栈 并执行
B .
B
.
.
#
.
#
符
输入符号
号
a
b
A A→@va@wB@xc@yD@z A→b
B B→a@mA
D
D→@sb
c
B→c@r D→cD@n
2020/7/29
输入文法的LL(1)分析表
符
号
a
A A→aBcD
B B→aA
D
输入符号
b
c
A→b
B→c D→b D→cD
#
构造翻译 文法分析
表不考虑
动作符号
符
输入符号
号
a
b
c
#
A A→@va@wB@xc@yD@z A→b
B B→a@mA
B→c@r
D
D→@sb D→cD@n
翻译文法的LL(1)分析表
▪ 综合属性用于“自下而上”传递信息。
▪ 综合属性:在语法树中,一个结点的综合属性值由其 子结点的属性值确定。
▪ 通常结合自下而上的语法分析在每一个结点处使用语 义规则计算综合属性的值 --- 由下层子结点的属性 值计算上层父结点的综合属性值,随着自下而上语法 分析的进行,最终可计算出开始符号的综合属性值。
2020/7/29
11
6.4 自顶向下语法制导翻译
自顶向下的语法制导翻译有递归下降翻译和LL(1)翻译。 递归下降翻译(在适当位置插入实现动作符号的子程序):
例:算术表达式翻译 文法如下:(@为输 出其后的符号串) ① E→E+T@+ ② E→T ③ T→T*F@* ④ T→F ⑤ F→(E) ⑥ F→a@a ⑦ F→b@b ⑧ F→c@c
➢ 文法符号X的值属性:X.val
➢ 文法符号X的代码序列:X.code
➢ 文法符号X的内存:X.place
➢ 文法符号X的符号表入口指针: X.entry等。
2020/7/29
20
属性、语义规则
▪ 属性和变量一样,可以在语法分析过程中进行计算和 传递。
▪ 语义规则:属性的计算规则,属性的加工和计算过程 。由语义处理过程、语义动作、语义子程序来实现。
1.将文法符号所代表的语言结构的意思,用隶属于该文法符 号的属性表示;
2.用语义规则(语义规则的执行就是语义动作)规定产生式所 代表的语言结构之间的关系(即属性之间的关系),即用语义 规则实现属性计算。
3.语义动作(语义规则的执行): 在语法分析的适当时刻(如推导或归约)执行附着在对应产 生式上的语义规则,以实现对语言结构语义的处理,如计算、 查填符号表、生成中间代码、发布出错信息等。
else error();
} 2020/7/29
E→TE’ E’ →+T@+E’|ε T→FT’ T’ →*F @* T’|ε F→(E)|a@a| b@b| c@c
15
➢ 对于产生式T’ →*F @* T’|ε ▪ FIRST(*F @* T’)={*} ▪ FOLLOW(T’)={#,+,)}
▪ 属性分为两类:综合属性和继承属性。 注:教材中属性前用↑表示综合属性, ↓表示继承属性
➢ 终结符只有综合属性, 由词法分析器提供 例:i.lexval表示单词符号“数”的词法值
id.entry表示单词符号“标识符”的符号表入口 ➢ 非终结符既可以有综合属性也可以有继承属性
2020/7/29
21
两种属性:综合属性
➢从活动序列中去掉所有动作符号得到输入序列,而所有动 作符号组成的符号串称为动作序列。
➢从动作序列中去掉动作符号标记得到输出序列(翻译结果)
2020/7/29
7
例:对于符号串(a+b)*c 用输入文法推导输入序列(a+b)*c: E =>T=>T*F=>F*F=>(E)*F=>(E+T)*F=>(T+T)*F=>(F+T)*F
⑤ F→(E) ⑥ F→a ⑦ F→b ⑧ F→c
① E→E+T@+ ② E→T ③ T→T*F@* ④ T→F
⑤ F→(E) ⑥ F→a@a ⑦ F→b@b ⑧ F→c@c 8
6.3 语法制导翻译
语法制导翻译:给定一输入序列,根据翻译文法得到翻译该输 入序列的活动序列,从活动序列中分离出动作符号串,然后执 行该动作符号串所规定的动作,从而得到翻译结果。
else
error();
}
2020/7/29
16
➢ 对于产生式F→(E)|a@a| b@b| c@c
F() {if(ch==‘a’){ch = getnextsymbol();OUT(“a”); } else if(ch==‘b’) {ch=getnextsymbol();OUT(“b”);
} else if(ch==‘c’) {ch=getnextsymbol();OUT(“c”); }
➢ 翻译文法
➢ 语法制导翻译
➢ 属性翻译文法
2020/7/29
5
6.2 翻译文法
翻译文法:是上下文无关文法的推广,通过在描述语言规则的文 法产生式右部的适当位置加入动作而得到的文法 。
例:设计一个能将中缀表达式翻译成后缀表达式的翻译器。
假设输入串为a+b*c
+
输入符号本身表示读操作,用@表示输出操作 a
else if(ch==‘(’) { ch = getnextsymbol(); E ( ); if(ch ==‘)’)ch = getnextsymbol(); }
else error(); }
2020/7/29
17
LL(1)翻译器
例:输入文法: ① A→aBcD ② A→b ③ B→c ④ B→aA ⑤ D→cD ⑥ D→b 翻译文法: ①A→@va@wB@xc@yD@z ②A→b ③B→c@r ④B→a@mA ⑤D→cD@n ⑥D→@sb