什么是文法?
若干规则的组合就是文法
语言
——
形式化的内容提取
自然语言语言
(Language)
满足
一定条件
的
句子
集合
句子
(Sentence)
满足
一定规则
的
单词
序列
单词
(Token)
满足
一定规则
的
字符
(Character)
串
(String)
程序设计语言
——
形式化的内容提取
程序设计语言
(Programming Language)
:组成程序的
所有语句的集合
程序
(Program)
:满足语法规则的
语句
序列
语句
(Sentence)
:满足语法规则的
单词
序列
单词
(Token)
:满足词法规则的
字符串
程序设计语言的描述形式
——
文法
语法
——
语句
语句的组成规则
描述方法:
BNF
范式
、语法
(
描述
)
图
词法
——
单词
单词的组成规则
描述方法:
BNF
范式
、正规式
(
正则表达式
)
文法的作用
严格
定义句子的结构
用
适当条数的规则
把句子描述出来,有穷刻画无穷
BNF
范式
描述文法的方法
< >
用尖括号括起来的内容表示语言构造成分,称为
语法单元,在文法中为非终结符
:=
表示左部的语法单元由右部来定义,读定义为→
|
或
,多选
{ }
可重复
0
戒者多次
[ ]
可选,出现或者不出现
字母表(
Alphabet
)
字母表
∑
是元素的
非空
有穷集合
,字母表中
的
元素
称为该字母表的
符号
,也叫符号集
符号串(
String
)
由
字母表
中的
符号
所组成的任何
有穷序列
被
称之为该字母表上的符号串
(1)
ε
是
∑
上的一个符号串,也叫
空
符号串
ɸ
表示不含任何元素的空集
区别
ε
,
ɸ
和
{ε}
(2)
若
x
是
∑
上的符号串,而
a
是
∑
的元素
,
则
xa
是
∑
上的符号串
(3) y
是
∑
上的符号串
,
当且仅当它由
(1)
和
(2)
导出
注意:
符号串是有序的,
ab
和
ba不
一样
设
s=abc
是符号串,则
s
的
前缀
/
头
:移
走
s
的尾部的零个或多于零个符号
ε
,
a, ab
, abc
后缀
/
尾
:删去
s
头部的零个或多于零个符号
ε,c,bc
,abc
子串
:
从
s
中删去一个前缀和一个后缀
逆转
:将
S
中的符号按相反次序写出而得到
的符号串
(
如何实现符号串的逆转?
)
长度
:是该符号串中的符号的数目 例如
|abc|=3,|ε|=0
符号串的连接和方幂
连接
:
设
x
和
y
是符号串,它们的连接
xy
是把
y
的符号写在
x
的符号之后得到的符号串。
例如,
x=ba,y=nana,xy=banana
方幂
:
x
0=
ε
; x 1
=x; x
2
=xx; …
;
x
n
=x
n-1
x
例如
,
设
x=ba,
则
x
1
= ba, x
2
=baba, x
3
=bababa
文法
G
为一个四元组
:
G
= (
V
N,
V
T
,P,S
),
其中
V
N
:非终结符
(NonTerminal)
集,非空有穷
语法成分
——
代表某个语言的各种子结构
V
T
:终结符
(Terminal)
集,非空有穷
V
T
∩
V
N
=Φ
P
:规则的集合
α→
β
,被称为规则(产生式),读作:
α
定义为
β
。其中
α
∈
(
V
T
∪
V
N
)
+
,且
α
中至少有V
N
中元素的一个出现。
β
∈
(
V
T
∪
V
N
)
*
。
α
称为产生式
α→
β
的
左部
,
β
称
为产生式
α→
β
的
右部。
S
:开始符号
(Start Symbol)
,
S
∈
V
N
代表文法所定义的语言,至少在
规则
左侧出现一次
符号串的
推导与归约
:已给文法
G=(V
N
,V
T
, P,
S
)令
α, β
∈
(V
N
∪
V
T
)*
,且
A→
γ
∈
P
,此时,由符号串
v=αAβ
能够直接推出符
号串
w=αγβ
,我们称
符号串
αγβ
是符号串
αAβ
的
直接推导
;
符号串
αAβ
是符号串
αγβ
的
直接归约
记作
: αAβ
⇒
αγβ
一个文法是可以用有限的规则推导出无限的句子的
文法
G
= (
V
T
,
V
N
,
S
,
P
)
乔姆斯基把文法分为四类:
0
型文法:
α→β
,α
, β
∈
(
V
N ∪
V
T
)
*
, α
至少有一个
非终结符 也称短语文法
1
型文法:
| α
| ≤
| β
|
,但S→
ε
可以例外 也称上下文有关文法
αAβ
⇒
αγβ
是
1
型文法的一个产生式
2
型文法:
A →β
,
A∈
V
N
, β∈
(V
N
∪
V
T
)* 也称上下文无关文法
3
型文法:
A →α
B或
A →α
,
A, B∈
V
N
, α∈
V
T
* 也称正规文法
四种文法之间是逐级包含关系