【编译原理】-第2章-高级语言及其语法描述-Chapt2
编译原理第2章(1).ppt

例 “变量是一个算术表达式; 若E1和E2是算术表达式,则E1+E2,E1*E2和(El)也 是算术表达式。” 对于这个定义,若用产生式来描述,则可将它写成: E→i E→E+E E→E * E E→(E)
一个上下文无关文法G是一个四元式(VT,VN,S,ρ), 其中 VT是一个非空有限集,它的每个元素称为终结符号; VN是一个非空有限集,它的每个元素称为非终结符号, VT∩VN=φ S是一个非终结符号,称为开始符号; ρ是一个产生式集合(有限),每个产生式的形式是 P→α,其中,P∈VN, α∈(VT∪VN)* 。开始符号S 至少必须在某个产生式的左部出现一次。
2.2.3 数据类型与操作
一个数据类型通常包括以下三种要素: 用于区别这种类型数据对象的属性 这种类型的数据对象可以具有的值 可以作用于这种类型的数据对象的操作
2.2.3 数据类型与操作
一.初等数据类型 数值类型:整型、实型、复数、双精度, +, -, *, / 等 逻辑类型:布尔运算:∨,∧,┑ 字符类型:符号处理 指针类型
返回语句 return (E)
说明语句:定义各种不同数据类型的变量或运算,定 义名字的性质。
简单句和复合句
简单句:不包含其他语句成分的基本句 复合句:句中有句的语句
2.3 程序语言的语法描述
重点讨论上下文无关文法、语法分析树,以及文 法的二义性问题。最后还将对形式语言进行简单 概述。
字母表与符号
最左(最右)推导
所谓最左(最右)推导指:任何一步a => β都是对α中 的最左(最右)非终结符进行替换的。 最右推导也称为规范推导或规则推导。 (i*i+i)的最右推导: E =>(E) =>(E+E) =>(E+i) =>(E*E+i) =>(E*i+i) =>(i*i+i)
编译原理第2章

例1:文法的几种写法
① G=({S,A}, {a,b}, P, S) ② G: S→ aAb ε A→ ab|aAb| 其中P: S→ aAb ε ③ G[S]: S→ aAb A→ ab|aAb| ε A→ ab|aAb|
§2.3 程序语言的语法描述
例2:Pascal语言中控制语句的文法
+ 1 n * 1 n
§2.3 程序语言的语法描述
( 4) 定义语言: G是一文法, S为其开始符, 如果S , 则 S 为一句型; 只含终结符的句型称为句子; G所产生的 称 句子全体是一个语言, 记为 L(G), 即: |S L G | S & V & ∈V * } L(G)={ T
二、带标号语句 labeled-statement: identifier : statement case constant-expression : statement default : statement
§1.1 什么是编译程序
三、表达式语句
expression-statement: expressionopt ;
if (condition) statement else statement switch (condition) statement
condition:
expression type-specifier-seq declarator = assignment-expression
§1.1 什么是编译程序
§2.3 程序语言的语法描述
(3)上下文无关文法的形式定义 一个上下文无关文法G为一四元式( VT , VN , S , P): ① VT:非空有限集, 元素为终结符, 表示单词; ② VN:非空有限集, 元素为非终结符, 表示语法单位; (VN∩VT=φ ) ③ S:开始符; ɑ , A∈VN, ④ P:产生式集( 有限), 元素形如A→ ɑ ∈( V ∪V )* ( S在某产生式左部至少出现一次) N T
编译原理02高级语言及其语法描述

无条件转移语句:goto L 条件语句:if B then S if B then S1 else S2 循环语句:while B do S repeat S until B for i:=E1 step E2 until E3 do S 过程调用语句:call P(X1,X2,…,Xn) 返回语句:return(E)
缩写形式:A α1|α2
26
若Aγ是一个产生式,且α,β∈(VT∪VN)*,则称αAβ直 接推出αγβ,即: αAβαγβ 如果α1α2 … αn,则称该序列是从α1到αn的一个 推导
若存在一个从α1到αn的一个推导,则称α1可推导出αn
+ 1 αn表示:从α1出发,经一步或若干步,可推导出αn
说明句 简单句和复合句
14
3 程序语言的语法描述
对于高级程序语言及编译程序而言,语言的语法定 义是非常重要的,下面将介绍语法结构的形式描述 问题 首先引入几个概念: 设是一个有穷字母表,它的每个元素称为一个 符号。 上的一个符号串是指由中的符号所构成 的有穷序列。不包含符号的序列称为空字,记为。 用*表示上的所有符号串的全体,空字也包括在 其中。如:若={a,b}则*={,a,b,aa,ab,bb, aaa,…}。表示不含任何元素的空集{}。这里要注 15 意、{}和{}的区别。
特点:注重功能 形式:
函数n(…函数2(函数1(数据))…)
例:LISP等
特点:条件满足时执行动作 形式:
条件1→动作1 条件2→动作2 …… 条件n→动作n
③ 基于规则的语言
例:Prolog等 特点:封装,继承,多态 例:JAVA,C++等
编译原理第二章

上一页
下一页
11
▪ 符号串的术语
设s是符号串 前缀:移走s的尾部的零个或多于零个符号 后缀:删去s的头部的零个或多于零个符号 子串:从s中删去一个前缀和一个后缀 子序列:从s中删去零个或多于零个符号(这些符号不要求是连续的) 逆转:将S中的符号按相反次序写出而得到的符号串。 长度:是该符号串中的符号的数目。例如|aab|=3,|ε|=0。 真前缀,真后缀,真子串: x≠sx ≠ 例子:符号串s=banana 前缀:,b,ba,ban,bana,banan,banana 后缀:banana,anana,nana,ana,na,a, 子串:banana,anana,banan,anan,…, 子序列: baa(这些符号不要求是连续的) 逆转(用SR表示):ananab 长度:banana=6
β ε +T +T +T
ε ε
上一页
下一页
23
3.3 最左推导与最右推导
对于推导αβ,如果每一步都是对α中的最左非终结符进行替换 的,则我们称这种推导为最左推导,如果每一步都是对α中的最 右非终结符进行替换的,则我们称这种替换为最右推导。
例2-2:对于文法:E→E+ E|E*E|(E)|i 我们看对于(i*i+i)的推导 最左推导:E (E) (E+E) (E*E+E) (i*E+E) (i*i+E) (i*i+i) 最右推导:E (E) (E+E) (E+i) (E*E+i) (E*i+i) (i*i+i)
编译原理第二章

2014年6月12日12时3分
2.2 高级语言的一般特性
高级语言的分类: (1)强制式的高级语言(也称过程式语言) 其特点是命令驱动,面向语句。一个强制式语言程序由一 系列的语名组成,每个语句的执行引起若干存储单元中的 值的改变。许多广为使用的语言,如FORTRAN、C、 PASCAL,ADA等等,属于这类语言。
2014年6月12日12时3分
语法分析树与二义性
用一张图表示一个句型的推导,这种表示称为语法分析树, 或简称语法树。语法树有助于理解一个句子语法结构的层 次。语法树的根结由开始符号所标记。随着推导的展开, 当某个非终结符被它的某个候选式所替换时,这个非终结 符的相应结就产生出下一代新结,候选式中自左至右的每 个符号对应一个新结,并用这些符号标记其相应的新结。 每个新结和其你结间都有一条连线。在一棵语法树生长过 程中的任何时刻,所有那些没有后代的端末结自左至右排 列起来就是一个句型。
人们已经证明,二义性问题是不可判定的。即,不存在一 个算法,它能在有限步骤内,确切地判定一个文法是否为 二义的。我们所能做的事是为无二义性寻找一组充分条件。
2014年6月12日12时3分
例如对于算术表达式文法G[E]关于(i*i+i)的语法树如下图 所示。 E
(
E E i * E i
E
+ E i
)
2014年6月12日12时3分
例如,字符串 0.5*X1+C 是一个表达式,其中常数0.5,标 识符X1和C,以及算符*和+称为语言的单词符号,而表达 式0.5*X1+C称为语言的一个语法单位,或语法范畴。 词法规则是指单词符号的形成规则。在现今多数程序语言 中,单词符号一般包括:关键字、标识符、运算符、界符 和常量等等。正规式和有限自动机理论是描述词法结构和 进行词法分析的有效工具。
编译原理课后答案

第二章 高级语言及其语法描述4.令+、*和↑代表加,乘和乘幂,按如下的非标准优先级和结合性质的约定,计算1+1*2↑2*1↑2的值:(1) 优先顺序(从高至低)为+,*和↑,同级优先采用左结合。
(2) 优先顺序为↑,+,*,同级优先采用右结合。
解:(1)1+1*2↑2*1↑2=2*2↑1*1↑2=4↑1↑2=4↑2=16 (2)1+1*2↑2*1↑2=1+1*2*1=2*2*1=2*2=46.令文法G6为 N →D|NDD →0|1|2|3|4|5|6|7|8|9 (1) G6 的语言L (G6)是什么?(2) 给出句子0127、34和568的最左推导和最右推导。
解:(1)L (G6)={a|a ∈∑+,∑=﹛0,1,2,3,4,5,6,7,8,9}}(2)N =>ND => NDD => NDDD => DDDD => 0DDD => 01DD => 012D => 0127 N => ND => N7=> ND7=> N27=> ND27=> N127=> D127=> 0127 N => ND => DD => 3D => 34 N => ND => N4=> D4 =>34N => ND => NDD => DDD => 5DD => 56D => 568 N => ND => N8=> ND8=> N68=> D68=> 5687.写一个文法,使其语言是奇数集,且每个奇数不以0开头。
解:A →SN, S →+|-|∑, N →D|MDD →1|3|5|7|9, M →MB|1|2|3|4|5|6|7|8|9 B →0|1|2|3|4|5|6|7|8|9 8. 文法:E T E T E T TF T F T F F E i→+-→→|||*|/()| 最左推导:E E T T TF T i T i T F i F F i i F i i i E T T F F F i F i E i E T i T T i F T i i T i i F i i i ⇒+⇒+⇒+⇒+⇒+⇒+⇒+⇒+⇒⇒⇒⇒⇒⇒+⇒+⇒+⇒+⇒+⇒+********()*()*()*()*()*()*()最右推导:E E T E TF E T i E F i E i i T i i F i i i i i E T F T F F F E F E T F E F F E i F T i F F i F i i i i i ⇒+⇒+⇒+⇒+⇒+⇒+⇒+⇒+⇒⇒⇒⇒⇒+⇒+⇒+⇒+⇒+⇒+⇒+**********()*()*()*()*()*()*()*()语法树:/********************************EE FTE +T F F T +iiiEEFTE-T F F T -iiiE EFT+T F FTiii*i+i+ii-i-ii+i*i*****************/9.证明下面的文法是二义的:S → iSeS|iS|I解:因为iiiiei 有两种最左推导,所以此文法是二义的。
my第02章-高级语言及其语法描述2

2012-3-20
邢静波
2.2 高级语言的一般特性
2.2节内容是对高级语言中为编译原理课程 节内容是对高级语言中为编译原理课程 所关心特性的总结( 所关心特性的总结(略)
2012-3-20
邢静波
14
2.3 程序语言的语法描述
对于高级程序语言及编译程序而言, 对于高级程序语言及编译程序而言,语言 的语法定义是非常重要的。 的语法定义是非常重要的。本节将介绍语 法结构的形式描述问题。 法结构的形式描述问题。 本节的学习特点: 本节的学习特点:
2012-3-20
邢静波
7
2.1.1 语法
语法规则: 语法规则:
规定了如何从单词符号来形成语法单位 现在多数程序语言使用上下文无关文法来描述 语法规则 语言的词法规则和语法规则定义了程序的形式 结构, 结构,是判断输入字符串是否构成一个形式上 正确的程序的依据
2012-3-20
邢静波
8
2.1.1 语法
例如: music其语法规则如下 其语法规则如下: 例如:Young men like pop music其语法规则如下: <句子 句子>→<主语 谓语 主语><谓语 句子 主语 谓语> <主语 主语>→<形容词 名词 形容词><名词 主语 形容词 名词> <谓语 谓语>→<动词 宾语 动词><宾语 谓语 动词 宾语> <宾语 宾语>→<形容词 名词 形容词><名词 宾语 形容词 名词> <形容词 形容词>→Young|pop 形容词 <名词 名词>→men|music 名词 <动词 动词>→like 动词
同济大学编译原理 第二章 高级语言及其语法描述资料

词法规则是指程序中单词符号的形成规则。单词符号一般包括: 标识符、基本字、常量、算符和界符。 语法规则是指程序中语法单位的形成规则。程序语言的语法单位 有:表达式、语句、分程序、过程、函数、程序。
描述方式:词法规则和语法规则都可以用自然语言、语法 图、BNF范式、或文法等描述。
语法描述方式(1)
(3)BNF范式
巴科斯范式(BNF: Backus-Naur Form 的缩写)是由 John Backus 和 Peter Naur 首先引入的用来描述计算机语言语法的符 号集。
现在,新的编程语言几乎都使用巴科斯范式来定义编程语言的语 法规则。
简单算术表达式的BNF范式
<简单表达式>∷=<简单表达式>+<简单表达式>
特点
一对应
定位 低级语言,极少 使用
用方便
低级语言,很 少使用
高级语言,种类多, 常用
程序语言的内涵
语法 表示构成语言句子的各个记号之间的 组合规律(构成规则)。
表示按照各种表示方法所表示的各个 记号的特定含义(各个记号和记号所 表示的对象之间的关系)。 表示各个记号或语言词句与其使用之 间的关系。
高级语言 汇编语言 机器语言
各级语言的比较
比较 硬件识别 是否可直接 执行 机器语言 是唯一可以识别 的语言 可直接执行
面向机器 占用内存少 执行速度快 使用不方便
汇编语言 不可识别
高级语言 不可识别
不可,需汇编、 不可,需编译/解释、 连接 连接
面向机器 占用内存少 执行速度快 较为直观 与机器语言一 面向问题/对象 占用内存大 执行速度相对慢 标准化程度高 便于程序交换,使
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
语法规则:语法单位的形成规则。 语法规则:语法单位的形成规则。
语法单位通常包括:表达式、语句、分程序、过 程、函数、程序等; 描述工具:上下文无关文法
E→i E→E+E E→E*E E→(E) 语法规则和词法规则定义了程序的的形式 结构。定义语法单位的意义属于语义问题。
二.语义
语义: 语义
一组规则,用它可以定义一个程序的意义。
标识符与名字
标识符:
以字母开头的,由字母数字组成的字符串。
标识符与名字两者有本质区别:
标识符是语法概念 名字有确切的意义和属性
Jordan ?
标识符!
?
?
标识符与名字
名字:
值:单元中的内容 属性:类型和作用域
名字的性质的说明方式:
由说明语句来明确规定。 隐含说明:FORTRAN 以I,J,K,…N为首的名字代 表整型,否则为实型。 动态确定:走到哪里,是什么,算什么。
2.2 高级语言的一般特性
2.2.1 高级语言的分类
基于规则的语言(Rule-based Language): 检查一定的条件,当它满足值,则执行适当 的动作。
Prolog
面向对象语言(Object-Oriented Language):封装性、继承性和多态性
Smalltalk,C++, Smalltalk,C++,Java
CONSPART = a −C C = d2 Ldn + d3 Ldn +L+ dn +1 VARPART = i1d2 Ldn + i2d3 Ldn +L+ in−1dn + in = (L((i1d2 + i2 )d3 + i3 )Lin−1)dn + in
内情向量
把数组的有关信息记录在一个“内情向量” 中,每个数组的内情向量必须包括:维数, 各维的上、下限,首地址,以及数组(元 素)的类型。
l1 l2 … ln n type u1 u2 … un C a d1 d2 … dn
2 记录
逻辑上说,记录结构由已知类型的数据组合在 一起的一种结构。
record { char NAME[20];
integer AGE; bool MARRIED; } CARD[1000]
访问:复合名 CARD[k].NAME 存储:连续存放 域的地址计算:相对于记录结构起点的相对数 OFFSET。
作用域:一个名字能被使用的区域范围称作这 个名字的作用域。 允许同一个标识符在不同的过程中代表不同的 名字。 名字作用域规则--"最近嵌套原则" 一个在子程序B1中说明的名字 只在B1中 中说明的名字X只在 一个在子程序 中说明的名字 只在 中 有效(局部于B1); 有效(局部于 ); 如果B2是 的一个内层子程序且 的一个内层子程序且B2中对标 如果 是B1的一个内层子程序且 中对标 识符X没有新的说明 则原来的名字X在 没有新的说明, 识符 没有新的说明,则原来的名字 在B2 中仍然有效。如果B2对 重新作了说明 重新作了说明, 中仍然有效。如果 对X重新作了说明,那 么,B2对X的任何引用都是指重新说明过的 对 的任何引用都是指重新说明过的 这个X。 这个 。
程序设计语言对抽象数据类型的支持
Ada语言通过程序包(package)提供了数据封装的 支持 Smalltalk、C++和Java语言则通过类(Class)对抽 象数据类型提供支持。
2.2.4 语句与控制结构
一.表达式
表达式由运算量(也称操作数,即数据引用或 函数调用)和算符(操作符)组成。 形式:中缀、前缀、后缀 X*Y -A P↑ 表达式形成规则
第二章
高级语言及其语法描述
数值计算 事务处理 结构程序设计 大型程序、嵌入式实时系统 逻辑程序设计 算法语言 系统程序设计 Internet程序设计
常用的高级语言
FORTRAN COBOL PASCAL ADA PROLOG ALGOL C/C++ Java
与机器语言或汇编语言比较,高级语言的优 点:
字符串、表格、 3 字符串、表格、栈
字符串:符号处理、公式处理 表格:本质上是一种记录结构 线性表:一组顺序化的记录结构 栈:一种线性表,后进先出,POP, PUSH
三. 抽象数据类型
一个抽象数据类型包括:
数据对象的一个集合; 作用于这些数据对象的抽象运算的集合; 这种类型对象的封装,即,除了使用类型中所定义的 运算外,用户不能对这些对象进行操作。
2.2 高级语言的一般特性
2.2.2 程序结构 FORTRAN
一个程序由一个主程序段和若干辅程序段组成。 辅程序段可以是子程序、函数段或数据块。 每个程序段有一系列的说明语句和执行语句组 成。各段可以独立编译。 模块结构,没有嵌套和递归。 各程序段中的名字相互独立,同一个标识符在 不同的程序段中代表不同的名字。
循环语句 while B do S repeat S until B for i:=E1 step E2 until E3 do S 过程调用语句 call P(X1, X2, ... ,Xn)
返回语句 return (E)
说明语句:
定义各种不同数据类型的变量或运算,定义名 字的性质。
简单句和复合句
程序的层次结构
程序 | 子程序或分程序、过程、函数 | 语句 | 表达式 | 数据引用 算符 函数调用
程序语言每个组成成分的逻辑和实现意义
抽象的逻辑的意义
数学意义
计算机实现的意义
具体实现
2.2 高级语言的一般特性
2.2.1 高级语言的分类
强制式语言(Imperative Languge)也称过程 式语言:命令驱动,面向语句 FORTRAN、 Pascal, FORTRAN、C、Pascal,Ada 应用式语言(Applicative Language):注 重程序所表示的功能,而不是一个语句接一 个语句地执行 LISP、 LISP、ML
描述方法:
自然语言描述:隐藏错误、二义性和不完整性 形式描述:
操作语义(PL/1) 操作语义(PL/1) 指称语义(ADA) 指称语义(ADA) 代数语义(PASCAL) 代数语义(PASCAL)
三.程序语言的基本功能和层次结构
程序语言的基本功能:
描述数据和对数据的运算。
所谓程序,本质上说是描述一定数据的处理 过程。
较接近于数学语言和工程语言,比较直观、自 然和易于理解; 便于验证其正确性,易于改错; 编写效率高; 易于移植。
2.1 程序语言的定义
程序语言是一个记号系统。 程序语言由两方面定义:
语法 语义
语用
一. 语法
程序本质上是一定字符集(字母表) 程序本质上是一定字符集(字母表)上 的字符串。 的字符串。 语法: 语法:
主程序 PROGRAM … … end 辅程序1 辅程序1 SUBROUTINE … … end 辅程序2 辅程序2 FUNCTION … … end
PASCAL
PASCAL程序本身可以看成是一个操作系统所 调用的过程,过程可以嵌套和递归。 一个PASCAL过程:
过程头; 过程头; 说明段(由一系列的说明语句组成); 说明段(由一系列的说明语句组成); begin 执行体(由一系列的执行语句组成); 执行体(由一系列的执行语句组成); end
算符的优先次序
一般的规定
PASCAL:左结合A+B+C=(A+B)+C FORTRAN:对于满足左、右结合的算符可任取 一种,如A+B+C就可以处理成(A+B)+C,也可以 处理成A+(B+C)。
注意两点:
代数性质能引用到什么程度视具体的语言不同 而不同; 在数学上成立的代数性质在计算机上未必完全 成立。
B(bool)
PASCAL提供了丰富的数据类型和运算方 式,它允许用户动态地申请和退还存贮 空间。
ADA
引入程序包(package):把数据和操作代码封装 在一起,支持数据抽象。 一个程序包分为两部分:
可见的规范说明部分, 可见的规范说明部分,它定义了程序包外面可以访 问的对象。 问的对象。 程序包体,它实际定义程序包的实现细节。 程序包体,它实际定义程序包的实现细节。
简单句:不包含其他语句成分的基本句 复合句:句中有句的语句
小结: 小结:程序语言的定义
程序语言由两方面定义:
语法:一组规则,用它可以形成和产生一个合式 (well-formed)的程序
2.2.3 数据类型与操作
一个数据类型通常包括以下三种要素:
用于区别这种类型数据对象的属性 属性 这种类型的数据对象可以具有的值 值 可以作用于这种类型的数据对象的操作 操作
2.2.3 数据类型与操作
一.初等数据类型
数值类型:整型、实型、复数、双精度,
运算:+,-,*,/等 运算:
逻辑类型:布尔运算:∨,∧,┑ 字符类型:符号处理 指针类型
A(real) A(integer) B(real) program main var A, B : real; … procedure P1 var B:boolean; … begin … end procedure P2 var A:integer; … begin … end begin … end
二.数据结构
1.数组 逻辑上, 逻辑上,数组是由同一类型数据所组成的 某种n维矩形结构,沿着每一维的距离, 某种n维矩形结构,沿着每一维的距离,称 下标。 为下标。
数组可变与不可变:编译时能否确定其存贮空 间的大小。 访问:给出数组名和下标值 存放方式: 按行存放,按列存放
数组元素地址计算
数组A[10,20]的A[1,1]为a,各维下标为1, 按行存放,那么A[i,j]地址为: a+(i-1)*20+(j-1) 数组元素地址计算公式