Skip to content

第 2 章 文法与语言

2.1. 符号串与语言

1. 字母表

定义

字母表 Σ\Sigma 是一个有穷符号集合

  • 符号:字母、数字、标点符号

字母表上的运算

  • 乘积
    • Σ1Σ2={ab∣a∈Σ1,b∈Σ2}\Sigma_1\Sigma_2=\{ab|a\in\Sigma_1,b\in\Sigma_2\}
  • n\displaystyle{ n } 次幂
    • Σ0={ε}\Sigma^0=\{\varepsilon\}
    • Σn=Σn−1Σ,n⩾1\Sigma^n=\Sigma^{n-1}\Sigma, n\geqslant 1
    • 即为长度为 n\displaystyle{ n } 的符号串构成的集合
  • 正闭包
    • Σ+=Σ∪Σ2∪Σ3∪⋯\Sigma^{+}=\Sigma\cup\Sigma^2\cup\Sigma^3\cup\cdots
  • 闭包
    • Σ∗=Σ0∪Σ∪Σ2∪Σ3∪⋯\Sigma^{*}=\Sigma^0\cup\Sigma\cup\Sigma^2\cup\Sigma^3\cup\cdots

2. 串

定义

  • 设 Σ\Sigma 为一个字母表,∀x∈Σ∗\forall x\in\Sigma^{*},x\displaystyle{ x } 称为 Σ\Sigma 上的一个串。
    • 串是字母表中符号的一个有穷序列
  • 串的长度 ∣s∣\displaystyle{ \left| s \right| },指符号的个数
  • 空串 ∣ε∣|\varepsilon|

连接

x\displaystyle{ x } 和 y\displaystyle{ y } 是串,则 x\displaystyle{ x } 和 y\displaystyle{ y } 的连接—— xy\displaystyle{ x y },对于非空不相等串有 xy≠yxxy\ne yx

空串是连接运算的单位元,εs=sε=s\varepsilon s=s\varepsilon=s

幂

{s0=εsn=sn−1s,n⩾1\begin{cases} s^0=\varepsilon\\ s^n=s^{n-1}s,n\geqslant 1 \end{cases}

2.2. 文法定义

1. 文法的形式化定义

文法

G=(VT,VN,P,Z)\displaystyle{ G = \left( V _{ T } , V _{ N } , P , Z \right) }

  • VT\displaystyle{ V _{ T } } 终结符集合,为非空有穷集合
    • 终结符是文法所定义的语言的基本符号,有时也称为 token
  • VN\displaystyle{ V _{ N } } 非终结符集合,为非空有穷集合
    • 非终结符有时也称为“语法变量”
      • VT∩VN=∅V_T\cap V_N=\varnothing
      • VT∪VNV_T\cup V_N 文法符集合
  • P\displaystyle{ P } 产生式集合
    • 产生式描述了将终结符和非终结符组成串的方法
    • 产生式的一般形式 α→β\alpha\rightarrow\beta 或 α::=β\alpha ::=\beta,读作 α\alpha 定义为 β\beta
      • α∈(VT∪VN)+\alpha\in(V_T\cup V_N)^{+} 且 α\alpha 中至少包含 VN\displaystyle{ V _{ N } } 中的一个元素,称为产生式的头或左部
      • β∈(VT∪VN)∗\beta\in(V_T\cup V_N)^{*} 称为产生式的体或者右部
  • Z\displaystyle{ Z } 开始符号或识别符号
    • 第一条产生式规则的左部是识别符号

不引起歧义的前提下,可以只写产生式

产生式的简写

对一组有相同左部的产生式

α::=β1,α::=β2,⋯ ,α::=βn\alpha::=\beta_1,\alpha::=\beta_2,\cdots,\alpha::=\beta_n

可以简写为

α::=β1∣β2∣⋯∣βn\alpha::=\beta_1|\beta_2|\cdots|\beta_n

βi(i=1,2,⋯ ,n)\beta_i(i=1,2,\cdots,n) 称为 α\alpha 的候选式

2. 语言的形式化定义

推导与归约

给定文法 G=(VT,VN,P,Z)\displaystyle{ G = \left( V _{ T } , V _{ N } , P , Z \right) },如果 α→β∈P\alpha\rightarrow\beta\in P,那么可以将符号串 γαδ\gamma\alpha\delta 中 α\alpha 替换为 β\beta,即将 γαδ\gamma\alpha\delta 重写为 γβδ\gamma\beta\delta 记作

γαδ⇒γβδ\gamma\alpha\delta\Rightarrow\gamma\beta\delta

称文法中的符号串 γαδ\gamma\alpha\delta 直接推导出 γβδ\gamma\beta\delta

  • 其中,从 γαδ\gamma\alpha\delta 推导出γβδ\gamma\beta\delta 只用了一次推导,称之为直接推导,或者称γβδ\gamma\beta\delta 直接归约到 γαδ\gamma\alpha\delta

简言之,用产生式右部替换产生式左部

若存在推导序列

α0⇒α1⇒α2⇒⋯⇒αn\alpha_0\Rightarrow\alpha_1\Rightarrow\alpha_2\Rightarrow\cdots\Rightarrow\alpha_n

称串 α0\alpha_0 经过 n\displaystyle{ n } 步推导出 αn\alpha_n 可简记为 α0⇒nαn\alpha_0\overset{n}{\Rightarrow}\alpha_n,这个序列是一个从 α0\alpha_0 到 αn\alpha_n 的长度为 n\displaystyle{ n } 的推导

  • α⇒0α\alpha\overset{0}{\Rightarrow}\alpha
  • α0⇒+αn\alpha_0\overset{+}{\Rightarrow}\alpha_n 表示经过正数步推导
  • α0⇒∗αn\alpha_0\overset{*}{\Rightarrow}\alpha_n 表示经过若干(可以是 0)步推导

归约是推导的逆过程

句型和句子

  • 如果 Z⇒∗α,α∈(VT∪VN)∗Z\overset{*}{\Rightarrow}\alpha,\alpha\in(V_T\cup V_N)^{*},则称 α\alpha 是文法 G\displaystyle{ G } 的一个句型
    • 一个句型中既可包含终结符,又可包含非终结符,也可能是空串
  • 如果 Z⇒∗α,α∈VT∗Z\overset{*}{\Rightarrow}\alpha,\alpha\in V_T^{*},则称 α\alpha 是 G\displaystyle{ G } 的一个句子
Note
  • 句型中可以包含非终结符
  • 句子中不可以包含非终结符

语言

由文法 G\displaystyle{ G } 的开始符号 Z\displaystyle{ Z } 推导出的所有句子构成的集合称为文法 G\displaystyle{ G } 生成的语言,记为 L(G)\displaystyle{ L \left( G \right) }

L(G)={x∣Z⇒+x,x∈VT∗}L(G)=\{x|Z\overset{+}{\Rightarrow}x,x\in V_T^*\}

由语言的定义可知,当文法给定时,语言也就确定了。语言 L(G)\displaystyle{ L \left( G \right) } 是 VT⋅\displaystyle{ V _{ T } ^{ \cdot } } 的子集,L(G)\displaystyle{ L \left( G \right) } 中的每个符号均由非终结符组成,且该符号串能由 Z\displaystyle{ Z } 推导出来。

3. 短语 直接短语 句柄

设 G[Z]\displaystyle{ G \left[ Z \right] } 是一个文法,假定 αβδ\alpha\beta\delta 是 G\displaystyle{ G } 的一个句型,如果有

Z⇒+αAδ,A⇒+βZ\overset{+}{\Rightarrow}\alpha A\delta, A\overset{+}{\Rightarrow}\beta

则称 β\beta 是句型 αβδ\alpha\beta\delta 相对于非终结符 A\displaystyle{ A } 的短语。特别的,如果有 A\displaystyle{ A } 直接推导到 β\beta,则称 β\beta 是句型 αβδ\alpha\beta\delta 相对于产生式规则 A→βA\rightarrow\beta 的直接短语,一个句型的最左直接短语称为该句型的句柄。

Caution

短语、直接短语、句柄一定是相对于某一句型的

例 设有文法 G[E]\displaystyle{ G \left[ E \right] }

E→E+T∣E−T∣TT→T∗F∣T/F∣FF→(E)∣i\begin{aligned} E&\rightarrow E+T \mid E-T \mid T\\ T&\rightarrow T*F \mid T/F \mid F\\ F&\rightarrow (E) \mid i \end{aligned}

假设句型 F−T⋅(E−T)\displaystyle{ F - T \cdot \left( E - T \right) } 的推导过程

E⇒E−T⇒E−T∗F⇒E−T∗(E)⇒E−T∗(E−T)⇒T−T∗(E−T)⇒F−T∗(E−T)\begin{aligned} E&\Rightarrow E-T\Rightarrow E-T*F\Rightarrow E-T*(E)\Rightarrow E-T*(E-T)\\ &\Rightarrow T-T*(E-T)\Rightarrow F-T*(E-T) \end{aligned}

语法分析树如下

其中

  • 最左边的 F\displaystyle{ F } 为句柄
  • 短语有  {F,E−T,(E−T),T⋅(E−T),F−T⋅(E−T) }\displaystyle{ \ \left\lbrace F , E - T , \left( E - T \right) , T \cdot \left( E - T \right) , F - T \cdot \left( E - T \right) \ \right\rbrace }
  • 直接短语有  {F,E−T }\displaystyle{ \ \left\lbrace F , E - T \ \right\rbrace }

4. 规范推导和规范归约

一般最右推导为规范推导,最左归约为规范归约

  • 最右推导的逆过程为最左归约
  • 最左推导的逆过程为最右归约

最右推导就类似如下递归

def f(root):
process(root)
f(root.right)
f(root.left)

2.3. 语法分析树与文法的二义性

1. 语法分析树

例子见上面

有助于理解一个句子语法结构的层次

G[Z]=(VN,VT,P,Z)\displaystyle{ G \left[ Z \right] = \left( V _{ N } , V _{ T } , P , Z \right) } 是一个上下文无关文法

  • 根节点标记为 Z\displaystyle{ Z }
  • 根节点外的每一个节点也有一个标记,是 VN∪VT∪{ε}V_N\cup V_T\cup\{\varepsilon\} 中的符号
  • 每一个内部节点的标记 A\displaystyle{ A } 必在 VN\displaystyle{ V _{ N } } 中
  • 若某个内部节点标记为 A\displaystyle{ A },其孩子节点的标记从左到右分别为 X1,X2,⋯XnX_1,X_2,\cdots X_n,则 A→X1X2⋯XnA\rightarrow X_1 X_2\cdots X_n 必为 P\displaystyle{ P } 中的一条产生式规则
  • 若结点有标记 ε\varepsilon,则该节点为叶子,且是它父亲唯一的孩子

对于文法 G[E]\displaystyle{ G \left[ E \right] }

E→E+T∣E−T∣TT→T∗F∣T/F∣FF→(E)∣i\begin{aligned} E&\rightarrow E+T \mid E-T \mid T\\ T&\rightarrow T*F \mid T/F \mid F\\ F&\rightarrow (E) \mid i \end{aligned}

可以发现,先有的规则,运算符优先级更低;而对应到二叉树中,下层运算未结束,上层的运算不能进行。

2. 文法的二义性

如果一个文法存在某个句子对应两棵不同的语法树,则这个文法是二义的。即,若一个文法中存在某个句子,它有两个不同的最左(右)推导,则它是二义的。

例 设 G[E]\displaystyle{ G \left[ E \right] }

E→i∣E+E∣E∗E∣(E)E\rightarrow i \mid E+E \mid E*E \mid (E)

关于 i⋅i+i\displaystyle{ i \cdot i + i } 有两种不同的最右推导

从该例来看,因为不同优先级的运算符都写在了一个推导语句中,前面提到了规则写在前面的优先级更低一些,此处的二义性就源自混淆了优先级。

3. 二义性的消除

  • 改写原有的文法,构造一个等价的新文法,把排除二义性的规则合并到原文法中
  • 不改变原有文法,附加限制性条件
    • 运算符优先级顺序
    • 结合规则(左结合、右结合)

4. 文法的化简

  • 若一个非终结符不能推导出终结符号串,则该非终结符是无用的
    • 函数递归没有出口
  • 若一个符号不能出现在文法的任何句型中,则该符号是无用的
    • 定义了函数 func 但是从来没有被调用

文法化简思路源于语言的生成

  • 从识别符号开始进行推导,若推导出的某句型包括某个不能推导出终结符号的非终结符,则删除包括该非终结符号的所有产生式规则
    • 递归没有出口
  • 从终结符号逆向归约,若归约得到的某个非终结符不能归约到文法的符号,则删除包括该非终结符的所有产生式规则
    • 归约没有溯源(函数没有定义)
  • 删除不能出现在句型中的所有符号对应的产生式规则
    • 函数没有调用

5. 语言的分类

文法包含的广泛程度 0>1>2>3\displaystyle{ 0 > 1 > 2 > 3 }

0 型文法

若文法 G[Z]=(VN,VT,P,Z)\displaystyle{ G \left[ Z \right] = \left( V _{ N } , V _{ T } , P , Z \right) } 中的每个产生式规则为如下形式:

α→β\alpha\rightarrow\beta

式中,α∈(VT∪VN)∗\alpha\in(V_T\cup V_N)^* 且至少包含一个非终结符号,而 β∈(VT∪VN)∗\beta\in(V_T\cup V_N)^* 则 G[Z]\displaystyle{ G \left[ Z \right] } 为 0 型文法

0 型文法相当于图灵机,未加任何限制,识别能力最强

1 型文法(上下文敏感文法)

若文法 G[Z]=(VN,VT,P,Z)\displaystyle{ G \left[ Z \right] = \left( V _{ N } , V _{ T } , P , Z \right) } 中的每个产生式规则为如下形式:

αAβ→αvβ\alpha A\beta\rightarrow\alpha v\beta

式中,α,β∈(VN∪VT)∗\alpha,\beta\in(V_N\cup V_T)^*,A∈VNA\in V_N,v∈(VT∪VN)+v\in(V_T\cup V_N)^+,则 G[Z]\displaystyle{ G \left[ Z \right] } 为 1 型文法

2 型文法(上下文无关文法)

若文法 G[Z]=(VN,VT,P,Z)\displaystyle{ G \left[ Z \right] = \left( V _{ N } , V _{ T } , P , Z \right) } 中的每个产生式规则为如下形式:

A→vA\rightarrow v

式中,A∈VNA\in V_N,v∈(VT∪VN)+v\in(V_T\cup V_N)^+,则 G[Z]\displaystyle{ G \left[ Z \right] } 为 2 型文法

3 型文法(正规文法)

若文法 G[Z]=(VN,VT,P,Z)\displaystyle{ G \left[ Z \right] = \left( V _{ N } , V _{ T } , P , Z \right) } 中的每个产生式规则为如下形式:

A→αBorA→αA\rightarrow\alpha B\quad\text{or}\quad A\rightarrow\alpha

式中,A,B∈VNA,B\in V_N,α∈VT\alpha\in V_T,则 G[Z]\displaystyle{ G \left[ Z \right] } 为右线性文法

若文法 G[Z]=(VN,VT,P,Z)\displaystyle{ G \left[ Z \right] = \left( V _{ N } , V _{ T } , P , Z \right) } 中的每个产生式规则为如下形式:

A→BαorA→αA\rightarrow B\alpha \quad\text{or}\quad A\rightarrow\alpha

式中,A,B∈VNA,B\in V_N,α∈VT\alpha\in V_T,则 G[Z]\displaystyle{ G \left[ Z \right] } 为左线性文法