基本概念
字母表
字母表是一个有穷符号集合
例如数字,字母,标点符号
- 字母表的乘积等于每个字母表的元素单独与另一字母表中每个元素相乘
e.g. {0,1}*{a,b} = {0a,0b,1a,1b}
注意:顺序非常重要 - 字母表的 0 次幂等于{ ϵ \epsilon ϵ}
- 字母表的 n 次幂等于长度为 n 的符号串构成的集合,符号串个数为 m n m^n mn
- 正闭包与克林闭包:
正闭包:使用字母表中的符号串构成的任意长度为正数符号串的字母表
克林闭包:正闭包加空字符串
串
任取 x 都满足在 σ \sigma σ的克林闭包内,称 x 为 σ \sigma σ上的串
串是字母表中的有穷序列
|x|用来表示 x 的长度
| ϵ \epsilon ϵ|= 0
串的运算
- 串的连接:xy
- 对任何一个串 ϵ \epsilon ϵx = x ϵ \epsilon ϵ = x
- xyz 为三个字符串连接,则 x 称为 y 的前缀,z 称为 y 的后缀
- 串的幂运算: s 2 = s s s^2 = ss s2=ss
文法定义
自然语言实例
<sentence> -> <n. phase><v. phase>
<n.phase> -> <adj><n. phase>
<n.phase> -> <n>
<v.phase> -> <v><n. phase>
<adj> -> littile
<n> -> apple,boy
<v> -> likes
文法的形式化定义
G = ( V T , V N , P , S ) G = (V_T,V_N,P,S) G=(VT,VN,P,S)
VT:终结符,也称为 token
VN:非终结符
VT 并 VN 为文法符号集合
产生式:
α → β \alpha \rightarrow \beta α→β
其中 alpha 属于 文法符号集合的克林闭包,且至少包含一个非终结符,被称为产生式的左部
beta 也属于文法符号集合的克林闭包,称为产生式的右部
S 属于非终结符,为开始符号,表示文法中最大的语法成分,如 S = <句子>
产生式的简写
对于以下拥有相同左部的产生式:
α
→
β
1
,
α
→
β
2
,
α
→
β
3
,
\alpha \rightarrow \beta1, \alpha \rightarrow \beta2, \alpha \rightarrow \beta3,
α→β1,α→β2,α→β3,
可以表示为:
α
→
β
1
∣
β
2
∣
β
3
\alpha \rightarrow \beta1|\beta2|\beta3
α→β1∣β2∣β3
各 beta 称为 alpha 的候选式
以下符号为终结符
- 字母表中排在前面的小写字母
- 运算符
- 标点符号
- 数字
- 粗体字符串
以下符号为非终结符
- 字母表中排在前面的大写字母
- 字母 S 通常用来表示开始符号
- 斜体
- 代表特殊含义(通常为程序构造)的大写字母,如 E(expression)
语言的定义
推导与规约
直接推导
给定文法 G,产生式包含 alpha 推导 beta,则对于符号串 γ α δ \gamma\alpha\delta γαδ可以重写为 γ β δ \gamma\beta\delta γβδ,记作: γ α δ → γ β δ \gamma\alpha\delta \rightarrow \gamma\beta\delta γαδ→γβδ,称前者直接推导出后者,若经过 n 次直接推导则记为 n 步推导: → n \rightarrow^n →n
规约就是推导的逆过程
句型与句子
- S → ∗ α S \rightarrow^* \alpha S→∗α,且 alpha 属于文法符号集合,则称 alpha 是 G 的一个句型,一个句型既可以包含终结符,也可以包含非终结符,也可以为空
- 若句型不包含非终结符,则称为句子
语言
由开始符号 S 推导出的所有句子 w 的集合被称为是该文法生成的语言,L(G)
文法的分类
0 型文法
- 无限制文法,只有左部至少包含一个非终结符
- 由 0 型文法 G 生成的语言 L(G)为 0 型语言
1 型文法
- 上下文有关文法 CSG
- 左部字符串长度<右部字符串长度
- 产生式中不包含空产生式
- 上下文有关语言
2 型文法
- 上下文无关文法 CFG
- 产生式的左部必须都是非终结符
3 型文法
- 正则文法 RG
- 左部必须为非终结符
- 右线性文法:产生式的右部为终结符或仅包含一个非终结符,且该非终结符必须位于其他终结符右侧
- 左线性文法:产生式的右部为终结符或仅包含一个非终结符,且该非终结符必须位于其他终结符左侧
四种文法之间的关系
0 >1>2>3
CFG 的分析树
- 根结点为文法开始符号
- 内部结点为对产生式的表示,该结点为左部,该结点的子节点从左至右为产生式的右部
- 叶节点既可以是终结符也可以是非终结符,从左至右排列的叶节点被称为是这棵树的产出或者边缘
- 对于一个推导过程中的每一个句型,都可以构造出一个边缘为该句型的分析树
- 对于一个特定句型,分析树中每一棵子树的边缘都为该句型的一个
red:短语
若子树只有父子两代节点,那么该子树的边缘就称为句型的直接短语,如 E+E
二义性文法
需要添加消除歧义的规则:每个 else 与最近的 if 匹配
red:对于任意一个上下文无关文法,不存在一个算法来判断其是无二义性的,但是可以给出充分条件使满足条件的文法不具有二义性