(编译原理)讲义
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第一章概述
计算机由硬件和软件组成,软件又包括程序设计语言、系统软件和应用软件,而编译系统属系统软件。
最早人们只能使用计算机可直接接受的机器语言,到1956年,在IBM704计算机上构造了第一个FORTRAN编译程序,使人们从繁重的机器语言程序设计中解放出来。
计算机是一种逻辑电子装置,它只能接受二进制数,要使得计算机接受高级语言程序,就要借助于编译程序将高级语言程序翻译成机器可接受的机器语言。
§1编译程序和解释程序:
要在计算机上实现除机器语言之外的任一程序设计语言,就首先应使此语言为计算机所“理
解”。
解决这一问题的方法有两种:一种是对程序进行翻译;另一种是对程序进行解释。
翻译程序:①汇编程序
②编译程序
翻译程序:是把一种语言编写的程序翻译成等价的另一种语言的程序;前一种语言称为源语言,后一种语言称为目标语言;
根据源语言和目标语言的不同,有各种不同的翻译程序:
汇编程序:若源语言是汇编语言,目标语言是机器语言,这种翻译程序称为汇编程序。
编译程序:若源语言是高级语言,而目标语言是某计算机的汇编语言或机器语言,这种翻译程序称为编译程序。
解释程序:它以用该语言编写的源程序作为输入,但不产生目标程序,而是按照源语言的定义边解释边执行源程序本身。
通常的编译程序是先将源程序比较简单地翻译成某种中间形式的程序,然后再对这种中间形式进行解释;这种中间形式的语言有多种:波兰表示、三元组、四元组、树、伪代码等。
编译程序和解释程序相比,解释程序的执行效率比较低,但占用时间较少。
§2编译程序的组成部分:
编译程序将首先根据源语言的定义来对源程序进行分析,之后进行综合,并从而得到与源程序等价的目标程序;
分析:对源程序进行结构分析和语义分析;
综合:创建出与源程序等价的目标程序;
结构分析:①词法分析
②语法分析
综合:①中间代码生成
②代码生成
每一个编译程序一般都要做以下几个方面的工
作:
①词法分析
②语法分析
③语义分析
④中间代码生成
⑤代码生成
⑥代码优化
目标程序
图1。
1编译程序的基本组成
在编译过程中,要从头到尾扫视源程序或其内部表示(等价的中间语言程序)。
每扫视一遍称为一趟扫描。
如果经过一趟扫描就能生成目标代码,这样的编译程序称为一趟扫描的编译程序,否则称为多趟扫描的编译程序。
下图是一个不带代码优化的五趟扫描的编译程序的实现方案:
编译程序总控
中间语言3,表
图1。
2不带代码优化的五趟扫描
的编译程序的实现方案目标代码
这个五趟扫描的编译程序工作过程如下:首先,编译程序的主程序调用词法分析程序,词法分析程序把源程序作为输入,将它转换为一种内部表示,称为中间语言1,并得到有关的一些表;然后,主程序调用语法分析程序,语法分析程序把中间语言1作为输入,进行语法分析,并转换为中间语言2;。
;最后,主程序调用目标代码生成程序,把中间代码(可看作为一种理想机代码)作为输入,并转换为目标代码。
对于一趟扫描的编译程序,程序本身紧凑,编
译程序快;
对于多趟扫描的编译程序,它的功能块清晰,占用内存器少(重叠使用内存)。
1、词法分析:词法分析程序又称扫描程序;主要
任务是从构成源程序的符号串中识别出一个
个具有独立意义的最小单位——单词,并把需
要存放的单词放到符号表中;词法分析是一种
线性分析;
例1:对赋值语句a:=b+c*d进行词法分析,得到以下的结果:
单词类别值单词自身值
(1)标识符(IDENT) a (2)赋值号(BECOMES):= (3)标识符(IDENT) b (4)加号(PLUS)+ (5)标识符(IDENT) c
(6)乘号(TIMES)* (7)标识符(IDENT) d (8)分号(SEMICOLON);
识别标识符要根据词法规则。
例如:标识符的词法规则是以字母开头的字母数字序列。
在扫描源程序时,当遇到第一个字母之后继续扫描,直到发现既不是字母也不是数字时可以确定,从第一个字母到最后一个字母或数字的字符串构成一个标识符(或保留字)。
在词法分析过程中,通常要跳过空格,不做任何处理。
2、语法分析:是编译程序的主要组成部分,它的
任务是根据语言的语法规则进行语法分析,即
按照语法规则识别源语言中的单词序列所构
成的句子。
它是一种层次结构的分析。
例:对赋值语句:a:=b+c*d进行语法分析得到如下图所示的层次结构:(语法树)
赋值语句
标识符:= 表达式
a 表达式+ 表
达式
标识符表达式* 表达式
标识符标识符
c
d
图1。
3语句a:=b+c*d的语法树语法树的层次结构可以用递归规则来表示,例如可以用下列规则递归地定义语句:
(1)如果identifier1是一个标识符,expression2是一个表达式,则identifier1:= expression2是一个语
句;
(2)如果expression1是一个表达式,statement2是一个语句,则while(expression1) do statement2
(递归定义)
if (expression1) then statement2 (递归定义)
都是语句;
语法分析的输入是单词(词法分析的结果),语法分析的输出是确定该语句的类型。
例2:对条件语句:IF a>0 THEN b:=a*(i1+5)进行语法分析。
①词法分析的结果如下:
单词类别值单词自身值
(1)保留字(IFSYM)IF
(2)标识符(IDENT) a (3)大于号(GTR)>(4)数字(NUMBER)0 (5)保留字(IFSYM)THEN (6)标识符(IDENT) b (7)赋值号(BECOMES):= (8)标识符(IDENT) a (9)乘号(TIMES)* (10)左括号(LPAREN)((11)标识符(IDENT)i1 (12)加号(PLUS)+ (13)数字(NUMBER) 5 (14)右括号(RPAREN))
②语法分析的结果:
(1)条件语句(ifstmt)
(2)赋值语句(assignstmt)
3、语义分析:用来规定源程序各语法成分的含义
和功能,即规定它们的属性或执行时应进行的运算或操作;
在进行语义分析的过程中,还应进行相应的语义检查,以保证源程序在语义上的正确性。
例如:在说明语句中是否有矛盾的类型说明;在表达式中,对某些运算符而言,是否有类型不匹配的运算对象。
语法分析和语义分析是不同的概念,但二者又是紧密相结合的。
语义分析的任务:
(1)表达式的语义分析的任务是确定表达式的类型;
(2)I F语句的语义分析主要是分析IF后的表达式的类型是否是布尔类型;
(3)在自定义过程的过程语句和自定义函数的命名符的语义分析中,要检查实参和
形参是否匹配。
4、中间代码生成:将源程序翻译成某种中间代
码,中间代码应当是易于生成的,且易于翻译
成目标代码。
中间代码有多种:三元组、四元
组、树、波兰表示、伪代码。
例4:将赋值语句:a:=b+c*d翻译成等价的用三元组、四元组、伪代码。
(1)四元组:(*,c,d,T1)
(+,b,T1,T2)
(:=,T2,,a)
(2)三元组:(1)(*,c,d,)
(2)(+,b,(1))
(3)(:=,(2),a)
(3)伪代码:LOD 0 4 ;取b
LOD 0 5 ;取c
LOD 0 6 ;取d
OPR 0 4 ; 乘操作c*d
OPR 0 2 ; 加操作b+c*d
STO 0 3 ; 存入a单元
5、代码生成:把源程序的中间代码真正翻译成汇
编语言程序或机器语言程序;
6、代码优化:主要任务是使编译程序能产生更有
效的目标程序,即尽量压缩目标程序运行时间和所占用的存储空间。
衡量目标程序质量的两个标准:
①目标程序所占用存储空间的大小,即空间指标
㈩
②目标程序运行时所需的时间,即时间指标;
第二章文法与形式语言简介
要构造程序设计语言的编译程序,首先要对程序设计语言本身有较为精确的描述,即对语言进行形式化的描述。
所谓形式化的方法,便是用一整套有严格规定的符号体系来描述问题的理论或方法。
所以对语
言正确的形式化的描述是设计一种语言的编译程序的理论基础。
有关集合、关系的概念在离散数学中已经介绍过,这里就不再重复。
§1符号串:
1、字母表:元素的非空有穷集合;
例:英文字母表{a,b,c,d,e,……x,y,z}=A
阿拉伯数字表{0,1,2,3,4,5,6,7,8,9}=B 2、符号:字母表中的元素;
符号是字母表中不再分解的最小元素;3、符号串:字母表中的符号所组成的任何有穷序列;例:B={0,1,2,3,4,5,6,7,8,9}
符号:0、2、3、4、5、6、7、8、9 (共10个)符号串:12、15、123 、146、189、1012 (无穷多个)
4、空符号串:不包含任何符号的符号串,用ε表示;
5、符号串的长度:符号串x中所含符号的个数,用|x|
表示;
6、符号串联结:设有符号串x 和y ,把y 的符号写在x 符号的后面所得的符号串,叫做x 与y 的联结,记做xy;
例:x=12 y=15 ,则xy=1215
7、符号串的方幂:设有符号串x ,则x 的n 次联结称为x 的n 次方幂,记作 n x xx x =2,xxx x =3 ==x xx x n ...=-x x n 11-n xx =0x ε
8、符号串的头和尾:对于符号串z=xy,x 是z 的头,y 是z 的尾;若y ≠ε,则x 是z 的真头(固有头,真前缀);若x ≠ε,则y 是z 的真尾(固有尾,真后缀);
9、符号串集合A 与B 的乘积:设A 和B 为符号串集合,则A 和B 的乘积定义为:AB={xy|x ∈A ∧y ∈B}
例:A={1,2} B={a,b} 则AB={1a,1b,2a,2b}
10、 符号串集合的方幂:设有符号串集合A ,则定义: {
0=A ε},
A
A =1,AA A =2,
A A AA A n ==...=-1n A A A n 1-
例:A={1,2}
2A =AA={11,12,21,22}
=3A =A A 2{111,112,121,122,211,212,221,222}
11、 符号串集合的正闭包+
A :
设A 为符号串集合,则定义A 的正闭包+A 为: +A =A ∪2A ∪3A ……n A ∪…… 12、集合A 的闭包*
A =0A ∪+A ={ε}∪+A
§2文法和语言的形式定义:
为使源程序能被正确翻译,产生等价的目标程序,要遵守该程序设计语言的语法规则.下面介绍一种描述语法规则的一种形式化的方法——BNF(巴科斯范式),采用BNF 可以用简洁的公式把各种语法规则严格
而清晰地描述出来.
例如:描述源语言的逻辑值true和false,用BNF表示如下:
<逻辑值>::= true | false
其中:逻辑值用尖括号括起来,表示它是需要加以说明的一种语法上的概念(语法成分或非终结符); ::=可读作”定义为”,”可以是”;
竖线”|”可读作为”或者是”;
以上的语法成分我们采用的是枚举的方法.但多数的语法成分用枚举的方法是无法描述的,例如标识符,因为标识符是以字母开头的字母数字序列(任意组合) <标识符>::=<字母>
<标识符>::=<标识符><字母>
<标识符>::=<标识符><数字>
或: <标识符>::=<字母>|<标识符>::=<标识符><字母>|<标识符>::=<标识符><数字>
<字母>::=A|B|C|……|X|Y|Z
<数字>::=0|1|2|3|4|5|6|7|8|9
1、规则(产生式):规则是一有序对(U,x),常写
作:U::=x(或U→x)
其中符号U是规则的左部;符号串x(非空)是规则
的右部,上式表示左部由右部构成或由右部定义.
2、文法G[Z]:规则的非空有穷集合;其中符号Z称
为文法的识别
符号(开始符号),它至少要在一条规则中作为左部
出现。
用规则左部和右部中的所有符号形成的集合
称为字汇表V。
3、非终结符号:规则左部出现的符号,非终结符号
所形成的集合表
示为
V;通常用大写的英文字母表
N
示;
4、终结符号:规则中那些不属于集合
V的符号,他
N
们形成的集合用
T V 表示;V=N V ∪T V 且N V ∩T V =Φ 通常将文法G 描述为四元组G=( N V ,T V ,P ,Z )
其中 N V :非终结符集合; T V :终结符集合; P :规则集合; Z :识别符号;
例:描述算术表达式的文法G G=( N V ,T V ,P ,Z )
其中:N V ={〈表达式〉,〈项〉,〈因子〉} T V ={a,+,*,(,)}
P :〈表达式〉::=〈表达式〉+〈项〉+|〈项〉 〈项〉::=〈项〉* 〈因子〉|〈因子〉 〈因子〉::=(〈表达式〉)|a Z :〈表达式〉
用E 表示〈表达式〉;用T 表示〈项〉; 用F 表示〈因子〉;
P :E ::=E+T|T
T ::=T*F|F
F ::=(E )|a
G=( N V ,T V ,P ,Z )
其中:N V ={E ,T ,F};T V ={a,*,+,(,)}
有了文法以后,如何说明一个给定的符号串是否是满足该文法的规则,或者说能否由该文法产生给定的符号串,这就引导出了推导的概念。
例:a+(a*a)
E →E+T →T+T →F+T →a+T →a+(T*F) →a+(F*F) →a+(a*F) →a+(a*a)
a+(a*a)是表达式
5、 直接推导:如果U ::=u 是文法G 中的一条规则,而x,y
是*V 中的任一符号串,则将规则U ::=u 用于符号串 v=xUy 上得到符号串w=xuy ,记为:xUy →xuy(v →w) 这时称符号串w=xuy 是符号串v=xUy 的直接推导, 或称w 直接规约为v 。
由于x,y 均可为空,所以对于文法中每一条规则U ::=u
均可得到直接推导U →u 。
※简单说直接用规则的右部代替规则的左部(或者说将
字符串中的非终结符号用其对应的规则右部来代替)
例:文法 G={ N V ,T V ,P ,E}
P :E ::=E+T|T ,T ::=T*F|F ,F ::=(E )|a
则可以得到如下一些直接推导:
因为每一条规则U ::=u 均可以得到直接推导U →u ,所 以:E →E+T (x=y=ε,利用E ::=E+T )
E →T (x=y=ε,利用E ::=T )
T →T*F (x=y=ε,利用T ::=T*F )
T →F (x=y=ε,利用T ::=F )
F →(E )(x=y=ε,利用F ::=(E )
F →a (x=y=ε,利用F::=a )
E+T →T+T (x=ε,y=+T, 利用E ::=T )
E+T →E+T*F (x=E+,y=ε, 利用T ::=T*F )
E+T →E+F (x=E+,y=ε, 利用T ::=F )
6、 推导(长度为n ):设,0u 1u ,……,n u (n>0)均为*V 中的
符号串,且有:v=0u →1u →……1-n u →n u =w
则称以上序列是长度为n 的推导,也称v 产生w(或w 规 约到v),记为v →+w ,如果v →+w 或v=w (表示0步推 导),则记为v →*w
例:P :E ::=E+T|T ,T ::=T*F|F ,F ::=(E )|a
则E −→−+T+T*(T)为长度为5的推导
因为E →E+T →E+T*F →E+T*(E )→E+T*(T )→T+T*(T ) ↓ ↓ ↓ ↓ ↓ ↓ v (0u ) 1u 2u 3u 4u 5u (w )
7、 句型:设有文法G[Z],如果有Z −→
−*x,x ∈*V ,则称符号串x 为文法G[Z]的句型,即凡是由识别符号推导出来的任意符号串叫做句型。
8、 句子:仅由终结符号所组成的句型叫句子;
例:E −→−+T+T*(T )→F+T*(T )→a+T*(T) →a+F*(T) →a+a*(T) →a+a*(F) →a+a*(a)
所以a+a*(a)为文法的句子。
9、 语言L (G[Z]):由文法G[Z]所产生的所有句子所组成
的集合,即L (G[Z])={x|Z −→−+x ,x ∈+T V
注意:属于+T V 的符号串x,不一定属于L (G ),它一定要满足能由识别符号推导出来,所以L (G )⊆ +T V
句子、句型、语言三个概念要搞清楚。
句型可以含有终结符和非终结符,而句子只能含有终结符,所以是句子一定是句型,而是句型却不一定是句子;而语言则是由所有的句子所组
成的集合。
例:文法:S ::= x A
A::=z|y A
其中:N V ={S ,A},T V ={x,y,z},S 为识别符号
S →x A →xz
S →x A →xyA →xyz
S →x A →xyA →xyyA →xyyz
……
第一个符号为x,最后一个符号为z,中间任意个(可以 为0个)y 的符号串都是文法G (S )产生的句子。
这个文法只有三个规则,却能产生无穷多个句子,即 有限的产生式可以定义无穷的语言。
在规则A ::=y A 中左部和右部均出现非终结符号A — —递归,只有借助于递归才能用有限的文法定义无穷的 语言。
10、 短语:设有文法G[Z],w=xuy 是它的一个句型,如 果有:
Z −→−*x U y 且U −→−+u
则称句型xuy 中的子串u 为句型xuy (相对 于非终结符号U )的短语;
特别地:若U →u ,则称u 为句型xuy 的简单短 语;
解释:Z −→−*x U y −→−+xuy U ∈N V ,x,y,u 是符号
串
因为U →u,所以简单短语一定是规则的右部;.............
11、句柄:句型的最左简单短语称为句柄;
例:设有关于表达式的文法G[E]
(1) E ::=E+T
(2) E ::=T
(3) T ::=T*F
(4) T ::=F
(5) F ::=(E)
(6) F ::= i
试求句型F*F*(T+T* i )的短语、简单短语和句柄;
解:其实求短语的过程就是寻找该句性所有可能的推导的过程。
1. E −→−)2(T −)3(T*F −)3(T*F*F −→−)4(F*F*F −→−)5(F*F
*(E )−→−)1(F*F*(E+T )−→−)2(F*F*(T+T )−→−)3(F*F*
(T+T*F )−→−)6(F*F*(T+T* i )
①因为F−→
−i
所以i 是句型F*F*(T+T* i)相对于非终结符F的短
语,且为简单短语;
这里x= F*F*(T+T* , y=), U=F, u=i
②因为T→T*F→T*i
所以T*i是句型F*F*(T+T* i)相对于非终结符
T的短语;
这里x= F*F*(T+ ,y=),U=T,u=T* i
③因为E→E+T→T+T→T+T*F→T+T*i
所以T+T*i是句型F*F*(T+T* i)相对于非终结符E
的短语;
这里x= F*F*(,y=),U=E,u=T+T* i
④因为F→(E)→(E=T)→(T+T)→(T+T*F)→(T+T*i)所以(T+T*I)是句型F*F*(T+T* i)相对于非终结符F
的短语;
这里x= F*F*,y=ε,U=F,u=(T+T* i)
−+F*F*(T+T*i)
⑤因为T−→
所以F*F*(T+T*i)是句型F*F*(T+T* i)相对于非终
结符T和E的短语;
这里x=ε, y=ε,U=T,u=F*F*(T+T* i)
这只是一种推导求出的短语和简单短语,另外还有多种方法可以推导出该句性,并求出其它的短语和简单短语。
2.第二种推导:E→T→T*F→T*(E)→T*(E+T)
→T*(E+T*F)→T*(E+T*i)
→T*(T+T* i)→T*F*(T+T*i)
→F*F*(T+T*i)
①F是句型F*F*(T+T* i)相对于非终结符T的短语;
且是简单短语和句柄;
这里x=ε, y=*F*(T+T* i),E−→
−+T*F*(T+T*i),T→F
②F*F是句型F*F*(T+T* i)相对于非终结符T的短
语;
−+F*(T+T*i),这里x=ε, y=*(T+T* i),E−→
T→F*F
3.第三种推导:E→T→T*F→T*(E)→F*F*(E)
→F*F*(E+T)→F*F*(E+T*F)
→F*F*(E+ T*i)→F*F*(T+ T*i)
①T是句型F*F*(T+T* i)相对于非终结符E的短语;
且是简单短语;
这里x= F*F*(,y=+T* I,E−→
−+F*F*(E+T*i),E→T 以后会介绍利用语法树求短语的方法,简单且明了。
12、最左(右)推导:在任何一步推导v→w中,都是
对符号串v的最左(右)非终结符号进行替换,则称最左(右)推导;最右推导又称规范推导;
13、规范句型:由规范推导所得的句型称为规范句型;
14、规范规约:规范推导的逆过程称规范规约;
15、规则左递归:规则呈U::=U…形式;如T::=T*F
16、规则右递归:规则呈U::=…U形式;
17、文法左递归:如果有推导U−→
−+U…
18、文法右递归:如果有推导U−→
−+…U
例:A::=Ba,B::=Ab
则A→Ba→Aba,所以这是个左递归的文法
§3与文法有关的一些关系和集合:
1、头符号集(HEAD(U)):HEAD(U)={S|U−→
−+S…},
其中U ∈N V ,S ∈V
利用此定义来求头符号集是比较困难的,下面给出一种利用集合V 上的First 关系,求HEAD (U )的方法。
关系FIRST 的定义如下:
U FIRST S <=>存在规则U ::=S …
则HEAD (U )={S|(U ,S )∈+FIRST },其中+FIRST 为可传递闭包;
证明:∵(U ,S )∈+FIRST ,且+FIRST 为FIRST 关系上的可传递闭包;
∴+FIRST 关系是可传递的;
则一定存在一个序列1S ,2S ,……1-n S 使得:
(U ,1S )∈FIRST ,(1S ,2S )∈FIRST ,(1-n S ,S )∈FIRST 成立;
由关系FIRST 的定义可知:
U ::=1S ……,1S ::=2S ……,1-n S ::=S ……
∴U −→−
+S … 反之成立;
∴U +FIRST S 〈=〉U −→−
+S … 利用FIRST 关系求HEAD (U )的步骤:
①求FIRST 关系:根据U FIRST U 〈=〉U ::=S …
②求+FIRST 关系:根据+FIRST =FIRST ∪2FIRST ∪3FIRST …
③求HEAD (U ):根据HEAD (U )={S|(U ,S )∈+FIRST }
例:已知G=({A,B,C,D},{c,d,e,f},P,A)
P:A::=Af|B
B::=Ddc|De
C::=e
D::=Bf
求HEAD(A),HEAD(B),HEAD(C),HEAD(D)解:①求FIRST关系:
∵A::=Af ∴(A,A)∈FIRST
∵A::=B ∴(A,B)∈FIRST
∵B::=Ddc ∴(B,D)∈FIRST
∵B::=De ∴(B,D)∈FIRST
∵C::=e ∴(C,e)∈FIRST
∵D::=Bf ∴(D,B)∈FIRST
∴FIRST={(A,A),(A,B),(B,D),(C,e),(D,B)}
②求
FIRST关系:
2
FIRST={(A,A),(A,B),(A,D),(B,B),(D,D)} 3
FIRST={(A,A),(A,B),(A,D),(B,D),(D,B)} 4
FIRST={(A,A),(A,B),(A,D),(B,B),(D,D)}
5FIRST ={(A ,A ,
),(A ,B ),(A ,D ),(B ,D ),(D ,B )}=3FIRST
6FIRST =4FIRST
∴+FIRST =FIRST ∪2FIRST ∪3FIRST ∪4FIRST ∪
5FIRST ={(A ,A )
,(A ,B ),(A ,D ),(B ,B ),(B ,D ),(C ,e ),(D,B),(D,D)}
③∴HEAD (A )={A ,B ,D}
HEAD (B )={B ,D}
HEAD (C )={e}
HEAD(D)={B,D}
2、 尾符号集(TAIL (U )):TAIL (U )={S|U −→−
+…S},其中U ∈N V ,S ∈V
同求HEAD (U )相类似可以利用集合V 上的LAST 关系,求尾符号集TAIL ;
LAST 关系定义为U LAST S <=>存在规则U ::=…S 同理:LAST (U )={S|(U ,S )∈+LAST },
利用LAST 关系求TAIL (U )的步骤:
① 求LAST 关系:根据U LAST U 〈=〉U ::=…S
② 求+LAST 关系:根据+LAST =LAST ∪2LAST ∪3LAST … ③ 求TAIL (U ):根据TAIL (U )={S|(U ,S )∈+LAST }
§4文法的其它表示方法:
一、扩充的BNF:
1、花括号{ }:可以消除左递归;
在BNF表示方法中,为了表示一串任意个数的元素,唯一的方法是通过递归定义,
例如:
〈整数〉::=〈数字〉|〈整数〉〈数字〉
中含有左递归,如果采用花括号就可以消除这个左递归;〈整数〉::=〈数字〉{〈数字〉}
而{〈数字〉}的意思是〈数字〉出现0次或多次;
2、方括号[ ]:表示可供选择的符号串;
[x]=ε或x
3、圆括号:提因子;
利用圆括号,提出个选择规则中可能出现的一些公共因子。
例:X::=Xa|Xb
在两条规则Xa,Xb中,第一个符号均为X,可将公共因子提出来,即X::=X(a|b)
二、语法图:
语法图的构造方法:
1、规则中的终结符号a,在语法图中用
表示;
2表示;
2、规则U ::=
4、形如x=
5、形如x={y}的x 如下图所示:
例:试对如下扩充BNF 描述的文法G[A]
A ::=[B][C][D]
B ::=bc{c}
C ::=d(A|c)
D ::=d{A}b
构造其相应的语法图。
①A ::=[B][C][D]
②B ::=bc{c}
③C ::=d(A|c)
④D ::=d{A}b
§5文法的分类:
0型文法,1型文法,2型文法,3型文法
1、 0型文法(无限制文法):如果文法G 中的规则呈如下形式: u::=v (u ∈ V ,v ∈*V ),则称G 为0型文法;由0型文法产生的语言称为0型语言。
0型文法对其规则没有什么限制。
2、 1型文法(上下文有关文法):如果文法G 中的规则呈如下
形式:xUy ::=xuy (U ∈N V , u ∈+V ,x,y ∈*V ),则称G 为1型文法;由1型文法产生的语言称为1型语言。
由于利用规则将U 替换成u 时,必须考虑U 的上下文x,y 的情况,所以也称上下文有关文法。
1型文法的另一种定义方法:u::=v ,而|u|≤|v|,即规则右部符号的个数至少要和左部符号个数一样多
例:文法G[S]:
(1) S ::= a S B C
(2)S ::= a B C
(3)CB::=BC
(4)aB::=ab
(5)bB::=bb
(6)bC::=bc
(7) c C::=cc
是一个1型文法。
从识别符号开始,来推导文法G[S]中的一个句子aabbcc
S −→−)1(aSBC −→−)2(aaBCBC −→−)4(aabCBC −→−)3(aabBCC
−→−)5(aabbCC −→−)6(aabbcC −→−)7(aabbcc
在推导过程中,要根据上下文才能做相应的替换。
例如:对非终结符号B ,只有当B 的上文是b 或a 时,才能将B 替换为
b(利用规则(4)aB::=ab(5)bB::=bb);
而对于非终结符号C ,只有当其的上文是b 或c 时,才能将C 替换为c(利用规则);(6)bC::=bc (7)cC::=cc)
3、 2型文法(上下文无关文法):如果文法G 中规则呈如下形式:U ::=u (U ∈N V , u ∈*V ),则称G 为2型文法,由2型文法产生的语言称为2型语言。
这是最常用的一类文法。
2型文法中,规则的左部一定是一个非终结符号,而规则的右部是由终结符号和非终结符号组成的符号串,也可以是空串。
4、 2型文法(正则文法):如果文法G 中规则呈如下形式:U ::=a 或U :=Wa(U ,W ∈N V , a ∈T V ),则称G 为3型文法,由3型文法产生的语言称为3型语言,3型文法又称正则文法。
将文法分为0、1、2、3型文法,是逐渐增加对规则的限制条件而得到的,因此它们所分别定义的语言依次缩小的即 3L 012L L L ⊂⊂⊂
源程序中的语法现象一般可以用上下文无关文法来描述。
§6语法树与二义性:
1、 语法树:设有一个文法G=(N V ,T V ,P ,Z ),则满足以下条件的树称为G 的一棵语法树:
(1)树中的每一个结点是V=N V ∪T V 中的一个符号;
(2)树根是识别符号Z ;
(3)若一个结点至少有一个后继结点(即不是叶子结点),则
该结点上的标识为非终结符号;
(4)若一个标记为U 的结点,它有标记依次为1x ,2x …n x 的
直接后继结点,则U ::=1x 2x …n x 必是文法G 中的一条规则。