- 形式语言自动机课程笔记
- 学到编译原理的时候用到了文法相关概念,复习自动机正好把以前的笔记整理一下也贴上来
一、问题的提出
- 语言是给定字母表上字符串的一个集合
- 任何有意义的语言,都是符合某些规则要求的字符串的集合
- 我们把这种有意义的语言称作
文法
- 文法可以用自然语言描述,如英语语法
- 文法也可以用严格的规则形式描述,比如C语言文法,这种文法称为
形式文法
二、形式文法和形式语言
(1)形式文法
-
文法
:用有限个规则描述无穷多字符串的集合 -
形式文法(G)
:一个文法G是一个四元组 G = ( V, T, P, S ),其中:- V:是
变元
的有限集。 - T:是
终结符
的有限集。 - P:是
产生式
的有限集,其中每个产生式都是α→β
的形式- 其中 α ∈ ( V ∪ T ) + α∈(V∪T)^+ α∈(V∪T)+,且其中至少有一个V中的符号; β ∈ ( V ∪ T ) ∗ β∈(V∪T)^* β∈(V∪T)∗。
- S:称为文法G的
开始符号
,决定这组规则最终要定义什么,S∈V。
示例:
- G 1 = ( { A , B } , { 0 , 1 } , { A → 0 B , B → 1 B , B → 0 } , A ) G_1 = (\{A, B\}, \{0,1\},\{A→0B, B→1B, B→0\}, A) G1=({A,B},{0,1},{A→0B,B→1B,B→0},A)
- G 2 = ( { A , B , C } , { a , b } , { A → a B C , B → b , C → C C , C → ε } , A ) G2 =( \{A,B,C\},\{a,b\},\{A→aBC, B→b, C→CC, C→ε\}, A) G2=({A,B,C},{a,b},{A→aBC,B→b,C→CC,C→ε},A)
- V:是
-
文法表示方式的约定:
符号 | 表示 |
---|---|
变元 | 大写字母ABCD…除非特殊说明,否者S表示开始符号 |
终结符号 | 小写字母abcde/数字123… |
终结符串 | 小写字母uvwxyz |
变元和终结符混合串 | 希腊字母αβγ… |
-
若有若干产生式左部一致,记为 α → β 1 ∣ β 2 ∣ . . ∣ β n α\to β_1|β_2|..|β_n α→β1∣β2∣..∣βn
-
上述约定下,写一个文法只需写出产生式集合
示例:
-
G = ( { S } , { a , b } , { S → a S b , S → a b } , S ) G=(\{S\},\{a,b\},\{S→aSb,S→ab\},S) G=({S},{a,b},{S→aSb,S→ab},S)
可以表示为:S→aSb|ab -
给出文法G,它的产生式是:
- S→aB∣bA
- A→a∣bAA∣aS
- B→b∣aBB∣bS
则L(G)是由相等个数a和b组成的(次序不限)所有串的集合 (可以用归纳法证明)
-
- 字符串/文法推倒与规约
最左(右)推倒
:对于推导α→β,如果每一步都是对α中的最左非终结符进行替换的,则我们称这种推导为最左推导
,如果每一步都是对α中的最右非终结符进行替换的,则我们称这种替换为最右推导
,例如:
(2)形式语言
形式语言
:给出文法 G=(V,T,P,S),它所产生的语言记作L(G)
,由下述集合定义:
L ( G ) = { w ∣ S ⟹ ∗ w , 并 且 w ∈ T ∗ } L(G)=\{w|S\stackrel{*}{\Longrightarrow} w,并且w∈T^* \} L(G)={w∣S⟹∗w,并且w∈T∗}
L(G)是由G中开始符号S推导出来的全体终结符号串所构成的集合,也就是所有句子的集合。
三、文法等价
文法等价
:对于两个不同的文法 G 1 = ( V 1 , T 1 , P 1 , S 1 ) , G 2 = ( V 2 , T 2 , P 2 , S 2 ) , G_1=(V_1,T_1,P_1,S_1),G_2=(V_2,T_2,P_2,S_2), G1=(V1,T1,P1,S1),G2=(V2,T2,P2,S2),如果 L ( G 1 ) = L ( G 2 ) L(G_1)=L(G_2) L(G1)=L(G2),则称文法 G 1 G_1 G1与 G 2 G_2 G2等价。- 在两个四元组的各对应部分中,只要有一点点不同,就应当看作是不同的文法,在这个意义下,任何一个语言都可以有无穷多个文法(都等价)产生它。
四、文法的乔姆斯基分类
对于文法 G=(V,T,P,S)按以下方法分为四类:
0型文法
,或短语结构文法(PSG)
:- 产生式不加另外的限制。
- 产生
短语结构语言(PSL)
1型文法
,或上下文有关文法(CSG)
:- 产生式α→β都满足 |α|≤∣β|
- 产生
上下文有关语言(CSL)
2型文法
,或上下文无关文法(CFG)
:- P中每个产生式都具有如下形式:A→β,β∈(V∪T)*,A∈V
- 产生上
下文无关语言(CFL)
3型文法
,或正则文法(RG)
:- P中每个产生式都具有如下形式:A→a或A→aB,a∈T∪{ε},AB∈V
- 产生
正则语言(RL)
五、左/右线性文法
六、语法分析树和文法二义性
(1)定义
-
分析树是推导的图形表示
-
设G=(V,T,S,P),G的一棵
语法分析树
满足如下条件:- 每一结点有一标记,此标记是V∪T∪{ε}中的符号。
- 根的标记是S。
- 如果一个结点是内部结点(非叶节点),且标记A,那么A必在V中。
- 如果编号为n的结点有标记A,结点 n 1 , n 2 , … , n k n_1,n_2,…,n_k n1,n2,…,nk是点n的从左到右的儿子,并分别有标记 X 1 , X 2 , … , X k X_1,X_2,…,X_k X1,X2,…,Xk,则 A → X 1 X 2 … X k A→X_1X_2…X_k A→X1X2…Xk必须是P中的产生式。
- 若结点n有标记ε,那么结点n是叶子,且是它父亲唯一的儿子。
-
边缘
:一颗语法分析树,将其叶子上的标记从左到右收集组成的字符串称为该语法分析树的边缘
示例:
- 文法:
E→E+E | E*E | (E) | i
,句子i*i+i
的语法分析树
(2)分析
- 画语法树的两种方法:
- 自顶向下:根据推导序列,对每步推导画相应分枝
- 自底向上:根据归约序列,对每步归约画相应分枝
- 有关分析树要注意的几点:
- 一个句型推导或分析用一棵树结构图示出来,它反应了一个句子的语法结构层次。
- 分析树并未描述推导过程,可以从两个角度看这个问题
- 对于一个句子的多种推导(若文法是无二义性的),采用各种推导过程,画出的分析树是一样的。
- 对于同一个语法分析树,它的最左(最右)推导是唯一的。
- 在书中,用画分析树的过程解释语法分析过程,用分析树图解语法结构
(3)文法二义性
文法二义性
:- 如果一个文法的某个句子存在两棵不同的分析树,那么该句子是二义性的。如果一个文法包含二义性的句子,则称这个文法是二义性的;否则,该文法是无二义性的
- 等价定义:文法的某字符串存在两个不同的最左(最右)推导
- 说明:
- 一般来说,程序语言要求无二义性文法,对于条件语句,经常使用二义性文法(if-else之类的)描述它
- 对于任意一个上下文无关文法,不存在一个算法,能够在有限的步骤内判定它是无二义性的;但能给出一组充分条件,满足这组充分条件的文法是无二义性的
- 通过给产生式引入优先级,可以把部分二义性文法转化为无二义性文法,但有一些文法是不能消除二义性的,称其为
固有二义性