以下为参考课件与《编译技术》(张莉等著)的个人整理,若有错误欢迎指出
第二章 文法和语言
文章目录
预备知识:
字母表与符号串(离散数学)
设A为字符串集合,如果A是符号表,其闭包 A ∗ = ∪ ∞ i = 0 A i A^*=\underset{i=0}{\overset{\infty}{\cup}}A^i A∗=i=0∪∞Ai其实就是符号表生成的所有符号串的集合( A i A^i Ai就是长度为 i i i的字符串)
约定:
下文出现的a、b……U、V、W、Z表示符号或者符号集
x、y、t、z……表示符号串
A、B……表示符号串集合
一、文法的非形式讨论
- 文法(语法)是对语言结构的定义与描述。
- 语法规则: 通过建立一组规则, 来描述句子的语法结构。规定用“ ::=”表示“ 由…组成” ( 或“ 定义为…” ),如
<句子>::=<主语><谓语
- 合法的句子(由规则推导):将所有带
<>
的(非终结符)根据规则替代,最后全变成终结符号【从左到右推即可,也可用语法树】
语法结构正确但不保证语义
二、文法的形式定义
1、文法的形式定义
文 法 G = ( V n , V t , P , Z ) , 其 中 : V n : 非 终 结 符 号 集 V t : 终 结 符 号 集 ( 句 子 ∈ V t ∗ ) P : 产 生 式 或 规 则 的 集 合 Z : 开 始 符 号 ( 识 别 符 号 ) Z ∈ V n \begin{aligned} &文法G=( V_n, V_t, P, Z),其中:\\ &V_n: 非终结符号集 \\ &V_t: 终结符号集(句子\in V_t^{*})\\ &P: 产生式或规则的集合\\ &Z: 开始符号( 识别符号) Z \in V_n \\ \end{aligned} 文法G=(Vn,Vt,P,Z),其中:Vn:非终结符号集Vt:终结符号集(句子∈Vt∗)P:产生式或规则的集合Z:开始符号(识别符号)Z∈Vn
规则的形式定义
规
则
是
一
个
有
序
对
(
U
,
x
)
,
U
∈
V
n
,
x
∈
V
∗
,
通
常
写
为
:
U
:
:
=
x
或
U
⟶
x
,
,
∣
U
∣
=
1
,
∣
x
∣
≥
0
\begin{aligned} &规则是一个有序对(U, x),U \in V_n,x \in V^*, 通常写为:\\ &U ::= x 或U \longrightarrow x ,,| U| = 1,|x| \ge 0 \\ \end{aligned}
规则是一个有序对(U,x),U∈Vn,x∈V∗,通常写为:U::=x或U⟶x,,∣U∣=1,∣x∣≥0
说明:有些规则含有相同左部,可以用|
连接在一起
2、推导的形式定义
文 法 G : v = x U y , w = x u y , 其 中 x 、 y 、 u ∈ V ∗ , U ∈ V n 。 若 U : : = u ∈ P , 则 v ⟶ w 。 特 别 地 , 若 x = y = ε , 有 U : : = u , 则 U − > u \begin{aligned} &文法G: v= xUy, w= xuy,\quad其中x、 y 、u\in V^* , U\in V_n 。\\ &若U ::= u \in P, 则v \longrightarrow w。\\ &特别地,若x= y= \varepsilon, 有U ::= u, 则U -> u \end{aligned} 文法G:v=xUy,w=xuy,其中x、y、u∈V∗,U∈Vn。若U::=u∈P,则v⟶w。特别地,若x=y=ε,有U::=u,则U−>u
对于多步推导,可以缩写为
⟹
+
\overset{+}{\Longrightarrow}
⟹+,其形式定义如下:
文
法
G
,
u
0
,
u
1
,
u
2
,
…
…
,
u
n
∈
V
+
若
v
=
u
0
⟹
u
1
⟹
u
2
…
…
⟹
u
n
=
w
,
则
v
⟹
+
G
w
\begin{aligned} &文法G, u_0, u_1, u_2, ……, u_n ∈ V^+\\ &若 v= u_0 \Longrightarrow u_1\Longrightarrow u_2 …… \Longrightarrow u_n= w,则 v \underset{G}{\overset{+}{\Longrightarrow}} w \end{aligned}
文法G,u0,u1,u2,……,un∈V+若v=u0⟹u1⟹u2……⟹un=w,则vG⟹+w
进一步有
⟹
∗
\overset{*}{\Longrightarrow}
⟹∗,个人理解为推导所得+自身,形式定义如下:
文
法
G
,
v
,
w
∈
V
+
若
v
⟹
+
G
w
或
v
=
w
,
则
v
⟹
∗
G
w
\begin{aligned} &文法G,v,w ∈ V^+\\ &若 v \underset{G}{\overset{+}{\Longrightarrow}} w 或v=w, 则v \underset{G}{\overset{*}{\Longrightarrow}} w \end{aligned}
文法G,v,w∈V+若vG⟹+w或v=w,则vG⟹∗w
规范推导(最右推导,即先推右边的非终结符)定义:
有
x
U
y
⟹
x
u
y
,
若
y
∈
V
t
∗
,
则
此
推
导
为
规
范
的
,
记
为
x
U
y
=
∣
=
>
x
u
y
\begin{aligned} &有xUy \Longrightarrow xuy, 若 y\in V_t^*,则此推导为规范的, 记为 xUy =|=> xuy \end{aligned}
有xUy⟹xuy,若y∈Vt∗,则此推导为规范的,记为xUy=∣=>xuy
同理规范推导也有缩写:
若
有
v
=
u
0
=
∣
=
>
u
1
=
∣
=
>
…
…
=
∣
=
>
u
n
=
w
,
则
v
=
∣
=
>
+
w
\begin{aligned} &若有v = u_0 =|=> u_1=|=> ……=|=> u_n= w,则 v \stackrel+{=|=>} w \end{aligned}
若有v=u0=∣=>u1=∣=>……=∣=>un=w,则v=∣=>+w
3、语言的形式定义
给 定 文 法 G [ Z ] ( 1 ) 句 型 : x 是 句 型 ⇔ Z ⟹ ∗ x , 且 x ∈ V ∗ ; ( 2 ) 句 子 : x 是 句 子 ⇔ Z ⟹ + x , 且 x ∈ V t ∗ ; ( 3 ) 语 言 : L ( G [ Z ] ) = { x ∣ x ∈ V t ∗ , Z ⟹ + x } , 即 句 子 的 集 合 ; \begin{aligned} &给定文法G[Z]\\ &(1)句型: x是句型 \Leftrightarrow Z \overset{*}{\Longrightarrow} x , 且 x\in V^* ;\\ &(2)句子: x是句子 \Leftrightarrow Z \overset{+}{\Longrightarrow} x , 且 x∈ V_t^* ;\\ &(3)语言: L(G[Z])=\{x | x\in V_t^*, Z \overset{+}{\Longrightarrow} x \} ,即句子的集合;\\ \end{aligned} 给定文法G[Z](1)句型:x是句型⇔Z⟹∗x,且x∈V∗;(2)句子:x是句子⇔Z⟹+x,且x∈Vt∗;(3)语言:L(G[Z])={x∣x∈Vt∗,Z⟹+x},即句子的集合;
Z是识别符号,强调要从Z开始推
可以用形式语言的理论证明:
已知文法,通过推导可以求语言
已知语言,可以构造多种文法
等价文法的定义:
G 和 G ’ 是 两 个 不 同 的 文 法 , 若 L ( G ) = L ( G ’ ) , 则 G 和 G ’ 为 等 价 文 法 。 G和G’是两个不同的文法, 若 L(G) = L(G’) ,则G和G’为等价文法。 G和G’是两个不同的文法,若L(G)=L(G’),则G和G’为等价文法。
编译感兴趣的是给定句子 x x x和文法 G G G,求 x ∈ L ( G ) x\in L(G) x∈L(G)
4、递归文法
(1)递归规则: 规则右部有与左部相同的符号( 非终结符)
(2)分类:
对
于
U
:
:
=
x
U
y
若
x
=
ε
,
即
U
:
:
=
U
y
,
左
递
归
若
y
=
ε
,
即
U
:
:
=
x
U
,
右
递
归
若
x
,
y
≠
ε
,
即
U
:
:
=
x
U
y
,
自
嵌
入
递
归
\begin{aligned} &对于 U::= xUy\\ &\qquad若x=\varepsilon, 即U::= Uy, 左递归\\ &\qquad若y=\varepsilon , 即U::= xU, 右递归\\ &\qquad若x, y\neq\varepsilon, 即U::= xUy, 自嵌入递归\\ \end{aligned}
对于U::=xUy若x=ε,即U::=Uy,左递归若y=ε,即U::=xU,右递归若x,y=ε,即U::=xUy,自嵌入递归
(3)对应的递归文法分类:
文
法
G
,
存
在
U
∈
V
n
若
U
⟹
+
…
U
…
,
则
G
为
递
归
文
法
若
U
⟹
+
U
…
,
则
G
为
左
递
归
文
法
若
U
⟹
+
…
U
,
则
G
为
右
递
归
文
法
\begin{aligned} &文法G, 存在U \in V_n\\ &\qquad若U \stackrel+\Longrightarrow …U…, 则G为递归文法\\ &\qquad若U \stackrel+\Longrightarrow U…, 则G为左递归文法\\ &\qquad若U \stackrel+\Longrightarrow …U, 则G为右递归文法\\ \end{aligned}
文法G,存在U∈Vn若U⟹+…U…,则G为递归文法若U⟹+U…,则G为左递归文法若U⟹+…U,则G为右递归文法
注: U U U不一定是识别符号,所以箭头后方不能说是句型
(4)递归文法优点:可用有穷条规则 定义无穷语言
左递归文法缺点:不能自顶向下语法分析(死循环)
5、句型的短语
(1)短语和简单短语
给
定
文
法
G
[
Z
]
,
w
=
x
u
y
∈
V
+
(
说
明
w
是
非
空
串
)
,
为
该
文
法
的
句
型
;
若
Z
⟹
∗
x
U
y
,
且
U
⟹
+
u
,
则
u
是
句
型
w
相
对
于
U
的
短
语
;
若
Z
⟹
∗
x
U
y
,
且
U
⟹
u
,
则
u
是
句
型
w
相
对
于
U
的
简
单
短
语
。
其
中
U
∈
V
n
,
u
∈
V
+
,
x
,
y
∈
V
∗
\begin{aligned} &给定文法G[Z], w = xuy\in V^+(说明w是非空串), 为该文法的句型;\\ &若 Z \stackrel*\Longrightarrow xUy, 且U \stackrel+\Longrightarrow u, 则u是句型w相对于U的短语;\\ &若 Z \stackrel*\Longrightarrow xUy, 且U \Longrightarrow u, 则u是句型w相对于U的简单短语。\\ &其中U \in V_n, u ∈ V^+, x , y \in V^* \end{aligned}
给定文法G[Z],w=xuy∈V+(说明w是非空串),为该文法的句型;若Z⟹∗xUy,且U⟹+u,则u是句型w相对于U的短语;若Z⟹∗xUy,且U⟹u,则u是句型w相对于U的简单短语。其中U∈Vn,u∈V+,x,y∈V∗
直观理解: 短语是前面句型中的某个非终结符所能推出的符号串。简单短语就是某个非终结符能一步推出的。
- 任何句型本身一定是相对于识别符号Z的短语( x , y = ε x,y=\varepsilon x,y=ε)。
(2)句柄
定义:任一句型的最左简单短语称为该句型的句柄
短语、简单短语、句柄可结合语法树来理解(详见下文)
三、语法树
1、语法树定义
句子( 句型) 结构的图示表示法,它是有向图,由结点(终结符或非终结符)和有向边组成。
自顶向下生成即可,推导序列不唯一;
有的文法可能会形状不唯一
2、子树
定理(找短语的方法):
某子树的末端结点按自左向右顺序为句型中的符号串, 则该符号串为该句型的相对于该子树根的短语 。
why:
子树跟作为U,子树末端构成u,必然有 U ⟹ + u U\stackrel+\Longrightarrow u U⟹+u。然后再把子树根左边末端节点当 x x x,右边当 y y y,句型是 x u y xuy xuy,且有 Z ⟹ ∗ x U y Z\stackrel*\Longrightarrow xUy Z⟹∗xUy。
方法总结
(1)生成语法树
逐步推导即可,所有末端从左到右就是句型
(2)找短语
找出所有子树,末端即为相对于该子树跟的短语
(3)再判断简单短语
能一步推出的,即末端就是子树跟的直接孩子
(4)找句柄
最左边(无视层数,就找最左)的简单短语
3、树与推导
自上而下生成树 ⇔ \Leftrightarrow ⇔自左向右的推导
自下而上修剪末端节点 ⇔ \Leftrightarrow ⇔自右向左的规约
- 规范规约就是每次剪掉句柄(最左简单短语),是规范推导的逆过程,所得的句型称为规范句型。
4、文法的二义性
三个等价定义:
- 若对于一个文法的某一句子( 或句型)存在两棵不同的语法树, 则该文法是二义性文法,否则是无二义性文法。
- 若一个文法的某句子存在两个不同的规范推导, 则该文法是二义性的, 否则是无二义性的。
- 若一个文法的某规范句型的句柄不唯一(即不同的规范规约), 则该文法是二义性的, 否则是无二义性的。
因此要无二义性,需要增加文法限制条件或者在编译中增加规则
四、其他
1、句子分析
给定 G [ Z ] : S ∈ V t ∗ G[Z]: S \in V_t^* G[Z]:S∈Vt∗,判定是否有 $S\in L (G[Z] ) ? $——词法和语法分析
2、有关文法的实用限制
- 有害规则:如 U : : = U U::=U U::=U引起二义性的
- 多余规则:
- 有不可达符号,即该规则的左部非终结符不出现在任何句型中
- 有不活动符号,即使用后推不出任何终结符号串
若无有害或多余规则,则文法是压缩过的
3、文法的其他表示方法
(1)BNF: < > : : = ∣ <>\quad::=\quad| <>::=∣
扩充的BNF:有 < > : : = ∣ { } [ ] ( ) <>\quad::= \quad|\quad\{\}\quad[]\quad() <>::=∣{}[]()。其中 { } n m \{\}_n^m {}nm表示 n − m ( n ≥ 0 ) n-m(n\ge0) n−m(n≥0)个, [ ] [] []表示可选项。
(2)语法图
4、形式语言
-
0型文法(短语结构文法):规则左右都可以是字符串, u : : = v 其 中 u ∈ V + , v ∈ V ∗ u ::= v 其中 u\in V^+, v\in V^* u::=v其中u∈V+,v∈V∗
-
1型文法(上下文敏感):$xUy ::= xuy,其中 U\in V_n,
x、 y、 u\in V^* $ -
2型文法(上下文无关): U : : = u U::=u U::=u,即上述讨论的文法
-
3型文法(正则文法):一个非终结符号推出终结符 或 终结符+一个非终结符
产生的语言是越来越小的,即 L 0 ⊃ L 1 ⊃ L 2 ⊃ L 3 L_0 \supset L_1 \supset L_2 \supset L_3 L0⊃L1⊃L2⊃L3