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

合集下载

第3,4课 一个简单的语法制导翻译器

第3,4课 一个简单的语法制导翻译器

弟节点上的属性值决定,则该属性为继承属性
第二章 一个简单的语法制导翻译器

后缀表达式(postfix notation):E
如何E是一个变量或常量,则E的后缀是本身 如果E是一个形如E1 op E2的表达式,op是二目运算
符,那么E的后缀表示是:E1‘ E2‘ op,这里E1‘ 和E2‘分 别是E1和E2的后缀表示 如果E是一个形如(E1)的表达式,则E的后缀表示就 是E1的后缀表示
每个产生式和一组语义
expr term term 0 term 1 … term 9
规则相关联
第二章 一个简单的语法制导翻译器

语法制导翻译
属性 综合属性
如果某个属性在语法分析树节点N上的值由N的子节点和N
本身的属性值确定,则该属性为综合属性
继承属性
如果某个属性由语法分析树中该节点本身、父节点以及兄
第3,4次课 一个简单的语法制导翻译器
2.3~2.5
中缀表达式转后缀表达式

本次课主要内容都是基于如何将中缀表达 式转换为后缀表达式 9 – 5 + 2 -> 95-2+
2.3语法制导翻译的定义
第二章 一个简单的语法制导翻译器

语法制导翻译:对语法树进行语义分析
例如:将中缀表达式转化成为后缀 9 - 5 + 2 95–2+
term.t = 5 5
term.t = 9
9
产生式
expr expr1 + term expr expr1 - term expr term term 0 term 1 … term 9
语义规则
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‟

语法制导翻译【共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)

2019年郑州大学编译原理第2章.ppt

2019年郑州大学编译原理第2章.ppt
(3)若E为表达式,是一元运算符,则 E (或E )
也 是表达式;
(4) 若E为表达式,则 ( E )也是表达式。
二、语句
1、赋值句 2、控制语句
无条件转移语句 条件语句 循环语句 过程(或函数)调用语句 返回语句
3、说明句 4、简单句和复合句
§2.3 程序语言的语法描述
本节介绍高级语言语法结构的形式化描述问题
例题2.5
构造一个文法G4,使得
L(G4)={ ambn | m>n≧0 } 正解:文法G4: SAB Aa|aA BaBb|ε
上下文无关文法定义 归纳起来,一个上下文无关文法包括四个组成 部分: 一组终结符号 如:me ,book,gave 等 一组非终结符号 如:<主语>,<谓语> 等 一个开始符号 如: <句子> 一组产生式 如: <间接宾语> → <代词> <直接宾语> → <冠词> <名词>
上下文无关文法定义
形式上说,一个上下文无关文法G是一个四元式: G=(VT,VN,S,),其中: VT是一个非空有限集,它的每个元素为终结符号; VN是一个非空有限集,它的每个元素为非终结符号 且VT∩VN= Φ S 是一个非终结符号,称为开始符号; 是产生式有限集合,形如 A→α * 其中:A∈ VN, α∈(VT U VN) 。 注: 开始符号S是一个特殊的非终结符号,它至少 必须在某个产生式的左部出现一次。
语义规则 是指这样的一组规则,使用它可以定义一
个程序的意义。

描述语义规则的工具:
基于属性文法的语法制导下的翻译方法
2.1.3 程序
所谓程序,是描述一定数据的处理过程,即包括描述 数据和对数据的运算两个功能。

语义分析和语法制导翻译-编译原理-06-(二)

语义分析和语法制导翻译-编译原理-06-(二)
E.code := E1.code || gen(E.place':=0-'E1.place)
E.place:= E1.place; E.code:= E1.code
E.place:= id.place; E.code:= ' ' E.place:= num.val;E.code:= ' '

注释: || 表示代码序列的连接
T.type := „real‟ L1.in := L.in addtype( id.entry, L.in )
L → id
entry addtype
addtype( id.entry, L.in ) 单词 id 的属性(符号表入口)
在符号表中为变量填加类型信息
属性文法的作用

抽象描述语义处理的要求
习题
1. 下列文法是一个二进制数的文法。试根据 该文法,编写一个语法制导定义,描述由 S 生成的二进制数的数值计算。 S -> L . L L -> L B | B B -> 0 | 1 2. 参照下列表达式文法编写语法制导定义, 描述表达式的类型计算。要求在不同精度的 数的计算中,结果取精度高的类型。 E -> E + T | T T -> n.n | n
分析树和属性计算
S-属性定义:
仅包括综合属性
对于所有A
→ X1 X2 …Xn, 的属性
A的属性计算仅用X1…Xn
如:算术表达式求值的属性文法
L-属性定义:
其属性可用深度优先的顺序从左
至右计算
对于所有 Xi
A→X1 X2 … Xn
属性计算仅使用A X1 X2 … Xi-1 的属性

编译课后题完整版

编译课后题完整版

第一章1.选择题(1)若源程序是高级语言编写的程序,目标程序是_C__,则称它为编译程序。

A汇编语言程序或高级语言程序B高级语言程序或机器语言程序C汇编语言程序或机器语言程序D连接程序或运行程序(2)编译程序是对_A__程序进行翻译。

A高级语言B机器语言C自然语言D汇编语言(3)如果编译程序生成的目标程序是机器代码程序,则源程序的执行分为两大阶段:_AC___A编译阶段B汇编阶段C运行阶段D置初值阶段(4)编译程序的工作过程一般可划分为下列5个基本阶段:词法分析、_CB___、代码优化和目标代码生成。

A出错处理B语义分析及中间代码生成C语法分析D表格管理(5)编译过程中,词法分析阶段的任务是_B__A识别表达式B识别语言单词C识别语句D识别程序2.判断题(1)编译程序是一种常用的应用软件。

(×)/*系统软件(2)C语言的编译程序可以用C语言来编写。

(√)(3)编译方式与解释方式的根本区别在于是否生成目标代码。

(√)(4)编译程序与具体的语言无关。

(×)(5)编译程序与具体的机器有关。

(√)(6)对编译程序而言,代码优化是不可缺少的一部分(×)(7)对编译程序而言,中间代码生成是不可缺少的一部分。

(×)(8)编译程序生成的目标程序一定是可执行的程序。

(×)(9)含有优化部分的编译程序的执行效率高。

(√)第二章1.选择题(1)一般程序设计语言的描述都涉及______三个方面A.语法B.语用C.语义D.基本符号的确定(2)为了使编译程序能对程序设计语言进行正确的翻译,必须采用____方法定义程序设计语言。

A.非形式化B.自然语言描述问题B.形式化 D.自然语言和符号体系相结合(3)设x是符号串,符号串的幂运算x°=____A.1B.xC.εD.ø(5)字母表中的元素可可以是_____A.字母B.字母和数字C.数字D.字母、数字和其他符号(6)文法用来描述语言的语法结构,由如下4个部分组成:_ABC_和文法开始符号。

第5课 词法分析、符号表、中间代码生成

第5课 词法分析、符号表、中间代码生成

符号表
符号表的每个条目中包含与一个标识符相关的
信息,比如它的字符串、类型、存储位置等。 为每个作用域设置一个符号表
block
‘{’ decls stmts ‘}’
1) { int x1 ; int y1 ; 2) { int w2 ; bool y2 ; int z2 ; 3) …w2…; …x1…; …y2…; …z2…; 4) } 5) …w0…; …x1…; …y1…; 6) }
第二章 一个简单的语法制导翻译器

符号表
符号表的每个条目中包含与一个标识符相关的
信息,比如它的字符串、类型、存储位置等。 为每个作用域设置一个符号表
block
‘{’ decls stmts ‘}’
B1 : x y B2 : w y z int bool int
B0 : w

1) { int x1 ; int y1 ; 2) { int w2 ; bool y2 ; int z2 ; 3) …w2…; …x1…; …y2…; …z2…; 4) } 5) …w0…; …x1…; …y1…; 6) }
public void put(String s, Symbol sym) { table.put(s, sym); }
public Symbol get(String s) { for(Env e = this; e != null; e = e.prev ) { Symbol found = (Symbol)(e.table.get(s)); if( found != null ) return found; } return null; } }
第二章 一个简单的语法制导翻译器

符号表

语法制导翻译和中间代码生成【共50张PPT】

语法制导翻译和中间代码生成【共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
+
叶子结点代表运算量, 非叶子结点代表运算符

编译原理(龙书)习题答案(chap2-3)

编译原理(龙书)习题答案(chap2-3)

状态
a
b
-A{0}
B
A
B{0,1}
B
C
C{0,2}
B
D
+D{0,3}
E
D
+E{0,1,3} E
F
+F{0,2,3} E
D
DFA的状态图:
1) a(a | b) * a
以a开头和结尾且至少包含两个字符的a,b字符串的集合
2) (( | a)b*)*
由a和b组成的任意字符串的集合
3) (a | b)*a(a | b)(a | b)
倒数第三个字符为a的任意的a,b字符串的集合
4) a*ba*ba*ba*
包含3个b的a,b字符串的集合
5)(aa | bb)*((ab | ba)(aa | bb)*(ab | ba)(aa | bb)*)*
由相同数目的a和b组成的字符串的集合,或者空串
5) S a | S S | S S | S| ( S )
以a为变量,包括+,连接,*和括号四种运算的表 达式的集合
2.2.3 练习2.2.2中哪些文法具有二义性? 3) 4) 5)具有二义性。 以5)为例进行说明: 给定字符串 a+a+a ,对应着两棵分析树:
DFA的转换表:
状态
ห้องสมุดไป่ตู้
a
b
+A{0,1,2,3,5,6,7,9,10,11} B
C
+B{1,2,3,4,5,6,7,9,10,11} B
C
+C{1,2,3,5,6,7,8,9,10,11} B
C
DFA的状态图:
4) (a | b)*abb(a | b)*

编译原理——精选推荐

编译原理——精选推荐

(7)《编译原理》各章重点习题第二章:2.1:试构造生成语言L={a n b n c i|n≥1, i ≥0}的文法解:2.2:已知语言L={a n bb n| n ≥1}, 写出产生L的文法。

2.3:已知文法G=({A,B,C},{a,b,c},A,P)其中产生式P由以下组成:A →abc A →aBbcBb→bB Bc →CbccbC →Cb aC →aaBaC →aa问:此文法表式的语言是什么?2.4请给出描述语言={a2m+1 b m+1 | m>=0}∪{a2m b m+2| m>=0}的文法2.5已知文法G[S]为:S→dABA→aA|aB→Bb |εG[S]产生的语言是什么?G[S]能否改写为等价的正则文法?2.6:试写一文法,使其描述的语言L(G) 是能被5整除的整数集合。

2.7:已知语言L={x | x∈{a,b,c}*,且x重复排列是对称的(aabcbaa,aabbaa,等)写出该语言的文法。

第三章3.1写出能被5整除的十进制整数的文法及正规表达式。

3.2写一个文法,使其语言是奇数集,且每个奇数不以0开头。

3.3:已知有限自动机如图(1)以上状态转换图表示的语言有什么特征?(2)写出其正规式与正规文法.(3)构造识别该语言的确定有限自动机DFA.3.4请构造与正规式R=(a*b)*ba(a|b)*等价的状态最少的DFA(确定有限自动机)3.5设字符集∑={ a, b } ,请写出不以a开头的但以aa结尾的字符串集合的正规表达式,并构造与之等价的状态最少的DFA。

第四章4.1试构造与下列文法G[S]等价的无左递归文法。

G[S]: S→Sa|Nb|c (1)N →Sd|Ne|f4.2:文法G的规则集为;P →begin d : X endX →d : X | sYY→: sY | e做出该文法LL(1)分析表。

4.3 设有以下文法:G[S]: S→eEfGh | gE→FSG | hF→SEc | cG | εG→Sh |ε(1)求出该文法每一个非终结符的FOLLOW集。

编译技术—-SIMPLE语言的语法制导翻译程序的设计

编译技术—-SIMPLE语言的语法制导翻译程序的设计
(字 母 )
9.( 常数) = : ( 整数) l ( 布尔常数) I ( 字符常数 )l < 常数 标 识符 ) l 《 数) 实 10.<整 数 ) = ( 字 ) f ( 常 数 )< 字 ) : 数 整 数
1 3 表达 式的定 义 .
符 号 < > ‘ = )= / 木 乖 /

fu lt o a n d aa ry r bg en i
bo1 l
2 1 2 2 2 3 2 4
2 5
达 语句 > l
pgm rr oa rd e a f e
st e te In l
t O 打u e
< 函数调用语句>< l输入语句> < }输出语句> < eun }r tr 语句> < J复合语句>
符>
6< .保留字>: n r a e i bo =ad lar y j gn l o 1{c1 a e Ica b al Ic s h r I cn tn Id ;e s n Jfl e fr f J nu , ne e o sa t o l e Je d a s j o Ji ip t li tg r J n t f0 fo fotu f e d e l ee t eu n ie fte o f r u p t a f a frp a fr tr t h n r r s o re n i l i l o d i e l r t /26 lt ltu 1u t1 a n vi 1 h l w ie /3- 4 m w
1语言 定义 11 字符集 的定义 . 1< .字符集 >= < 母> j< : 字 数字 > j< 单界符 > 2 < 母>: fB .字 :A ……. z b 1 fa f f………. {z 3 < 字> : 1 1… ・ 9 . 数 =0 l I2 . l .

编译原理课程设计_算术表达式、for、while语句转换为四元式

编译原理课程设计_算术表达式、for、while语句转换为四元式

计算机与信息学院《操作系统与编译原理联合课程设计报告》专题:编译原理部分学生姓名:学号:专业班级:指导教师:2014 年 7 月一、设计目标设计一个语法制导翻译器,将算术表达式、for语句、while语句翻译成四元式。

要求先确定一个定义算术表达式、for语句、while语句的文法,为其设计一个语法分析程序,为每条产生式配备一个语义子程序,按照一遍扫描的语法制导翻译方法,实现翻译程序。

对用户输入的任意一个正确的表达式,程序将其转换成四元式输出。

二、设计思路开发平台:Visual C++ MFC解决这个问题的方案分为以下几个步骤:1.将算数表达式、for语句、while语句转换为四元式的第一步为对读入的表达式进行处理,即删除不必要的空格、回车、换行等,保证之后的步骤能够顺利进行。

2.分析算术表达式、for语句、while语句的文法。

3.通过词法分析判断语句中的每个字符的类型,如:数字、字母、符号等。

4.建立每种文法的LR(0)分析表,通过每个文法的LR(0)分析表对相应的表达式进行语法分析。

5.在语法分析正确的情况下,通过语法分析的中间过程的符号栈输出四元式,四元式的形式为:(op arg1 arg2 result)。

(一)算术表达式转换为四元式将算术表达式转换为四元式首先考虑了括号的问题,对于不同的算术表达式第一步进行词法分析,即确定各种符号的位置。

而括号中的式子是优先级最高的,应该最先进行处理。

我使用了一个数组记录算术表达式中括号的位置,并且定义了first_cc和first_jj函数对括号的乘除法和加减法分别进行处理。

后将括号的式子以四元式的形式输出。

通过以上转换,已将原算术表达式中的括号中的容使用大写字母’A’、’B’……等代替(其中定义声明了change函数,用来将括号部分替换为大写字母)。

新的式子中,只含有加减乘除以及赋值这四种运算,后根据优先级的不同,逐步生成四元式。

其算法流程图如右图所示。

编译原理 第二章 机械工业出版社

编译原理 第二章 机械工业出版社

第二章部分习题答案2.1 考虑文法S→S S + | S S * | aa)证明文法可生成符号串 a a + a *解:S→S S * →S S + S * →a S + S * → a a + S *→ a a + a *b)为此符号串构造语法树解:c)文法生成什么样的语言?证明结论解:将a看作运算数,文法生成语言L={支持加法、乘法的表达式的后缀表示形式} 证明类似2.2题b)=====================================2.2 下列文法生成什么样的语言?证明你的结论。

是否有二义性?a)S →0 S 1 | 0 1解:生成语言L={0n1n | n>=1}证明:1) 证文法推导出的符号串都在L中i)考虑最小语法树,推导出的符号串01显然∈Lii)假定结点数<n的语法树对应的符号串都∈L,考虑结点数=n的语法树S,其结构必为,子树S1结点数<n,因此对应符号串t1∈L,S对应符号串为t=0 t1 1,因此t∈L综合i)、ii),1)得证2) 证L中符号串都可由文法推导出i)L中最短符号串01,显然可由文法推导出ii)假定L中长度<2n的符号串都可由文法推导出,考虑长度=2n的符号串t=0n1n,它可表示为0 t1 1,t1∈L且长度<2n ,因此它可被文法推导出,对应语法树,构造语法树,显然,它的输出为t,即t可被文法推导出综合i)、ii),2)得证综合1)、2),文法生成的语言即为L另外,文法没有二义性=====================================b)S →+ S S | - S S | a解:生成语言L={支持加法、减法的表达式的前缀表示形式}证明:1) 证文法推导出的符号串都在L中i)考虑最小语法树,推导出的符号串a显然∈Lii)假定结点数<n的语法树对应的符号串都∈L,考虑结点数=n的语法树S ,其结构必为,子树S1、S2结点数<n,因此对应符号串E1、E2∈L(前缀表达式),S对应符号串为E=+/- E1 E2,E也是前缀表达式。

中间代码生成

中间代码生成

计算机科学与工程学院课程设计报告题目全称:常用边缘算法的实现学生学号: 2506203010 姓名:王嘉指导老师:职称:指导老师评语:签字:课程设计成绩:编译器中间代码生成的研究与实现作者:王嘉学号:2506203010指导老师:吴洪摘要:在编译器的翻译流水线中,中间代码生成是处于核心地位的关键步骤。

它的实现基于语法分析器的框架,并为目标机器代码的实现提供依据。

虽然在理论上没有中间代码生成器的编译器也可以工作,但这将会带来编译器的高复杂度,低稳定性和难移植性。

现代编译理论不仅要求中间代码的生成,还要求基于中间代码的优化。

本文研究并实现了一个轻量级类C语言的中间代码生成器,并就中间代码生成的原理进行了细致的阐述。

关键字:中间代码生成、语法制导翻译、翻译模式、语法树、三地址码一、目的及意义在编译器的分析综合模型中,前端将源程序翻译成一种中间表示,后端根据这个中间表示生成目标代码。

目标语言的细节要尽可能限制在后端。

尽管源程序可以直接翻译成目标语言,但使用与机器无关的中间形式具有以下优点:1.重置目标比较容易:不同机器上的编译器可以在已有前端的基础上附近一个适合这台新机器的后端来生成。

2.可以在中间表示上应用与机器无关的代码优化器。

本文介绍如何使用语法制导方法,基于一种轻量级的类C语言FineC的词法分析器和语法分析器,一遍地将源程序翻译成中间形式的编程语言结构,如声明、赋值及控制流语句。

为简单起见,我们假定源程序已经经过一遍扫描,生成了相应的词法记号流和符号表、词素表结构。

基于FineC语法标准的语法分析器框架也已经能够正常工作。

我们的任务就是补充这个框架,使其在语法分析的过程中生成相应的中间代码,并将必要的变量和函数声明存放在一个符号表链中。

二、目标语言词法和语法标准:这里定义一个编程语言称作FineC(“fine”指代轻量、精妙)。

它是一种适合编译器设计方案的语言。

本质上是C语言的一个限制了数据类型、算术操作、控制结构和处理效率的轻量子集。

语法制导翻译

语法制导翻译

语法制导翻译
语法制导翻译是一种将源语言(通常为自然语言)的语法结构与目标语言的语法结构相对应的翻译方法。

它通过语法分析器和语法制导翻译器来实现。

在语法制导翻译中,源语言和目标语言的语法规则被定义成一个或多个上下文无关文法。

语法制导翻译的主要思想是在语法分析树中嵌入翻译动作,并通过语法制导翻译器将源语言转换为目标语言。

语法制导翻译器的主要任务是对每个语法分析树节点进行翻译动作的定义,并将这些翻译动作与语法分析器的分析过程相结合,最终生成目标语言的语法结构。

语法制导翻译是机器翻译领域的一种重要研究方向,它可以有效地解决自然语言翻译中的语言差异和歧义问题。

同时,它也是编译原理、计算机语言学等领域中的基础性问题。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
9 + 5 * 2 是什么含义? (9 + 2) * 5 或9 + (5 * 2) ? 不同的运算符号有不同的优先级,如9+5*2 表示
9+(5*2),所以*的优先级比+高。
() 优先级 * /
+-
19
通过适当改写文法规则,可以描述不同的结合律和优先 级:
factor digit | ( expr )
term
term * factor
|
term / factor
|
factor
expr
expr + term
|
expr – term
|
term
factor(因子):不能被任何运算符分开的表达式
term(项):可以被高优先级的运算符*和/分开,但不能被低优先级运算符分
开的表达式
expr(表达式):expression
语法分析树 Parse Tree
4
巴科斯-诺尔范式 Form
Bakus-Naur范式(BNF)
约翰·巴科斯
5
BNF例子
非终结符
标识符的定义:
identifier ::= <letter> { letter | digit }
letter ::= “A” | “B” | “C” | ... | “Z” | “a” | “b” | ... | “z”
第二章 一个简单的语法制导翻译器
1
本章主要内容
中缀表达式 expr op expr 后缀表达式 expr expr op
用C语言开发一个把中缀表达式转换为后缀表达式 的翻译程序,展示基本的编译技术
9*5+x
95*x+
主要描述编译器的前端 词法分析、语法分析和语义分析
通过本章对编译的过程有所了解
如果非终结符A有产生式 A XYZ,则A的一棵分析 树为:
A
X YZ
13
句法分析树Parse Tree
分析树具有如下性质:
根结点是开始符号Start Symbol 叶子结点是终结符或 内部结点是一个非终结符 Non-Terminal
If A x1x2…xn, Then A 是一个非终结符; x1x2…xn 是A 的孩子,是终结符或非终结符
2
2.1 概述
程序设计语言由语法(syntax)和语义(semantics)两个方面 定义。
程序设计语言的语法通常用上下文无关文法来表示。 if_stmt if (expr) stmt else stmt A bDc D eFgH | e
中文:S->主语 谓语 宾语 日语:S->主语 宾语 谓词 阿拉伯语:S->谓词 主语 宾语
digit 0 | 1 | … | 9
a=b=c right
letter = right
a
letter = right
b
letter
c
right letter = right | letter
letter a | b | c | …| z
18
2.2.4 算符优先级 Operator Precedence
S Subj Verb Obj 奶牛 吃 草
每个文法符号有属性的集合
每个产生式有语义计算规则的集合
语法制导翻译方案
描述翻译过程
一个例子:将中缀表达式翻译成后缀表达式
expr expr1 + term
翻译expr1; 匹配+;
翻译term;
22
处理加法表达式;
2.3.1 后缀表示Postfix Notation
(6) 竖线( | )表示在其左右两边任选一项,相当于"OR"的意思。
6
(7) ::= 是“被定义为”的意思。
语法图 Syntax Graph
尼古拉斯·沃斯
7
提出了“结构化程序设计”的概念,算法+数据结构=程序,设计了Pascal语言。
上下文无关文法 Context-Free Grammar, CFG
25
注释分析树
综合属性:属性值是由子节点的属性确定的 通过遍历分析树可以求得结果 计算顺序:深度优先遍历是一种常用的方法
expr.t =95-2+
expr.t =95expr.t =9 term.t =5
term.t =9
term.t =2
左结合例子:a=3-4-5; a=3-4+5; 右结合例子:a=b=c+1; a=**p;q=&*p;
17
Left vs. Right
9-5+2 list
list + digit
list - digit
2
5
digit
9
list list + digit | list - digit | digit
stmts stmts stmt
|
注意:“;”的设置
假设改为:if (expr )then stmt; 又假设stmt为赋值语句, 那么 语句就会多出现一个分号, 21 例如:if( a>0 ) b++; ;
2.3 语法制导翻译 Syntax-Directed Translation
语法是掌握语义的钥匙 语法制导定义
Examples: ( 9 – 5 ) + 2 9 5 – 2 + 9–(5+2) 952+-
23
2.3.2 语法制导定义 Syntax-Directed Definition
每个文法符号有属性的集合(a Set of Attributes) 每个产生式有语义计算规则的集合(a Set of
上述文法定义的是由加号和减号分隔的数字 序列构成的列表。
10
例2.2 数字序列9 - 5 + 2的推导(derive)
list list + digit list - digit + digit
digit - digit + digit 9 - digit + digit 9 - 5 + digit 9-5+2
终结符号:+ - 0 1 2 3 4 5 6 7 8 9 Vt
9
非终结符号 :list digit Vn
开始符号:list
“”:推导,左部是非终结符,右部是(VtVn)*
“|” 表示“或者”
9
例2.1 简单的算术表达式
list list + digit | list – digit | digit digit 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
expr1的解释
Semantic Rule 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’
9 - digit + digit
9 - 5 + digit
digit
9-5+2
9
list
list
digit
digit
-
5+
token
2
15
list list + digit | list – digit | digit
2.2.2 二义性 Ambiguity 9-5+2
文法Grammar:
语义的描述则比语法的描述难得多,采用非形式化的自然语 言描述
牛吃草。 语义错误:汽车吃草。
3
如何描述语法
上下文无关文法Context Free Grammar (CFG) Bakus-Naur范式(BNF) 语法图Syntax Graph
IP NP-SBJ VP NP-SBJ DNP NP NN 贷款|本息 | 回收|中国
上下文无关文法CFG是一个四元组 (Vt, Vn, S, P),其中:
1. Vt 是一个非空有穷集合,称作终结符号集合
Terminal Symbols
2. VNnon是-te一rm个in非als空,有且穷Vt集V合n ,= 称。作非终结符号集合 3. S Vn ,称作开始符号Start Symbol 。 4. P是一个非空有穷集合,称为产生式集合Production
P1 : list list + digit P2 : list list - digit P3 : list digit P4 : digit 9 P4 : digit 5 P4 : digit 2
从开始符号推导得到的所有的终结符号串的集合称
为该文法定义的语言(language)。
Rules ,每条产生式形为A,其中AVn, (VtVn)*。
8
例2.1 简单的算术表达式
9-5+2
list list + digit list list - digit
list list + digit
list digit
list - digit 2
digit 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 digit 5
digit
::= “0” | “1” | “2” | ... | “9”
整数的定义:
integer ::= [symbol] unsigned
终结符
unsigned ::= digit { digit }
相关文档
最新文档