一个简单的语法制导翻译器

合集下载

中国科学技术大学陈意云编译原理全套参考资料chapter4

中国科学技术大学陈意云编译原理全套参考资料chapter4

中国科学技术大学陈意云编译原理全套参考资料chapter4 第四章语法制导的翻译在3.7节用Yacc写的例子中,我们看到一种有用的描述形式:语言结构的属性附加在代表语言结构的文法符号上,这些属性值由附加在文法产生式的语义动作来计算,这些语义动作在归约对应的产生式时进行计算,由此得到结果。

这种描述形式可用来描述编译器的语义分析,因此本章系统地研究这种称之为“语法制导下的语言翻译”的描述方法及其实现。

它的语义动作(有时称为语义规则)的计算可以产生代码、把信息存入符号表、显示出错信息、或完成其它工作。

语义规则的计算结果就是我们所要的记号流的翻译。

本章讨论语义规则和产生式相联系的两种方式:语法制导的定义和翻译方案。

语法制导定义是较抽象的翻译说明,它隐蔽了一些实现细节;而翻译方案陈述了一些实现细节,主要是指明了语义规则的计算次序。

在第五章说明语义检查和第七章描述中间代码生成时,大量使用这两种方法。

本章还讨论语法制导定义和翻译方案的实现方法。

概念上的方法是,首先分析输入的记号串,建立分析树,然后从分析树得到描述结点属性间依赖关系的有向图,从这个依赖图得到语义规则的计算次序,然后进行计算,最终得到翻译的结果。

实际的实现并不需要按上面步骤逐步进行,本章将讨论几种不同限制下的实现方法。

4.1 语法制导的定义语法制导的定义是上下文无关文法的推广,其中每个文法符号都有一个属性集合,它分成两个子集,分别叫做该文法符号的综合属性集合和继承属性集合。

如果我们把分析树上的结点看成是保存对应文法符号的属性的记录,那么属性对应记录的域。

属性可以表示任何东西:串、数、类型、内存单元,或其它想表示的东西。

分析树结点的属性值由该结点所用产生式的语义规则定义。

在语法制导定义中,我们把其中的文法称为基础文法。

本节介绍语法制导定义的形式及其概念上的实现模型。

4.1.1 语法制导定义的形式在语法制导定义中,每个文法符号有一组属性,每个文法产生式A , ,有一组形式为b := f (c, c, …, c )的语义规则,其中f 是函数,b和c, c, …, c 是该产生式的文法符号的12k12k属性,并且:(1) 如果b是A的属性,c , c , …, c 是产生式右部文法符号的属性或A的其它属12k性,那么b叫做文法符号A的综合属性。

语法制导翻译【共41张PPT】

语法制导翻译【共41张PPT】

一个属性文法称为L-属性文法,如果对于每个产生式
int T_val, R_i, R_s; int E_val;
AX1X2Xn,其中每条语义规则中的每个属性或者
是综合属性,或者是X (1jn)的一个继承属性且这 (3) E→(E(1))
val[ntop]= val[top–1]
使用标记非终结符M和N改写为
2. 函数过程A的代码(指用符号形式表示的数据和程序)
要根据当前的输入符号来决定使用哪一个产生式。
3. 与每一个产生式有关的代码,从左到右根椐产生式右部是
终结符(单词符号)、非终结符号还是语义动作,分别处 理:
保存下来,以便以后语义子程序引用这些信息。
原LR分析器的分析栈也加以扩充,存放三类信息:分析
状态、文法符号及文法符号对应的语义值。
top
sk
Xk
Xk.val
... ... ...
s1
X1
X1.val
s0
#
_
状态 文法符号 语义值
扩充后的LR分析栈
例6-3 考虑下面的语法制导定义
产生式
语义规则
9–5+2的带语义动作的分析树
设计翻译模式(根据语法制导定义)
语法制导定义是L-属性文法 保证语义动作不会引用还没有计算的属性值。
只需要综合属性的情况
为每一个语义规则建立一个包含赋值的动作,并把这个 动作放在相应的产生式右边的末尾。
例如:T T(1)*F T.val:=T(1).val*F.val
产生式 语义规则 A LM L.i:=l(A.i)
M.i:=m(L.s) A.s:=f(M.s) A QR R.i:=r(A.i) Q.i:=q(R.s) A.s:=f(Q.s)

translator++ 规则

translator++ 规则

Translator++是一个翻译工具,其规则可能包括以下几个方面:
1. 语法规则:Translator++的语法规则是指其解析和处理输入文本的方式。

它应该能够识别和解析各种语言的语法结构,以便正确地翻译文本。

2. 词汇规则:Translator++的词汇规则是指其翻译过程中使用的词汇和短语。

它应该具有一个广泛的词汇库,以便能够翻译各种语言中的词汇和短语。

3. 语义规则:Translator++的语义规则是指其理解文本含义的方式。

它应该能够理解文本中的语境、语气和意图,以便正确地翻译文本。

4. 文化规则:Translator++的文化规则是指其处理文化差异的方式。

它应该能够理解不同文化中的文化符号、习俗和价值观,以便正确地翻译文本。

5. 输出规则:Translator++的输出规则是指其生成翻译结果的方式。

它应该能够生成准确、流畅和自然的翻译结果,以便用户能够轻松地理解和使用。

需要注意的是,这些规则可能因不同的Translator++版本和不同的语言对而有所不同。

因此,在使用Translator++时,建议仔细阅读其文档和用户手册,以了解其具体的规则和使用方法。

语法翻译法的实施步骤 (2)

语法翻译法的实施步骤 (2)

语法翻译法的实施步骤1. 简介语法翻译法是一种用于将一种程序设计语言转换为另一种程序设计语言的技术。

它通过将源语言的语法规则映射到目标语言的语法规则,实现源语言程序到目标语言程序的转换。

本文将介绍实施语法翻译法的具体步骤。

2. 步骤以下是实施语法翻译法的一般步骤:步骤1: 确定源语言和目标语言在开始进行语法翻译的过程中,首先需要确定源语言和目标语言。

源语言是我们要转换的程序设计语言,目标语言是将源语言转换成的语言。

确切地了解源语言和目标语言的语法规则和语义规则非常重要。

步骤2: 词法分析词法分析是将源程序分解为一个个的单词(Token)的过程。

在这一步骤中,我们需要编写一个词法分析器,它将源代码作为输入,并识别出其中的单词。

每个单词都包含一个词法类型和一个对应的字符串值。

示例:源代码: x = 5 * 2;词法分析输出:- 词法类型: 标识符,字符串值: x- 词法类型: 赋值运算符,字符串值: =- 词法类型: 数字,字符串值: 5- 词法类型: 运算符,字符串值: *- 词法类型: 数字,字符串值: 2- 词法类型: 分号,字符串值: ;步骤3: 语法分析语法分析是将词法分析器输出的单词流转换为语法树的过程。

在这一步骤中,我们需要编写一个语法分析器,它将识别源代码中的语法规则并生成一个语法树。

语法树用于表示程序的结构和层次关系。

示例:源代码: x = 5 * 2;语法树:=/ \\x */ \\5 2步骤4: 语法制导翻译语法制导翻译是基于语法树进行语法规则的翻译过程。

在这一步骤中,我们需要根据源语言和目标语言的语法规则,编写语法制导翻译器,它将遍历语法树并根据语法规则翻译每个节点。

示例:源代码: x = 5 * 2;目标语言: Python翻译结果: x = 5 * 2步骤5: 语义分析和翻译语义分析是对源代码进行静态语义检查的过程。

在这一步骤中,我们需要编写语义分析器,它将检查源代码是否符合源语言和目标语言的语义规则。

语法制导翻译

语法制导翻译
例:图5-7的一个拓扑排序 1,2,3,4,5,6,7,8,9
或1,3,5,2,4,6,7,8,9
编译原理
20
循环依赖Circular dependency
产生式 AB
语义规则 A.s := B.i B.i := A.s + 1
A A.s
B B.i
编译原理
21Biblioteka 属性计算次序构造输入的分析树, 构造属性依赖图, 对结点进行拓扑排序, 按拓扑排序的次序计算属性。
介绍语法制导翻译的实现方法。
编译原理
3
语法制导翻译的一般过程
输入符号串 分析树 依赖图 语义规则的计算顺序
一个句子的翻译过程可以与语法分析过程并行。
编译原理
4
5.1 语法制导定义
语法制导定义是对CFG的推广,每个文法符号都有 一个相关的属性集。
属性:语义信息。一个文法符号通常用一个或若干 个属性来描述它的语义信息。典型例子: ▪ 变量的数据类型 ▪ 表达式的值 ▪ 变量的存储位置 ▪ 程序的目标代码
F.val := digit.lexval
编译原理
13
图5-4
T.val = 15
F.val = 3
T′.inh = 3
.syn =15
digit.lexval =3
*
T1′.inh = 15
F.val = 5
.syn =15
digit.lexval = 5
编译原理
14
继承属性
一个结点的继承属性值由该结点的父结点和(或) 兄弟结点的属性决定。
分析树各结点属性的计算可以自底向上地完成。
编译原理
11
8+5*2 n的注释分析树 (annotated parse tree)

编译原理 第5章语法制导的翻译

编译原理 第5章语法制导的翻译

属性和文法符号相关联 规则和产生式相关联

根据需要,将文法符号和某些属性相关联, 并通过语义规则来描述如何计算属性的值


E→E1+T E.code=E1.code || T.code || ‘+’ code表示了我们关心的表达式的逆波兰表示,规则说明 加法表达式的逆波兰表示由两个分量的逆波兰表示并置, 然后加上‘+’得到。
digitlexval=3
18
适用于自顶向下分析的SDD


前面的表达式文法存在直接左递归,因 此无法直接用自顶向下方法处理。 消除左递归之后,无法直接使用属性val 进行处理:


比如规则:T→FT’ T’→*FT’ T对应的项中,第一个因子对应于F, 而运算符在T’中。
19
相同表达式的不同文法的比较
38
例5.15 分析栈实现的例子

假设语法分析栈存放在一个被称为stack 的记录数组中,下标top指向栈顶;


stack[top]指向这个栈的栈顶;stack[top-1] 指向栈顶下一个位置; 如果不同的文法符号有不同的属性集合,我 们可以使用union来保存这些属性值。(归 约时,我们知道栈顶向下的各个符号分别是 什么)
语义翻译的流程
输 入 符 号 串 分 析 树 依 赖 图




的 计
实际上,编译中语义翻译的实现并不是 按图中的流程处理的;而是随语法分析 的进展,识别出一个语法结构,就对它 的语义进行分析和翻译。

9
5.1 语法制导定义

4.什么是语法制导定义(SDD) 上下文无关文法和属性/规则的结合;

语法分析器生成器YACC

语法分析器生成器YACC

E : num num
再分析3++5
5
分析器动作 移进 num,转向state 3 按(2)“E : num”归约,goto State 1 移进 +,转向State 4 移进error,转向 state 2 按(3)“E : error”归约,goto State 5, 按(1)“E : E‘+’E”归约,goto State 1 移进 +,转向State 4 移进 num,转向 State 3 按(2)“E : num”归约,goto State 5 按(1)“E : E‘+’E”归约,goto State 1 接受
2.2.3.2 YACC对语义的支持
分析器工作原理:
记号流 归约前栈顶 归约后栈顶 $3 E $2 + $1($$) E ... ... 驱动器 分析表 输出
语义栈对语法制导翻译提供直接支持。语义栈的 类型决定了文法符号的属性,语义栈类型表示能力的 强弱决定了YACC的能力。
<1> YACC默认的语义值类型 YACC语义栈与yylval同类型,并以终结符的yylval 值作为栈中的初值。因为yylval的默认类型为整型,所 以,当用户所需文法符号的语义类型是整型时,无需定 义它的类型。如在下述表达式的产生式中: E :E '+' E | E '*' E | num ; { $$=$1+$3;} { $$=$1*$3;}
2.2.1 YACC概述
利用YACC进行语法分析器设计的关键,也是如何编写 YACC源程序。 下边首先介绍YACC源程序的基本结构,然后着重讨论 YACC的产生式、YACC解决产生式冲突的方法、以及YACC对语 义的支持和对错误的处理等。

第8讲 语法制导翻译_1

第8讲 语法制导翻译_1
输入:
3*5+4n
副作用(Side effect)
语义规则
E.val=15 + T.val=4
print(E.val)
E.val = E1 .val + T.val E.val = T.val
T.val = T1val × F.val
T.val = F.val
T.val=15
F.val=4
T.val=3 * F.val=5 digit.lexval=4
如果一个SDD是S属性的,可以按照语法分析树节点的任何 自底向上顺序来计算它的各个属性值
S-属性定义可以在自底向上的语法分析过程中实现
L- 属 性 定 义
L-属性定义( 也称为L属性的SDD或L-SDD) 的 直观含义:在一个产生式所关联的各属性之间, 依赖图的边可以从左到右,但不能从右到左 ( 个SDD是L-属性定义,当且仅当它的每个属性要 么是一个综合属性,要么是满足如下条件的继承属 性:假设存在一个产生式A→X1X2…Xn,其右部符 号Xi (1 i n)的继承属性仅依赖于下列属性:
A的继承属性 产生式中Xi左边的符号 X1, X2, … , Xi-1 的属性 Xi本身的属性,但Xi 的全部属性不能在依赖图中形成环路
将每个产生式和一组语义规则相关联,用来计算 该产生式中各文法符号的属性值
文法符号的属性
综合属性 ( synthesized attribute) 继承属性 ( inherited attribute)
综 合 属 性 ( synthesized attribute)
在分析树结点 N上的非终结符A的综合属性只能通 过 N的子结点或 N本身的属性值来定义
两个概念
将语义规则同语法规则(产生式)联系起来要 涉及两个概念
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
语法制导定义 语法制导翻译方案
❖将程序片段附加到一个文法的各个产生式上的表示 法
rest + term { print ( ‘ + ‘ ) } rest1
❖被嵌入到产生式体中的程序片段成为语义动作( semantic action)。语义动作用花括号括起来。
expr.t = 9 - term.t = 5
2
term.t = 9
9
产生式 expr expr1 + term expr expr1 - term expr term term 0 term 1 … term 9
5
语义规则 expr.t = expr1.t || term.t || ‘+’ expr.t = expr1.t || term.t || ‘-’ expr.t = term.t term.t = ‘0’ term.t = ‘1’ … term.t = ‘9’
5
语义规则 expr.t = expr1.t || term.t || ‘+’ expr.t = expr1.t || term.t || ‘-’ expr.t = term.t term.t = ‘0’ term.t = ‘1’
…t = ‘9’
第二章 一个简单的语法制导翻译器
第3,4次课 一个简单的语法制导翻译器
2.3~2.5
中缀表达式转后缀表达式 ❖ 本次课主要内容都是基于如何将中缀表达
式转换为后缀表达式
9 – 5 + 2 -> 95-2+
2.3语法制导翻译的定义
第二章 一个简单的语法制导翻译器
❖ 语法制导翻译:对语法树进行语义分析
例如:将中缀表达式转化成为后缀
2
term.t = 9
9
产生式 expr expr1 + term expr expr1 - term expr term term 0 term 1 … term 9
5 后缀表达式
语义规则 expr.t = expr1.t || term.t || ‘+’ expr.t = expr1.t || term.t || ‘-’ expr.t = term.t term.t = ‘0’ term.t = ‘1’ … term.t = ‘9’
❖ 语法制导翻译
语法制导定义 (syntax-directed definition)
❖ 每个文法符号和一个属 性集合相关联
例树中”.t”是属性
❖ 每个产生式和一组语义 规则相关联
expr.t = 95-2+ expr.t = 95- + term.t = 2
expr.t = 9 - term.t = 5
第二章 一个简单的语法制导翻译器
❖ 语法制导翻译
语法制导定义 (syntax-directed definition)
❖ 每个文法符号和一个属 性集合相关联
例树中”.t”是属性
简单语法制导定义
❖ 每个产生式和一组语义 规则相关联
expr.t = 95-2+ expr.t = 95- + term.t = 2
如何E是一个变量或常量,则E的后缀是本身 如果E是一个形如E1 op E2的表达式,op是二目运算
符,那么E的后缀表示是:E1’ E2’ op,这里E1’ 和E2’分 别是E1和E2的后缀表示 如果E是一个形如(E1)的表达式,则E的后缀表示就 是E1的后缀表示
第二章 一个简单的语法制导翻译器
第二章 一个简单的语法制导翻译器
❖ 语法制导翻译
语法制导定义 (syntax-directed definition)
深度优先遍历
procedure visit ( node N) { for(从左到右遍历N的每个子节点C) { visit(C); } 按照节点N上的语义规则求值;
}
expr.t = 95-2+ expr.t = 95- + term.t = 2
❖9 - 5 + 2

95–2+
list
list
digit


list digit
digit 9 - 5+ 2
第二章 一个简单的语法制导翻译器
❖ 语法制导翻译:对语法树进行语义分析
语法制导定义 语法制导翻译方案
第二章 一个简单的语法制导翻译器
❖ 语法制导翻译 例子:9-5+2
expr.t = 95-2+
第二章 一个简单的语法制导翻译器
❖ 语法制导翻译:对语法树进行语义分析
语法制导定义 语法制导翻译方案
❖将程序片段附加到一个文法的各个产生式上的表示 法
rest + term { print ( ‘ + ‘ ) } rest1
第二章 一个简单的语法制导翻译器
❖ 语法制导翻译:对语法树进行语义分析
语法制导定义 (syntax-directed definition)
❖ 每个文法符号和一个属 性集合相关联
例树中”.t”是属性
❖ 每个产生式和一组语义 规则相关联
expr.t = 95- + term.t = 2
expr.t = 9 - term.t = 5
2
term.t = 9
9
产生式 expr expr1 + term expr expr1 - term expr term term 0 term 1
❖ 语法制导翻译
属性
❖综合属性
如果某个属性在语法分析树节点N上的值由N的子节点和N 本身的属性值确定,则该属性为综合属性
❖继承属性
如果某个属性由语法分析树中该节点本身、父节点以及兄 弟节点上的属性值决定,则该属性为继承属性
第二章 一个简单的语法制导翻译器
❖ 后缀表达式(postfix notation):E
expr.t = 9 - term.t = 5
2
term.t = 9
9
产生式 expr expr1 + term expr expr1 - term expr term term 0 term 1 … term 9
5
语义规则 expr.t = expr1.t || term.t || ‘+’ expr.t = expr1.t || term.t || ‘-’ expr.t = term.t term.t = ‘0’ term.t = ‘1’ … term.t = ‘9’
相关文档
最新文档