第二章 高级语言及其语法描述
主要内容
2.1 程序语言的定义
2.2 高级语言的分类
2.3 程序语言的语法描述
2.1 程序语言的定义
 一个程序语言是一个记号系统。程序语言主
要由语法和语义两个方面定义。
语法
 任何语言程序都可看成是一定字符集(称为字母
表)上的一字符串(有限序列)。但是,什么样的
字符串才算是一个合式的程序呢?
 所谓一个语言的语法是指这样的一组规则,用它可
以形成和产生一个合式的程序。
 这些规则的一部分称为词法规则,另一部分称为语
法规则(或产生规则)。
 词法规则是指单词符号的形成规则。
 语言的单词符号是由词法规则所确定的。
词法规则规定了字母表中哪样的字符串是
一个单词符号。
 单词符号一般包括:各类型的常数、标识
符、基本字、算符和界符等。
 语言的语法规则规定了如何从单词符号形成更大的
结构(即语法单位),换言之,语法规则是语法单
位的形成规则。
 一般程序语言的语法单位有:表达式、语句、分程
序、函数、过程和程序等等。
 语言的词法规则和语法规则定义了程序的形式结构,
是判断输人字符串是否构成一个形式上正确(即合
式)程序的依据。
语义
 一个语言的语义是指这样的一组规则,使用
它可以定义一个程序的意义。这些规则称为
语义规则。
2.2 高级语言的分类
一、强制式语言
二、应用式语言
三、基于规则的语言
四、面向对象语言
2.3 程序语言的语法描述
 重点讨论上下文无关文法、语法分析树,以
及文法的二义性问题。最后还将对形式语言
进行简单概述。
 设 Σ 是一个有穷字母表,它的每个元素称为
一个符号。
1 、 Σ 上的一个符号串:是指由 Σ 中的符号所
构成的一个有穷序列。不包含任何符号的序
列称为空字,记为 ε 。用 Σ﹡ 表示 Σ 上的所有
符号串的全体,空字 ε 也包括在其中。
 例如,
∑ = {a,b} ,则 ∑﹡ ={ε ,a,b,aa,ab,ba,bb,aaa,
… }。
Ф表示不含任何元素的空集{}。
注意:要注意空字 ε 、 {} 和 {
ε } 的区别。
2 、语言:是给定字母表上一个任意的可数的
串集合。
语言运算
 1 、 ∑﹡的子集 L 和 M的并运算
2 、∑﹡的子集 L 和 M的(连接)积
LM ={ αβ|
α∈L&β∈M}
即集合 LM 中的符号串是由 L 和 M的符号串
连接而成的。
注意,一般而言, LM≠ML ,但 (
LM)W=L(
M
W )。
3 、 V 自身的 n 次(连接)积:
记为 Vⁿ=VV……V
规定: V°={ε }
令 V﹡
= V0
∪V¹∪V²∪V ³∪……
称 V*
是 V 的闭包。记 V﹢
=VV*
,称 V+
是 V 的正
则闭包。
 例: L 表示字母集合 {A,B,…,Z , a,b,….z},D 表示
数位的集合 {0,1 ,… 9}, 则
D
L 
4
L
*
L
*
)
( D
L
L 

D
LD
D
L 
4
L
*
L
*
)
( D
L
L 

D
字母和数位的集合:语言包含 62 个长度为
1 的串,每个串是一个字母或一个数位。
LD
所有由字母构成的串的集合,包括空串 ε
包含 520 个长度为 2 的串的集合,每个
串是一个字母跟一个数位
所有由四个字母构成的串的集合
所有由字母开头的,由字母和数位组成的串的集合
由一个或多个数位构成的串的集合
上下文无关文法
 文法是描述语言的语法结构的形式规则
(即语法规则)。
 上下文无关文法所定义的语法范畴(或语
法单位)是完全独立于这种范畴可能出现
的环境的。
 上下文无关文法不宜于描述任何自然语言,
但对于现今的程序语言来说,上下文无关
文法基本上是够用了。
 从一个具体英文例句的分析出发,引进有关上下文无关文法的
基本概念。比如,我们写了这样一个句子:
He gave me a book .
这是一个语法上正确的句子,因为它满足英语中的基本语法规则。
有下面语法规则:
<句子>→<主语><谓语><间接宾语><直接宾语>
<主语>→ < 代词 >
<谓语>→ < 动词 >
<间接宾语>→<代词>
<直接宾语>→<冠词><名词>
< 代词>→ He
<代词>→ me
<冠词>→ a
<动词 >→gave
<名词>→ book
<句子> ==> <主语><谓语><间接宾语><直接
宾语>
==> <代词><谓语><间接宾语><直接宾语>
==> He <谓语><间接宾语><直接宾语>
==> He <动词><间接宾语><直接宾语>
==> He gave <间接宾语><直接宾语>
==>He gave <代词><直接宾语>
==> He gave me <直接宾语>
==> He gave me <冠词><名词>
==> H gave me a <名词>
==> He gave me a book
语法分析树 : 用一种图示化的方法来表示这种推导
句子
主语 谓语 间接宾语 直接宾语
代词 动词 冠词 名词
He gave me a book
代词
上下文无关文法描述
 一个上下文无关文法 G包括四个组成部分:
一组终结符号,一组非终结符号,一个开始
符号,以及一组产生式。
 终结符号乃是组成语言的基本符号,在程序
语言中就是以前屡次提到的单词符号,如基
本字、标识符、常数、算符和界符等。从语
法分析的角度来看,终结符号是一个语言的
不可再分的基本符号。
 非终结符号(也称语法变量)用来代表语法
范畴。例如,“算术表达式”、“布尔表达式”、
“赋值句”、“分程序”、“过程”等。
 开始符号是一个特殊的非终结符号,它代表
所定义的语言中我们最终感兴趣的语法范畴,
这个语法范畴通常称为“句子”
 产生式(也称产生规则或简称规则)
是定义语法范畴的一种书写规则。一个产生式的形
式是 A→α
其中,箭头(有时也用::=)左边的 A 是一个
非终结符,称为产生式的左部符号;箭头右边 α
的是由终结符号或 / 与非终结符号组成的一符号串,
称为产生式的右部。
 例:
“ 变量是一个算术表达式;若 E 和 E2 是算术表达式,
则 E1 + E2,E1*E2 和( El )也是算术表达
式。”
对于这个定义,若用产生式来描述,则可将它写成:
E→i
E→E + E
E→E * E
E→ ( E)
E :表示“算术表达式”
i :表示“变量”
 一个上下文无关文法 G 是一个四元式
( VT,VN,S,ρ) ,
其中
VT 是一个非空有限集,它的每个元素称为终结符号;
VN 是一个非空有限集,它的每个元素称为非终结符
号, VT∩VN = φ
S 是一个非终结符号,称为开始符号;
ρ 是一个产生式集合(有限),每个产生式的形式
是 P→α ,其中, P€ VN , α €(VT∪VN)*
。开始
符号 S 至少必须在某个产生式的左部出现一次。
 对于多个左部相同的产生式:
P→α1
P→α2
……
P→αn
可写为: P→α1| α2…… αn
其中每个 αi 称为是 P 的一个候选式。
→ 读为“定义为”,
| 读为“或”。
 一般,用大写字母 A,B,C… 或汉语词组
(如,算术表达式)代表非终结符号,
用小写字母 a,b,c… 代表终结符,用
α 、 β 、 γ 等代表由终结符和非终结符
组成的符号串。
 上下文无关文法定义一个语言的中心思想是:
从文法的开始符号出发,反复连续使用产生式,
对非终结符施行替换和展开。
 我们称 αAβ 直接推出 αγβ ,
即 αAβ=> αγβ
仅当 A→γ 是一个产生式,且 α 、 β∈(VT∪VN)*
。
如果 αl => α2 => ... => αn ,则我们称这个序列
是从 αl 至 αn 的一个推导。
若存在一个从 αl 至 αn 的推导,则称 αl 可推导出
αn.
 假定 G 是一个文法, S 是它的开始符号。
如果 S => α ,则称 α 是一个句型。仅含
终结符号的句型是一个句子。
 文法 G 所产生的句子的全体是一个语言,
将它记为 L(G)
L(G) = { α|S => α&α∈VT
﹡
}
E =>(E) =>(E + E) =>(E*E + E ) =>
( i*E + E) =>(i * i + E) =>(i * i + i)
是从开始符号 E 到 (i*i + i )的一个推导。
而 E ,( E ),( E + E ),( E*E +
E ),…,( i*i + i )都是这个文法的
句型。
下面介绍几个简单文法的例子:
例 2.1 考虑一个文法 G1:
S→bA A→aA|a 它定义了一个什么语言呢?
从开始符 S 出发,我们可以推出如下句子:
SbA ba
SbA baA baa
………..
SbA baA  …  baa…a
可以写为: L(G1)={ban
|n 1}
≥
 例 2.2 设有文法 G
S P|aPPb
→
P ba|bQa
→
Q ab
→
求语言 L(G).
解: L(G)={ba,baba,abab,ababab… }
例 2 。 3 构造一个文法 G3 使
L(G3)={an
bn
|n 1}
≥
解 ; S aSb|ab
→
最左 ( 最右 ) 推导
所谓最左推导指:任何一步 a => β 都是对 α 中
的最左非终结符进行替换的。
同样,可定义最右推导。
 ( i*i + i) 的最右推导:
E =>(E)
=>(E + E)
=>(E + i)
=>(E*E + i)
=>(E*i + i)
=>(i*i + i)
例: G = ({E}, {i, +, *, (, ) } , P , E)
P : E  E + E | E * E | ( E ) | i
句子 ( i * i + i) 的语法树:
(1) E  (E)  (E + E)  (E * E + E) (i * E + E)  (i *i + i)
(2) E  (E)  (E + E)  (E * E + E) (i * E + E)  (i *i + i)
语法分析树与二义性
 用一张图表示一个句型的推导,这种表示
称为语法分析树,或简称为语法树。
 一棵语法树表示了一个句型种种可能的
(但未必是所有的)不同推导过程,包括
最左(最右)推导。
 如果一个文法存在某个句子对应两棵不同
的语法树,则称这个文法是二义的。也就
是说,若一个文法中存在某个句子,它有
两个不同的最左(最右)推导,则这个文
法是二义的。
 注意,文法的二义性和语言的二义性是
两个不同的概念。我们可能有两个不同
的文法 G和 G‘ .其中一个是二义的而另
一个是无二义的,但是却有 L(G)=L
(G’ ),也就是说,这两个文法所产生
的语言是相同的。
 在文法 (2.1) 中,假若规定了运算符
‘十’与‘ *’ 的优先顺序和结合规则.比方说,
让‘ *’ 的优先性高于‘+’,且它们都服从左
结合,那么,就可以构造出一个无二义
文法:
E→T | E 十 T
T →F | T*F
F→ ( E) | i
作为描述程序语言的上下文无关文法,对它有几点限
制。
第一,文法中不含任何下面形式的产生式
P→P
因为,这种产生式除了引起二义性外没有任何用处。
第二,每个非终结符 P 必须都有用处。这一方面意味
着,必须存在含 P 的句型;也就是,从开始符号 S
出发,存在推导
S =>αPβ
另一方面意味着,必须存在终结符串 γ€VT
*
,使得 P
=>γ, 也就是,对于 P 不存在永不终结的回路。
形式语言鸟瞰
 乔姆斯基把文法分成四种类型,即 0 型、 l
型、 2 型和 3 型。
 0 型强于 1 型, l 型强于 2 型, 2 型强于 3
型。
 这几类文法的差别在于对产生式施加不同的限
制。
 我们说 G=(VT ,VN ,S ,) 是一个 0 型文法,如果
它的每个产生式 是这样的结构
(VNVT)*
且至少有一个非终结符,而
(VNVT)*
。 0 型文法也称短语文法。
如果对 0 型文法分别施加以下的第 i 条限制,则我们就
得到第 i 型文法 :
(1)G 的任何产生式  均满足 ||≤ || (其中 |
| 和 || 分别为和的长度;仅 S 例外,但 S 不
得出现在任何产生式的右部。
(2)G 的任何产生式为 A, AVN, (VNVT)*
。
(3)G 的任何产生式为 AB 或 A ,其中
 VT
*
, A 、 B  VN 。
 
 其中 1 型文法也称上下文有关文法。这种文
法意味着,对非终结符进行替换式务必考虑
上下文并且一般不允许替换成空串。
※ 2 型文法也称上下文无关文法,注意其语言
定义:
G 的任何产生式为 A→β , A∈VN , β∈ ( VN∪VT)
*
表明凡出现在产生式左边的符号都是
非终结符。
※3 型文法也称右线性文法。
3 型文法还有另一种形式,称左线性文法:一
个文法 G 为左线性文法,如果 G 的任何产生
式为
A→B 或 A→ ,其中∈ VT
*
,
A 、 B ∈ VN 由于 3 型文法等价
于正规式所以也称正规文法。
例题与习题解答
[ 例 2.1] :
试构造生成语言 L={an
bn
ci
|n1, i 0} 的文法
分析:要求 a 和 b 的个数一样多,并至少为一个,而
c 的个数为 0 个以上即可,所以可以用一个非终结
符去生成 an
bn
串,用另一个非终结符去生成 ci
。
G(Z): ZAB
A aAb|ab
B cB|
[ 例 2.2] :
已知语言 L={an
bbn
| n 1}, 写出产生 L 的文法。
[ 解 ] : G[S]: S aAb
A aAb|b
[ 例 2.3] :
已知文法 G=({A,B,C},{a,b,c},A,P)
其中产生式 P 由以下组成:
A abc A aBbc
Bb bB Bc Cbcc
bC Cb aC aaB
aC aa
问:此文法表式的语言是什么?
[ 解 ] :由于 A 为开始符。
由于 AaBbc abBc abCbcc
aCbbcc
aabbcc
语言为: {an
bn
cn
, n>0 }
,
[ 例 2.4] : 已知语言 L={x | x{a,b,c}*, 且 x
重复排列是对称的( aabcbaa,aabbaa, 等 )
写出该语言的文法。
[ 例 2.4] :解:
G(Z) : Z aZa|bZb|cZc|a|b|c|

This PPT is about Chapter 2 of Compiler Principles: High-Level Languages and Their Syntax Descriptions.