目录
1 基本概念
(1)字母表
(2)串(String)
2 文法的定义
3 语言的定义
(1)推导(Derivations)和规约(Reductions)
(2)句型和句子
(3)语言的形式化定义
4 文法的分类
(0)0型文法 (Type-0 Grammar)
(1)1型文法 (Type-1 Grammar)
(2)2型文法 (Type-2 Grammar)
(3)3型文法 (Type-3 Grammar)
(4)文法的判别
5 CFG的分析树
(1)分析树是推导的图形化表示
(2)(句型的)短语
(3)二义性文法
字母表∑1和∑2的乘积( product) 字母表∑的n次幂( power)
字母表∑的正闭包( positive closure) 字母表∑的克林闭包(Kleene closure)
(1)文法的形式化定义
文法是由非终结符(大写字母)和终结符(小写字母)以及“—>”组成的。例:A—> a、B—>dba、S—> Ab、adB—>d
G表示文法,文法由一个四元组定义 。
① VT:终结符集合(terminal symbol)
终结符(terminal symbol)是文法所定义的语言的基本符号,有时也称为token。 例如:VT={apple,boy,eat,little}
例如,下面的语法有两个规则:
- x -> xa
- x -> ax
在这种语法之中,a是一个终结符,因为没有规则可以把a变成别的符号。不过,有两个规则可以把x变成别的符号,所以x是非终结符。一个形式语法所推导的形式语言必须完全由终结符构成。
② VN:非终结符集合(nonterminal)
③ P:产生式集合
④ S:开始符号
(2)产生式的简写
(3)符号约定
①终结符:
②非终结符:
Chomsky文法分类将文法分为四种,逐渐对产生式施加限制形成一个层次:
每种正则文法都是上下文无关的,每一种上下文无关文法都是上下文有关的,而每一种上下文有关文法都是0型文法
- 1型文法在0型文法的基础上进一步要求产生式的左部α中符号的个数不能多于β中符号的个数
- 非终结符A,当它的上下文分别是α1和α2的时候才可以替换为β,因此是上下文有关的
- 上下文有关文法中不包含空产生式,空产生式就是产生式的右部β是空串的产生式
如果上下文有关文法中包含空产生式,那么β的长度就为0,而我们要求α中至少包含一个非终结符,所以α 的长度至少 为1,那么α的长度大于等于1,而β的长度等于0这就与上下文有关文法的定义不符合,所以上下文有关文法中就不包含 空产生式
- 2型文法就是上下文无关文法,左部α必须是一个非终结符,大写字母A定义的是非终结符,
- 将A转换为β不需要考虑上下文,所以称为上下文无关文法
- 下面用来生成标识符的文法的左部被称为非终结符,称为上下文无关文法
· 右线性(Right Linear)文法: A→wB 或 A→w
· 左线性(Left Linear) 文法: A→Bw 或 A→w
- 右线性文法在2型文法的基础上继续对产生式的右部进行限制,也就是说右线性文法的右部要么是终结符号串w,要么就是在终结符右边添加一个非终结符B;左线性文法的话要么是一个终结符,要么是在终结符左边加一个非终结符
- 在正则文法的表达式的右部最多只有一个非终结符
- 不仅标识符可以用正则文法来描述,程序设计语言中的大多数单词都可以用正则文法来描述
从最复杂的3型进行判断,如果不符合3型的,那再看是不是2型的,依次向下判断,最后答案取其最高的符合规则。
解:S → a…ab…b 两边分别加上a和b得到:S → a(a…ab…b)b 即S → aSb ;
又因为 n ≥ 1,得出S → ab,所以,文法为S → aSb|ab,为2型上下文无关文法。
解:S → a…ab…bc…c , 记A → a…ab…b , B→ c…c;S → AB
由A → a(a…ab…b)b 得 A → aAb
又因为 n ≥ 1,得出A → ab,A → aAb | ab
由B → c(c…c)可得B→ cB,又因为 i ≥ 0,得出B → ε,B→ cB | ε
所以,文法为:
S → AB
A → aAb | ab
B→ cB | ε
2型上下文无关文法
③
S → a…ab…bc…c ,得S → a(a…ab…bc…c),S → aS
由i ≥ 1可得 S → a(b…bc…c),记A→ b…bc…c 得 S → aA;又因为 A→ b(b…bc…c),得出A → bA
又因为 j ≥ 1,得出 A→ b(c…c),记B → c…c 得 A → bB;由B → c(c…c)可得B→ cB
有因为k ≥ 1,可得B→ c
所以,文法为:
S → aS | aA
A → bA | bB
B→ cB | c
3型右线性文法
--短语
句型的分析树中的每一棵子树的边缘称为该句型的一个短语(phrase) ;一个句型的语法树中任一子树叶结点所组成的符号串都是该句型的短语。
--直接短语
如果子树只有父子两代结点,那么这棵子树的边缘称为该句型的一个直接短语(immediate phrase);
所有子树中,深度为2的子树的叶子节点串就是直接短语;
如果子树中不再包含其他的子树,即A只能推导出b,而b不能再推出其他的式子,则b为此句型的直接短语。
--句柄
直接短语中的最左直接短语为该句型的句柄。
--素短语
指一个短语至少包含一个终结符,并且除它自身之外不再包含其他素短语;
从短语集合中找出所有含有终结符的短语,然后选出除它自身之外不再含更小的素短语(这个小的概念是集合中没有被包含的元素,如有两个短语aAA和aAAA,aAA含于aAAA,所以aAA比aAAA小)
--最左素短语
从素短语集合中找出最左边的素短语。
判别直接短语例子:
如果能画出对应的抽象语法树,则就表明此表达式是文法的一个句型.
按如上的语法树可知,E=T*F为此文法的一个句型:
短语: T*F, E+T*F
直接短语:T*F
句柄:T*F
2.
S -> a|b|(T)
T -> TdS|S
证明(Sd(T)db)是S的一个句型,并求出短语,直接短语,句柄
由 抽象语法树 可得S=(Sd(T)db)为此文法的一个句型:
短语:S,(T),b,Sd(T),Sd(T)db,(Sd(T)db)
直接短语:S,(T),b
句柄:S