第二章文法和语言的概念和表示
本章概述
本章中,我们将概述高级程序语言的结构和主要的共同特征,并介绍程序语言的语法描述方法。
主要学习内容:程序设计语言的定义,高级语言的一般特性,高级语言的语法描述,上下文无关文法,语法分析树和二义性,乔姆斯基文法体系。
学习目标:理解程序语言的词法、语法和语义等概念,进一步掌握高级程序设计语言的一般结构和主要共同特征,使学生具有必要的基础知识;理解文法和语言的一些基本概念,如文法的定义和构造、句型、句子、语言、推导、语法树等。
学习重点和难点:语法,语义,文法的构造。
2.1 概述
显然,用高级语言编程比用低级语言来得方便,但要解决两个问题:
1.计算机怎样懂得高级语言程序,这就需要一个翻译程序实现从源程序到目标程序的转换。
2.用什么方法来精确定义高级语言,即怎样精确描述高级语言。
要构造一个编译程序,应深刻理解被编译的源语言的结构(即词法和法)及其含义(即语义),同时要弄清源语言的语法规则和语义规则是采用什么理论或什么方法来描述的。
当我们表述一种语言时,无非是说明这种语言的句子,如果语言只含有穷多个句子,则只需列出句子的有穷集就行了,但对于含有无穷句子的语言来讲,存在着如何给出它的有穷表示的问题。
以自然语言为例,人们无法列出全部句子,但是人们可以给出一些规则,用这些规则来说明(或者定义)句子的组成结构,比如汉语句子可以是由主语后随谓语而成,构成谓语的是动词和直接宾语。
任何语言均可看作一个集合。这个集合中的每个元素都是在一定符号集(字母表)上的一个符号串。
对于自然语言来说,它们是定义在某个字母表上的句子的集合。
对于程序语言来说,它们也是定义在某个字母表上的句子的集合。这里的句子,就是一个源程序。
通常,源程序是由关键字、标识符、常数、运算符以及一些界限符组成。这些语法成分统称为单词或单词符号。
单词符号是语言中具有独立意义的最基本单位。语言的单词符号是由词法规则所确定的,即词法规则规定了单词符号的形成规则。
“我是大学生”是汉语的一个句子。
用语法来描述:
〈句子〉∷=〈主语〉〈谓语〉
〈主语〉∷=〈代词〉|〈名词〉
〈代词〉∷=我|你|他
〈名词〉∷=王明|大学生|工人|英语
〈谓语〉∷=〈动词〉〈直接宾语〉
〈动词〉∷=是|学习
〈直接宾语〉∷=〈代词〉|〈名词〉
有了这一组规则以后,按照如下方式用它们导出句子:
开始去找∷=左端的带有〈句子〉的规则并把它由∷=右端的符号串代替,这个动作表示成:
〈句子〉?〈主语〉〈谓语〉,
然后在得到的串〈主语〉〈谓语〉中,选取〈主语〉或〈谓语〉,再用相应规则的∷=右端代替之。比如,选取了〈主语〉,并采用规则〈主语〉∷=〈代词〉,那么得到:〈主语〉〈谓语〉?〈代词〉〈谓语〉,
重复做下去,这样句子“我是大学生”的导出的全部动作过程是:
〈句子〉?〈主语〉〈谓语〉
?〈代词〉〈谓语〉
?我〈谓语〉
?我〈动词〉〈直接宾语〉
?我是〈名词〉
?我是大学生
语言概述:语言是由句子组成的集合,是由一组符号所构成的集合。
汉语——所有符合汉语语法的句子的全体
英语——所有符合英语语法的句子的全体
程序设计语言——所有该语言的源程序的全体
研究语言
每个句子构成的规律
每个句子的含义
每个句子和使用者的关系
研究程序设计语言
每个程序构成的规律
每个程序的含义
每个程序和使用者的关系
语言研究的三个方面
语法 Syntax
语义 Semantics
语用 Pragmatics
语法——表示构成语言句子的各个记号之间的组合规律。程序语言的语法通常是指这样的一组规则,用它可以形成和产生一系列合式的程序。这组规则称为语法规则。语义——表示各个记号的特定含义。(各个记号和记号所表示的对象之间的关系)。程序语言的语义通常是指这样的一组规则,用它可以定义一个程序的意义。这组规则称
为语义规则。
语用——表示在各个记号所出现的行为中,它们的来源、使用和影响。
每种语言具有两个可识别的特性,即语言的形式和该形式相关联的意义。
语言的实例若在语法上是正确的,其相关联的意义可以从两个观点来看:
其一是该句子的创立者所想要表示的意义;
另一是接收者所检验到的意义。
这两个意义并非总是一样的,前者称为语言的语义,后者是其语用意义。幽默、双关语和谜语就是利用这两方面意义间的差异。
如果不考虑语义和语用,即只从语法这一侧面来看语言,这种意义下的语言称作形式语言。形式语言抽象地定义为一个数学系统。
“形式”是指这样的事实:语言的所有规则只以什么符号串能出现的方式来陈述。形式语言理论是对符号串集合的表示法、结构及其特性的研究。是程序设计语言语法分析研究的基础。
2.2 形式语言基础
2.2.1 字母表和符号串
(1)字母表:符号的非空有限集合。例:∑={a,b,c}
(2)符号:字母表中的元素。例:a,b,c
(3)符号串:符号的有穷序列。例:a, aa, ac, abc,…
空符号串:无任何符号的符号串或长度为零的符号串,记为ε。
符号串的形式定义
有字母表∑,定义:
①ε是∑上的符号串;
②若x是∑上的符号串,且a∈∑,则ax或xa是∑上的符号串;
③y是∑上的符号串,iff(当且仅当)y可由(1)和(2)产生。
2.2.2 符号串和符号串集合的运算
(1)符号串相等:若x、y是集合上的两个符号串,则x=y iff(当且仅当)组成x的每一个符号和组成y的每一个符号依次相等。
(2)符号串的长度:x为符号串,其长度|x|等于组成该符号串的符号个数。
例:x=STV ,|x|=3
(3)符号串的联接:若x、y是定义在Σ是上的符号串,且x=XY,y=YX,则x和y 的联接xy=XYYX也是Σ上的符号串。
注意:一般xy≠yx,而εx=xε
(4)符号串集合的乘积运算:令A、B为符号串集合,定义
AB={ xy |x∈A,y∈B}
(5)符号串集合的幂运算:有符号串集合A,定义
A0 ={ε}, A1=A, A2=AA, A3=AAA, ……An=An-1A=AAn-1 ,n>0 (6)符号串集合的闭包运算:设A是符号串集合,定义
A+= A1∪ A2∪ A3∪……∪ A n∪……称为集合A的正闭包。
A*= A0∪A+称为集合A的闭包。
例:A={x,y}
A+={x,y, xx,xy,yx,yy , xxx,xxy,xyx,xyy, ……}
A1 A2 A3
A*={ε, x,y, xx,xy,yx,yy , xxx,xxy,xyx,xyy, ……}
A0 A1 A2 A3
为什么对符号、符号串、符号串集合以及它们的运算感兴趣?
若A为某语言的基本字符集
A={a,b,……z,0,1,……,9, +,-,×, /, ( , ), =……}
B为单词集
B ={begin, end, if, then,else,for,……,<标识符>,<常量>,……}
则B ? A*。
语言的句子是定义在B上的符号串。
若令C为句子集合,则C ? B* ,程序? C
2.3 文法的直观理解
(1)什么是文法:
文法是对语言结构的定义与描述。即从形式上用于描述和规定语言结构的称为“文法”(或称为“语法”)。
例:有一句子:“我是大学生”。这是一个在语法、语义上都正确定句子,该句子的结构(称为语法结构)是由它的语法决定的。在本例中它为“主谓结构”。
如何定义句子的合法性?
如何定义有穷语言、无穷语言?
(2)语法规则:
我们通过建立一组规则(产生式),来描述句子的语法结构。
规定用“::=”表示“由……组成”或“定义为…”。如:
<句子>::=<主语><谓语>
<主语>::=<代词> | <名词>
<代词>::=你| 我| 他
<名词>::=王民| 大学生| 工人 | 英语
<谓语>::=<动词><直接宾语>
<动词>::=是| 学习
<直接宾语>::=<代词> | <名词>
(3)由产生式推导句子:
有了一组产生式之后,可以按照一定的方式用它们去推导或产生句子。
推导方法:从一个要识别的符号开始推导,即用相应产生式的右部来替代产生式的左部,每次仅用一条产生式去进行推导。如:
<句子> ? <主语><谓语>
<主语><谓语> ? <代词><谓语>
…………
这种推导一直进行下去,直到所有带< >的符号都由终结符号替代为止。
<句子> ? <主语><谓语>
? < 代词><谓语>
?我<动词><直接宾语>
?我是<直接宾语>
?我是<名词>
?我是大学生
例:有一英语句子:The big elephant ate the peanut.
<句子>::=<主语><谓语>
<主语>::=<冠词><形容词><名词>
<冠词>::=the
<形容词>::=big
<名词>::=elephant
<谓语>::=<动词><宾语>
<动词>::=ate
<宾语>::=<冠词><名词>
<名词>::=peanut
<句子> ? <主语><谓语>
? <冠词><形容词><名词><谓语>
? the <形容词><名词><谓语>
? the big <名词> <谓语>
? the big elephant <谓语>
? the big elephant <动词><宾语>
? the big elephant ate <宾语>
? the big elephant ate <冠词><名词>
? the big elephant ate the <名词>
? the big elephant ate the peanut
上述推导可写成
<句子> the big elephant ate the peanut
说明:
(1)有若干语法成分同时存在时,我们总是从最左的语法成分进行推导,这称之为最左推导,类似的有最右推导(一般推导)。
(2)从一组产生式可推出不同的句子,如以上产生式还可推出“大象吃象”、“大花生吃象”、“大花生吃花生”等句子,它们在语法上都正确,但在语义上都不正确。
所谓文法是在形式上对句子结构的定义与描述,而未涉及语义问题。
(4)语法树:
我们用一种树型结构来描述一个句子的语法结构。称之为语法树。如:
2.4 文法和语言的形式定义
2.4.1 文法的定义
文法定义:
文法是产生式的有穷集合,通常定义为四元组:G=(V N,V T,P,Z)
其中: V N:非终结符号集
V T:终结符号集
P:产生式或规则的集合
Z:开始符号(识别符号), Z∈V N
注意:
A.产生式:产生式是一个有序对(U, x), 通常写为:
U ::= x 或U→x; | U| = 1 |x|≥ 0
B.非终结符号:出现在产生式的左部,且能推出符号或符号串的那些符号。其全体构成非终结符号集,记为V N。
C.终结符号:不出现在产生式的左部,且不能推出符号或符号串的那些符号。其全体构成终结符号集,记为V T。
且V N∩V T =Φ, V N∪V T =V (V是文法的字母表)。
例:无符号整数的文法:
G[<无符号整数>]=(V N,V T,P,E)
V N={<无符号整数>,<数字串>, <数字>}
V T = {0,1,2,3,……9}
P = {<无符号整数> → <数字串> ;
<数字串> → <数字串> <数字> ;
<数字串> → <数字> ;
<数字> →0;
<数字> →1;
……
<数字> →9; }
Z = <无符号整数>;
几点说明:
①产生式左边符号构成集合V N,且 Z ∈V N。
②有些产生式具有相同的左部,可以合在一起。
例:<无符号整数> → <数字串> ;
<数字串> → <数字串> <数字> | <数字> ;
<数字> →0 | 1 | 2 | 3 | …… | 9
③给定一个文法,实际只需给出产生式集合,并指定识别符号。
例: G[<无符号整数>] :
<无符号整数> → <数字串> ;
<数字串> → <数字串> <数字> | <数字> ;
<数字> →0 | 1 | 2 | 3 | …… | 9
2.4.2 推导与归约
直接推导定义:
有文法G且有v=xUy,w=xuy,其中x、y ∈V*,U∈V N, u ∈V*,
若U ::= u∈P,则说v直接推导出w,记为v ? w。
若x=y=ε,有U ::= u,则说U直接推导出u,记为U ? u。
换句话说,设x和y是x和y是符号串,若使用一次产生式可以从x变换出y,则称x 直接推导出y(或者说y是x的直接推导),记为x ? y。
例如:G[N]:
N → ND | D
D → 0| 1| 2| 3| 4| 5| 6| 7| 8| 9
N? (1)ND? (2)NDD? (3)ND9? (4)N09? (5)N09? (6)109
当x和y是符号串已没有非终结符号时,推导就必须终止。因为终结符不可能出现在产生式左部,所以将在产生式左部出现的符号称为非终结符号。
推导定义:
+ 推导:x和y是x和y是符号串,若使用若干次产生式可以从x变换出y,则称x推导出y(或者说y是x的推导),记为x y。
或者说:若有直接推导序列:x=U0 ? U1? U2?……? U n=y,则x y。
例: N ? (1)ND ? (2)NDD ? (3)ND9 ? (4)N09 ? (5)N09 ? (6)109
则有: N 109。
* 推导:x和y是x和y是符号串,若使用零次或若干次产生式可以从x变换出y,则称x *推导出y(或者说y是x的*推导),记为x y。
最右推导:若x和y是符号串α中有两个以上的非终结符号时,对推导的每一步坚持把α中的最右非终结符号进行替换,称为最右推导。
最左推导:若x和y是符号串α中有两个以上的非终结符号时,对推导的每一步坚持把α中的最左非终结符号进行替换,称为最左推导。
直观意义:规范推导=最右推导
归约定义:推导的逆过程称之为归约。
例:x y,可称为x直接推导出y,也可称为y直接归约出x。
x y,可称为x推导出y,也可称为y归约出x。
句型定义:给定文法G[Z] ,x是句型当且仅当 Z x,且x∈V*;
句子定义:给定文法G[Z] ,x是句子当且仅当Z x, 且x∈V T*;
语言定义:给定文法G[Z] ,语言L(G[Z])={x| z x, x∈V T* };
例:对给定的语言{ab n a|n≥1},构造其文法为:
G1[Z]: Z→aBa,
B→b|bB
G2[Z]: Z→aBa,
B→b|Bb
文法等价定义:
G和G'是两个不同的文法,若 L(G) = L(G') , 则G和G’为等价文法。
编译感兴趣的问题是:
给定x, G, 求x ∈ L(G) ?
2.4.3 递归文法
1.递归产生式:产生式右部有与左部相同的符号
对于 U::= xUy ,
若x=ε,即U::=Uy,左递归;
若y=ε,即U::=xU,右递归;
2.递归文法:文法G,存在U ∈V n,
if U …U…,则G为递归文法;
if U U…,则G为左递归文法;
if U …U,则G为右递归文法;
3.左递归文法的缺点:不能用自顶向下的方法进行语法分析。
4. 递归文法的优点:可用有穷条产生式,定义无穷语言。
例:对于前面给出的无符号整数的文法是有递归文法,我们用了13条产生式就可以定义出所有的无符号整数。若不用递归文法,那将要用多少条产生式呢?
2.5 文法分类
形式语言:用文法和自动机所描述的没有语义的语言。
语言定义: L(G[Z])={x| Z x , x∈V T*}
文法定义:乔姆斯基将所有文法都定义为一个四元组:
G=(V N,V T,P,Z)
V N:非终结符号集
V T:终结符号集
P:产生式或规则的集合
Z:开始符号(识别符号), Z∈V N
文法和语言分类:0型、1型、2型、3型
这几类文法的差别在于对产生式施加不同的限制。
定义:
0型文法: P: u::=v,其中u∈V+,v∈V*
0型文法称为短语结构文法。
产生式的左部和右部都可以是符号串,一个短语可以产生另一个短语。
0型语言:L0 。这种语言可以用图灵机(Turing)接受。
1型文法: P: xUy::= xuy,其中 U∈V N, x、y、u∈V*
1型文法也称为上下文敏感或上下文有关。
也即只有在x、y这样的上下文中才能把U改写为u。
1型语言:L1。这种语言可以由一种线性界限自动机接受。
2型文法: P: U::= u,其中 U∈V N, u∈V*
2型文法也称为上下文无关文法。
也即把U改写为u时,不必考虑上下文。
注意:2型文法与BNF表示相等价。
2型语言:L2 。这种语言可以由下推自动机接受。
3型文法:
(左线性)P: U::=T 或 U::=ωT,其中 U、T∈V N,ω∈V T
(右线性) P: U::=T 或 U::=Tω,其中 U、T∈V N, ω∈V T
3型文法也称为正则文法。它是对2型文法进行进一步限制。
3型语言:L3。又称正则语言、正则集合。这种语言可以由有穷自动机接受。
根据上述讨论,L0? L1? L2? L3。
0型文法可以产生L0、L1、L2、L3,但2型文法只能产生L2,不能产生L1。
2.6 语法树与二义性文法
2.6.1 推导与语法树
(1)语法树:句子结构的图示表示法,它是一种有向图,由结点和有向边组成。如下图:
结点:符号
根结点:识别符号
中间结点:非终结符
叶结点:终结符或非终结符
有向边:表示结点间的派生关系。
( 2 ) 句型的推导及语法树的生成(自顶向下)
给定G[Z],句型w:
可建立推导序列,Z w
可建立语法树,以Z为树根结点,每步推导生成语法树的一枝,最终可生成句型的语法树。
注意一个重要事实:文法所能产生的句子,可以用不同的推导原则(使用产生式顺序不同)将其推导出来。语法树的生成规律不同,但最终生成的语法树形状完全相同。某些文法有此性质,而某些文法不具此性质。
句子10的语法树:
( 3 ) 子树与简单子树
子树:语法树中的某个结点(子树的根)连同它向下派生的部分所组成。
简单子树:只有单层分枝的子树称为简单子树。
( 4 ) 树与推导
句型推导过程?句型语法树的生长过程
由推导构造语法树
从识别符号开始,自左向右建立推导序列。
由根结点开始,自上而下建立语法树。
例:有文法G[<无符号整数>] ,并给定句型10,其推导过程及语法树的生长过程分别为:<无符号整数>? <数字串>
? <数字串><数字>
? <数字><数字>
? 1 <数字>
? 10
由语法树构造归约:
自下而上地修剪子树的末端结点,直至把整棵树剪掉(留根),每剪一次对应一次归约。从句型开始,自右向左地逐步进行归约,可以建立一个归约序列。
规范归约定义:
对句型中最左简单短语(句柄)进行的归约称为规范归约。
规范归约与规范推导互为逆过程。
规范句型
定义:
通过规范推导或规范归约所得到的句型称为规范句型。
在上例中,1<数字> 就不是规范句型,因为:
<无符号整数> =≯<数字串>
=≯<数字串><数字>
=≯<数字><数字>
=≯1<数字>
=≯10
注意:其中符号=≯表示为归约。
2.6.2 文法的二义性
二义性文法定义:
若对于一个文法的某一句子存在两棵不同的语法树,则该文法是二义性文法,否则是无二义性文法
或:若一个文法的某句子存在两个不同的规范推导,则该文法是二义性的,否则是无二义性的。
或:若一个文法的某规范句型的句柄不唯一,则该文法是二义性的,否则是无二义性的。
换而言之,无二义性文法的句子只有一棵语法树,尽管推导过程可以不同。
下面举一个二义性文法的例子。
例:给定文法 G[E]:
P:E→ E+E | E*E |(E)| i
V N ={E}
V T ={ +, * , ( , ) , i }
对于句子S=i+i*i∈L(G[E]),存在不同的规范推导:
(1) E? E+E? E+E*E? E+E*i? E+i*i? i+i*i
(2) E? E*E ? E*i ? E+E*i? E+i*i? i+i*i
这两种不同的推导对应了两种不同的语法树:
以上是自顶向下来看文法的二义性,我们还可以自底向上来看文法的二义性。上例中,规范句型E+E*i 是由i+i * i通过两步规范规约得到的,但对于同一个句型E+E* i,它有两个不同的句柄(对应上述两棵不同的语法树):i 和 E+E。因此语法的二义性意味着句型的句柄不唯一。
若文法是二义性的,则在编译时就会产生不确定性,遗憾的是在理论上已经证明:文法的二义性是不可判定的,即不可能构造出一个算法,通过有限步骤来判定任一文法是否有二义性。
现在的解决办法是:提出一些限制条件,称为无二义性的充分条件,当文法满足这些条件时,就可以判定文法是无二义性的。
由于无二义性文法比较简单,我们也可以采用另一种解决办法:即不改变二义性文法,而是确定一种编译算法,使该算法满足无二义性充分条件。
例:算术表达式的文法
E→ E+E | E*E | (E) | i
E→E+T | T
T→ T*F | F
F→ (E) | i
例:Pascal 条件语句的文法
<条件语句>::= If <布尔表达式>then<语句> | If <布尔表达式> then <语句> else <语句>
<语句> ::= <条件语句> | <非条件语句> |……。
2.7 句型的分析
任务:给定G[Z]: S ∈V T*, 判定是否有 S ∈ L (G[E] ) ?
这是词法分析和语法分析所要做的工作,将在第三、四章中详细介绍。
2.7.1句型的短语、简单短语和句柄
短语定义:
设G[Z]是给定文法, w=xuy∈V+,为该文法的句型,如果满足下面两个条件:
① Z xUy;
② U u;
则称句型xuy 中的子串u是句型xuy的短语。
简单短语定义:
设G[Z]是给定文法, w=xuy∈V+,为该文法的句型,如果满足下面两个条件:
① Z xUy;
② U ? u;
则称句型xuy 中的子串u是句型xuy的简单短语(或直接短语)。
直观理解:短语是前面句型中的某个非终结符所能推出的符号串。
句柄定义:
任一句型的最左简单短语称为该句型的句柄。
2.7.2 确定句柄的步骤
确定句柄的步骤为:短语→简单短语→句柄
注意:短语、简单短语是相对于句型而言,一个句型可能有多个短语、简单短语,句柄只能有一个。
例:给定文法G:
E→T | E+T | E-T
T→F | T*F | T/F
F→i | (E)
符号串(T+i)*i-F是文法G的一个句型,求其短语、简单短语和句柄。
解:对于符号串(T+i)*i-F有推导:
E ?E-T
?E-T
?T*F-T
?F*F-T
?(E)*F-T
?(T+T)*F-T
?(T+F)*F-T
?(T+i)*F-T
?(T+i)*i-T
?(T+i)*i-T
对应有语法树见下图:
依定义求,短语有8个:
1. E E,E (T+i)*i-F 则有短语:(T+i)*i-F
2. E T-F,T (T+i)*i 则有短语:(T+i)*i
3. E T*i-F,T (T+i)则有短语:(T+i)
4. E (E)*i-F,E T+i 则有短语: T+i
5. E (E+i)*i-F,E T 则有短语:T
6. E (T+F)*i-F,F i 则有短语:第一个i
7. E (T+i)*F-F,F i 则有短语:第二个i
8. E (T+i)*F-T,T F 则有短语:F
其简单短语有4个:
1. E (E +i)*i-F, E? T 则有:T
2. E (T +F)*i-F, F? i 则有:第一个i
3. E (T +i)*F-F, F? i 则有:第二个i
4. E (T +i)*F-T, T? F 则有:F
句柄有1个:T
用语法树也可以求短语、简单短语和句柄。
对上例经过分析可以得到结论:
用语法树求短语、简单短语和句柄的方法是:
1)每个句型都有一棵语法树;
2)每棵语法树的叶(从左到右)组成一句型;
3)每个子树的叶(从左到右)组成一短语;
4)每个简单子树的叶(从左到右)组成一简单短语;
5)最左简单子树的叶(从左到右)组成一句柄。
所以我们只需画出句型的语法树,然后根据子树找短语→简单短语→句柄。
2.8 有关文法的实用限制
2.8.1 有害产生式
若文法中有如U::=U的产生式,则这就是有害产生式,它会引起二义性。
例如存在U::=U, U::= a | b,则有两棵不同的语法树:
U U
| |
a U
|
a
2.8.2 多余产生式
(1)在推导文法的所有句子中,始终用不到的产生式。即该产生式的左部非终结符不出现在任何句型中。
(2)在推导句子的过程中,一旦使用了该产生式,将推不出任何终结符号串。即该产生式中含有推不出任何终结符号串的非终结符。
该产生式是多余产生式。
例如给定G[Z],若其中关于U的产生式只有如下一条:
U::=xUy
该产生式是多余产生式。在文法中应该去除多余产生式。
若某文法中无有害产生式或多余产生式,则称该文法是压缩过的。
2.8.3文法的其它表示法
(1).扩充的BNF表示
BNF的元符号: <, >, ::=, |
扩充的BNF的元符号: <, >, ::=, |, {, }, [, ] (, )
其中:花括号中内容表示重复出现(即循环出现);
方括号中内容表示选择出现。
(2). 语法图
文法另外一种表示法是使用一种称之为语法图的表示法。如PASCAL语言的标识符和无符号整数的语法图见下图。
本章内容总结
通过这一章的学习,我们学习了程序设计语言的定义,高级语言的一般特性,高级语言的语法描述,上下文无关文法,语法分析树和二义性,乔姆斯基文法体系。在下一章中,我们将讨论词法分析程序的构造。
第二章文法和形式语言 《编译原理》课程组 计算机工程学院 第二章文法和形式语言 2.1 文法的直观概念 2.2 符号和符号串 2.3 文法和语言的形式定义 2.4 文法的类型 2.5 上下文无关文法机器语法树 2.6 句型分析 2.7 文法的实用限制 第2章文法和语言 【学习目标】 本章目的是为语言的语法描述寻求工具 ◇掌握对源程序给出精确无二义(严谨、简洁、易读)的语法描述手段之一——文法。 ◇对形式语言的理论有一个初步基础 ◇根据语言文法的特点指导语法分析的过程 本章将讨论词法分析程序的设计原则,单词的描述技术,识别机制及词法分析程序的自动构造原理。 第2章文法和语言 【教学重点】 概念:文法,推导,直接推导,最左(右)推导,产生式,句型,短语,直接短语,句柄,语法树,规范推导,二义文法等 4种文法的定义、文法的构造和文法的推导 语法树的构造和最左(右)推导; 二义文法、二义性的证明; 句型分析; 2.1 文法的直观概念 一、语言概述 语言是由符合语法的句子组成的集合。 –汉语-- 所有符合汉语语法的句子的全体 –英语-- 所有符合英语语法的句子的全体 –程序设计语言-- 所有该语言的程序的全体
每个句子构成的规律 研究语言每个句子的含义 每个句子和使用者的关系 一、语言概述(续1) 研究程序设计语言 每个程序构成的规律 每个程序的含义 每个程序和使用者的关系 语言研究的三个方面 语法Syntax 语义Semantics 语用Pragmatics 一、语言概述(续2) 语法:指语言的一组规则,用它可以形成和产生一个合适的程序。 –如何由基本字符构成一个个单词; –如何由一系列单词构成程序 语法只定义什么样的符号序列是合法的,而不表达这些符号及符号序列的含义 语义:明确程序各部分的含义 –静态语义:由一系列限定规则组成,并确定哪些合乎语法的程序是合适的; –动态语义:表明程序要做些什么,要计算什么 一、语言概述(续3) 形式语言:只考虑语法而不考虑语义的符号语言。 每种语言具有两个可识别的特性, –语言的形式 –该形式相关联的意义 “形式”是指这样的事实:语言的所有规则只以什么符号串能出现的方式来陈述。 形式语言理论是对符号串集合的表示法、结构及其特性的研究,是程序设计语言语法分析研究的基础。 语言可以看成在一个基本符号集上定义的,按一定规则构成的基本符号串组成的所有集合。 二、文法的直观概念 表达语言时,一般无法穷尽语言的所有句子,常用规则加以描述 例:汉语句子的构成规则: 〈句子〉∷=〈主语〉〈谓语〉 〈主语〉∷=〈代词〉|〈名词〉 〈代词〉∷= 我| 你| 他 〈名词〉∷= 王明| 大学生| 工人| 英语 〈谓语〉∷=〈动词〉〈直接宾语〉 〈动词〉∷= 是| 学习 〈直接宾语〉∷=〈代词〉|〈名词〉
第二章文法和语言的概念和表示 本章概述 本章中,我们将概述高级程序语言的结构和主要的共同特征,并介绍程序语言的语法描述方法。 主要学习内容:程序设计语言的定义,高级语言的一般特性,高级语言的语法描述,上下文无关文法,语法分析树和二义性,乔姆斯基文法体系。 学习目标:理解程序语言的词法、语法和语义等概念,进一步掌握高级程序设计语言的一般结构和主要共同特征,使学生具有必要的基础知识;理解文法和语言的一些基本概念,如文法的定义和构造、句型、句子、语言、推导、语法树等。 学习重点和难点:语法,语义,文法的构造。 2.1 概述 显然,用高级语言编程比用低级语言来得方便,但要解决两个问题: 1.计算机怎样懂得高级语言程序,这就需要一个翻译程序实现从源程序到目标程序的转换。 2.用什么方法来精确定义高级语言,即怎样精确描述高级语言。 要构造一个编译程序,应深刻理解被编译的源语言的结构(即词法和法)及其含义(即语义),同时要弄清源语言的语法规则和语义规则是采用什么理论或什么方法来描述的。 当我们表述一种语言时,无非是说明这种语言的句子,如果语言只含有穷多个句子,则只需列出句子的有穷集就行了,但对于含有无穷句子的语言来讲,存在着如何给出它的有穷表示的问题。 以自然语言为例,人们无法列出全部句子,但是人们可以给出一些规则,用这些规则来说明(或者定义)句子的组成结构,比如汉语句子可以是由主语后随谓语而成,构成谓语的是动词和直接宾语。 任何语言均可看作一个集合。这个集合中的每个元素都是在一定符号集(字母表)上的一个符号串。 对于自然语言来说,它们是定义在某个字母表上的句子的集合。 对于程序语言来说,它们也是定义在某个字母表上的句子的集合。这里的句子,就是一个源程序。 通常,源程序是由关键字、标识符、常数、运算符以及一些界限符组成。这些语法成分统称为单词或单词符号。 单词符号是语言中具有独立意义的最基本单位。语言的单词符号是由词法规则所确定的,即词法规则规定了单词符号的形成规则。 “我是大学生”是汉语的一个句子。 用语法来描述: 〈句子〉∷=〈主语〉〈谓语〉 〈主语〉∷=〈代词〉|〈名词〉 〈代词〉∷=我|你|他 〈名词〉∷=王明|大学生|工人|英语 〈谓语〉∷=〈动词〉〈直接宾语〉 〈动词〉∷=是|学习 〈直接宾语〉∷=〈代词〉|〈名词〉 有了这一组规则以后,按照如下方式用它们导出句子: 开始去找∷=左端的带有〈句子〉的规则并把它由∷=右端的符号串代替,这个动作表示成: 〈句子〉?〈主语〉〈谓语〉, 然后在得到的串〈主语〉〈谓语〉中,选取〈主语〉或〈谓语〉,再用相应规则的∷=右端代替之。比如,选取了〈主语〉,并采用规则〈主语〉∷=〈代词〉,那么得到:〈主语〉〈谓语〉?〈代词〉〈谓语〉, 重复做下去,这样句子“我是大学生”的导出的全部动作过程是: 〈句子〉?〈主语〉〈谓语〉 ?〈代词〉〈谓语〉