注:前言、目录见 https://blog.csdn.net/qq_44220418/article/details/108428971
文章目录
三、文法和语言的分类
1、Chomsky语言分类法
(1).0型文法
对文法
G
\text{G}
G,若
P
\text{P}
P 中规则都具有下列形式:
α
→
β
α→β
α→β
其
中
,
{
α
∈
V
∗
,
且
至
少
含
有
一
个
非
终
结
符
(
强
调
α
不
能
为
空
串
)
β
∈
V
∗
其中,\begin{cases} α ∈ \text{V}^*,且至少含有一个非终结符\pmb{\color{AA66FF}(强调α不能为空串)} \\ β ∈ \text{V}^* \end{cases}
其中,{α∈V∗,且至少含有一个非终结符(强调α不能为空串)(强调α不能为空串)(强调α不能为空串)β∈V∗
则称该文法
G
\text{G}
G 为
(
C
h
o
m
s
k
y
)
0
\pmb{(Chomsky) \; 0}
(Chomsky)0(Chomsky)0(Chomsky)0型文法 或 短语结构文法,缩写为
PSG
\pmb{\text{PSG}}
PSGPSGPSG
0 \pmb{0} 000型文法相应的语言称为 0 \pmb{0} 000型语言 或 短语结构语言,又称 递归可枚举集
(2).1型文法
对文法
G
\text{G}
G,若
P
\text{P}
P 中规则都具有下列形式:
x
U
y
→
x
u
y
x\text{U}y → xuy
xUy→xuy
其
中
,
{
U
∈
V
N
x
,
y
∈
V
∗
u
∈
V
+
其中,\begin{cases} \text{U} ∈ \text{V}_\text{N} \\ x, y ∈ \text{V}^* \\ u ∈ \text{V}^+ \end{cases}
其中,⎩⎪⎨⎪⎧U∈VNx,y∈V∗u∈V+
则称该文法
G
\text{G}
G 为
(
C
h
o
m
s
k
y
)
1
\pmb{(Chomsky) \; 1}
(Chomsky)1(Chomsky)1(Chomsky)1型文法 或 上下文有关文法(上下文敏感文法),缩写为
CSG
\pmb{\text{CSG}}
CSGCSGCSG
其中的
x
\pmb{x}
xxx 即为上文,
y
\pmb{y}
yyy 即为下文
1 \pmb{1} 111型文法相应的语言称为 1 \pmb{1} 111型语言 或 上下文有关语言
(3).2型文法
对文法
G
\text{G}
G,若
P
\text{P}
P 中规则都具有下列形式:
α
→
β
α→β
α→β
其
中
,
{
α
∈
V
N
β
∈
V
∗
其中,\begin{cases} α ∈ \text{V}_\text{N} \\ β ∈ \text{V}^* \\ \end{cases}
其中,{α∈VNβ∈V∗
则称该文法
G
\text{G}
G 为
(
C
h
o
m
s
k
y
)
2
\pmb{(Chomsky) \; 2}
(Chomsky)2(Chomsky)2(Chomsky)2型文法 或 上下文无关文法,缩写为
CFG
\pmb{\text{CFG}}
CFGCFGCFG
2 \pmb{2} 222型文法相应的语言称为 2 \pmb{2} 222型语言 或 上下文无关语言
大多数程序设计语言的文法是上下文无关的
(4).3型文法
对文法
G
\text{G}
G,若
P
\text{P}
P 中规则都具有下列形式:
A
→
a
或
A
→
B
a
‾
(
左
线
性
)
或
A
→
a
或
A
→
a
B
‾
(
右
线
性
)
\begin{aligned} \text{A}→ a \; 或 \; & \underline{\text{A} → \text{B}a} \\ & (\pmb{左线性}) \end{aligned} \quad \pmb{或} \quad \begin{aligned} \text{A}→ a \; 或 \; & \underline{\text{A} → a\text{B}} \\ & (\pmb{右线性}) \end{aligned}
A→a或A→Ba(左线性左线性左线性)或或或A→a或A→aB(右线性右线性右线性)
其
中
,
{
a
∈
V
T
A
,
B
∈
V
N
其中,\begin{cases} a ∈ \text{V}_\text{T} \\ \text{A}, \text{B} ∈ \text{V}_\text{N} \\ \end{cases}
其中,{a∈VTA,B∈VN
则称该文法
G
\text{G}
G 为
(
C
h
o
m
s
k
y
)
3
\pmb{(Chomsky) \; 3}
(Chomsky)3(Chomsky)3(Chomsky)3型文法 或 正则文法(正规文法),又称有穷状态文法,缩写为
RG
\pmb{\text{RG}}
RGRGRG
正则文法按其定义的两种情况可分为左线性文法、右线性文法
3 \pmb{3} 333型文法相应的语言称为 3 \pmb{3} 333型语言 或 正则语言(正规语言)
Tips:正则文法是我们此后要学习的【词法分析】的基础,本笔记在以后的题目中将统一使用左线性文法(左线性与右线性的形状不一样,有些算法也完全不一样)
(5).举例
示
例
1
\pmb{示例1}
示例1示例1示例1
文
法
G
1
:
=
(
{
S
,
A
,
B
}
,
{
a
,
b
,
c
}
,
P
1
,
S
)
\quad \quad 文法\text{G}_1 \; : \; = ( \{ \text{S}, \text{A}, \text{B} \}, \{ a, b, c \}, \text{P}_1, \text{S})
文法G1:=({S,A,B},{a,b,c},P1,S)
其
中
P
1
:
{
S
→
B
c
∣
S
c
B
→
A
b
∣
B
b
A
→
A
a
∣
a
\quad \quad 其中\text{P}_1 \; : \;\begin{cases} \text{S} → \text{B}c \; | \; \text{S}c \\ \text{B} → \text{A}b \; | \; \text{B}b \\ \text{A} → \text{A}a \; | \; a \\ \end{cases}
其中P1:⎩⎪⎨⎪⎧S→Bc∣ScB→Ab∣BbA→Aa∣a
显
然
,
可
以
看
出
所
有
的
规
则
都
满
足
3
型
文
法
中
左
线
性
文
法
的
定
义
“
A
→
a
或
A
→
B
a
”
\quad \quad 显然,可以看出所有的规则都满足\pmb{3型文法}中\pmb{左线性文法}的定义“\text{A}→ a \; 或 \; \text{A} → \text{B}a”
显然,可以看出所有的规则都满足3型文法3型文法3型文法中左线性文法左线性文法左线性文法的定义“A→a或A→Ba”
所
以
文
法
G
1
是
一
个
3
型
文
法
\quad \quad 所以文法\text{G}_1是一个\pmb{3型文法}
所以文法G1是一个3型文法3型文法3型文法
另
外
,
我
们
还
可
以
推
导
、
归
纳
出
文
法
G
1
对
应
的
语
言
为
L
1
=
{
a
i
b
j
c
k
∣
i
,
j
,
k
≥
1
}
\quad \quad 另外,我们还可以推导、归纳出文法\text{G}_1对应的语言为\text{L}_1 = \{ a^i b^j c^k \; | \; i, j, k \ge 1 \}
另外,我们还可以推导、归纳出文法G1对应的语言为L1={aibjck∣i,j,k≥1}
示
例
2
\pmb{示例2}
示例2示例2示例2
文
法
G
2
:
=
(
{
S
,
A
}
,
{
a
,
b
,
c
}
,
P
2
,
S
)
\quad \quad 文法\text{G}_2 \; : \; = ( \{ \text{S}, \text{A} \}, \{ a, b, c \}, \text{P}_2, \text{S})
文法G2:=({S,A},{a,b,c},P2,S)
其
中
P
2
:
{
S
→
A
c
∣
S
c
A
→
a
b
∣
a
A
b
\quad \quad 其中\text{P}_2 \; : \;\begin{cases} \text{S} → \text{A}c \; | \; \text{S}c \\ \text{A} → ab \; | \; a\text{A}b \\ \end{cases}
其中P2:{S→Ac∣ScA→ab∣aAb
P
2
中
规
则
“
A
→
a
A
b
”
不
满
足
3
型
文
法
的
定
义
“
A
→
a
或
A
→
B
a
”
或
“
A
→
a
或
A
→
a
B
”
\quad \quad \text{P}_2中规则“\text{A} → a\text{A}b”不满足\pmb{3型文法}的定义“\text{A}→ a \; 或 \; \text{A} → \text{B}a”或“\text{A}→ a \; 或 \; \text{A} → a\text{B}”
P2中规则“A→aAb”不满足3型文法3型文法3型文法的定义“A→a或A→Ba”或“A→a或A→aB”
(
右
部
a
A
b
不
符
合
定
义
中
的
三
种
格
式
之
一
:
{
a
,
B
a
,
a
B
}
)
\quad \quad (右部a\text{A}b不符合定义中的三种格式之一:\{ a, \text{B}a, a\text{B} \})
(右部aAb不符合定义中的三种格式之一:{a,Ba,aB})
所
以
文
法
G
2
不
是
一
个
3
型
文
法
\quad \quad 所以文法\text{G}_2不是一个\pmb{3型文法}
所以文法G2不是一个3型文法3型文法3型文法
可
以
看
出
所
有
的
规
则
都
满
足
2
型
文
法
的
定
义
“
α
→
β
(
{
α
∈
V
N
β
∈
V
∗
)
”
\quad \quad 可以看出所有的规则都满足\pmb{2型文法}的定义“α→β \; \left( \begin{cases} α ∈ \text{V}_\text{N} \\ β ∈ \text{V}^* \\ \end{cases} \right)”
可以看出所有的规则都满足2型文法2型文法2型文法的定义“α→β({α∈VNβ∈V∗)”
所
以
文
法
G
2
是
一
个
2
型
文
法
\quad \quad 所以文法\text{G}_2是一个\pmb{2型文法}
所以文法G2是一个2型文法2型文法2型文法
另
外
,
我
们
还
可
以
推
导
、
归
纳
出
文
法
G
2
对
应
的
语
言
为
L
2
=
{
a
i
b
i
c
k
∣
i
,
k
≥
1
}
\quad \quad 另外,我们还可以推导、归纳出文法\text{G}_2对应的语言为\text{L}_2 = \{ a^i b^i c^k \; | \; i, k \ge 1 \}
另外,我们还可以推导、归纳出文法G2对应的语言为L2={aibick∣i,k≥1}
示
例
3
\pmb{示例3}
示例3示例3示例3
文
法
G
3
:
=
(
{
S
,
B
,
C
,
D
}
,
{
a
,
b
,
c
}
,
P
3
,
S
)
\quad \quad 文法\text{G}_3 \; : \; = ( \{ \text{S}, \text{B}, \text{C}, \text{D} \}, \{ \text{a}, \text{b}, \text{c} \}, \text{P}_3, \text{S})
文法G3:=({S,B,C,D},{a,b,c},P3,S)
其
中
P
3
:
{
S
→
aSBC
∣
abc
CB
→
CD
CD
→
BD
BD
→
BC
bB
→
bb
bC
→
bc
cC
→
cc
\quad \quad 其中\text{P}_3 \; : \;\begin{cases} \text{S} → \text{aSBC} \; | \; \text{abc} \\ \text{CB} → \text{CD} \\ \text{CD} → \text{BD} \\ \text{BD} → \text{BC} \\ \text{bB} → \text{bb} \\ \text{bC} → \text{bc} \\ \text{cC} → \text{cc} \\ \end{cases}
其中P3:⎩⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎧S→aSBC∣abcCB→CDCD→BDBD→BCbB→bbbC→bccC→cc
P
3
中
规
则
“
CB
→
CD
”
不
满
足
3
型
文
法
的
定
义
“
A
→
a
或
A
→
B
a
”
或
“
A
→
a
或
A
→
a
B
”
\quad \quad \text{P}_3中规则“\text{CB} → \text{CD}”不满足\pmb{3型文法}的定义“\text{A}→ a \; 或 \; \text{A} → \text{B}a”或“\text{A}→ a \; 或 \; \text{A} → a\text{B}”
P3中规则“CB→CD”不满足3型文法3型文法3型文法的定义“A→a或A→Ba”或“A→a或A→aB”
(
3
型
文
法
的
定
义
要
求
规
则
的
右
部
必
须
包
含
终
结
符
)
\quad \quad (\pmb{3型文法}的定义要求规则的右部必须包含终结符)
(3型文法3型文法3型文法的定义要求规则的右部必须包含终结符)
所
以
文
法
G
3
不
是
一
个
3
型
文
法
\quad \quad 所以文法\text{G}_3不是一个\pmb{3型文法}
所以文法G3不是一个3型文法3型文法3型文法
P
3
中
规
则
“
CB
→
CD
”
不
满
足
2
型
文
法
的
定
义
“
α
→
β
(
{
α
∈
V
N
β
∈
V
∗
)
”
\quad \quad \text{P}_3中规则“\text{CB} → \text{CD}”不满足\pmb{2型文法}的定义“α→β \; \left( \begin{cases} α ∈ \text{V}_\text{N} \\ β ∈ \text{V}^* \\ \end{cases} \right)”
P3中规则“CB→CD”不满足2型文法2型文法2型文法的定义“α→β({α∈VNβ∈V∗)”
(
2
型
文
法
的
定
义
只
允
许
规
则
的
左
部
为
单
个
非
终
结
符
)
\quad \quad (\pmb{2型文法}的定义只允许规则的左部为单个非终结符)
(2型文法2型文法2型文法的定义只允许规则的左部为单个非终结符)
所
以
文
法
G
3
不
是
一
个
2
型
文
法
\quad \quad 所以文法\text{G}_3不是一个\pmb{2型文法}
所以文法G3不是一个2型文法2型文法2型文法
可
以
看
出
所
有
的
规
则
都
满
足
1
型
文
法
的
定
义
“
x
U
y
→
x
u
y
(
{
U
∈
V
N
x
,
y
∈
V
∗
u
∈
V
+
)
”
\quad \quad 可以看出所有的规则都满足\pmb{1型文法}的定义“x\text{U}y → xuy \; \left( \begin{cases} \text{U} ∈ \text{V}_\text{N} \\ x, y ∈ \text{V}^* \\ u ∈ \text{V}^+ \end{cases} \right)”
可以看出所有的规则都满足1型文法1型文法1型文法的定义“xUy→xuy⎝⎜⎛⎩⎪⎨⎪⎧U∈VNx,y∈V∗u∈V+⎠⎟⎞”
(
规
则
P
3
:
{
S
→
aSBC
x
=
ε
,
y
=
ε
,
U
=
S
,
u
=
aSBC
S
→
abc
x
=
ε
,
y
=
ε
,
U
=
S
,
u
=
abc
CB
→
CD
x
=
C
,
y
=
ε
,
U
=
B
,
u
=
D
CD
→
BD
x
=
ε
,
y
=
D
,
U
=
C
,
u
=
B
BD
→
BC
x
=
ε
,
y
=
ε
,
U
=
D
,
u
=
C
bB
→
bb
x
=
b
,
y
=
ε
,
U
=
B
,
u
=
b
bC
→
bc
x
=
b
,
y
=
ε
,
U
=
C
,
u
=
c
cC
→
cc
x
=
c
,
y
=
ε
,
U
=
C
,
u
=
c
)
\quad \quad (规则\text{P}_3 \; : \;\begin{cases} \text{S} → \text{aSBC} & x = \text{ε}, y=\text{ε}, \text{U} = \text{S}, u = \text{aSBC} \\ \text{S} → \text{abc} & x = \text{ε}, y=\text{ε}, \text{U} = \text{S}, u = \text{abc} \\ \text{CB} → \text{CD} & x = \text{C}, y=\text{ε}, \text{U} = \text{B}, u = \text{D} \\ \text{CD} → \text{BD} & x = \text{ε}, y=\text{D}, \text{U} = \text{C}, u = \text{B} \\ \text{BD} → \text{BC} & x = \text{ε}, y=\text{ε}, \text{U} = \text{D}, u = \text{C} \\ \text{bB} → \text{bb} & x = \text{b}, y=\text{ε}, \text{U} = \text{B}, u = \text{b} \\ \text{bC} → \text{bc} & x = \text{b}, y=\text{ε}, \text{U} = \text{C}, u = \text{c} \\ \text{cC} → \text{cc} & x = \text{c}, y=\text{ε}, \text{U} = \text{C}, u = \text{c} \\ \end{cases})
(规则P3:⎩⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎧S→aSBCS→abcCB→CDCD→BDBD→BCbB→bbbC→bccC→ccx=ε,y=ε,U=S,u=aSBCx=ε,y=ε,U=S,u=abcx=C,y=ε,U=B,u=Dx=ε,y=D,U=C,u=Bx=ε,y=ε,U=D,u=Cx=b,y=ε,U=B,u=bx=b,y=ε,U=C,u=cx=c,y=ε,U=C,u=c)
所
以
文
法
G
3
是
一
个
1
型
文
法
\quad \quad 所以文法\text{G}_3是一个\pmb{1型文法}
所以文法G3是一个1型文法1型文法1型文法
另
外
,
我
们
还
可
以
推
导
、
归
纳
出
文
法
G
3
对
应
的
语
言
为
L
3
=
{
a
i
b
i
c
i
∣
i
≥
1
}
\quad \quad 另外,我们还可以推导、归纳出文法\text{G}_3对应的语言为\text{L}_3 = \{ a^i b^i c^i \; | \; i \ge 1 \}
另外,我们还可以推导、归纳出文法G3对应的语言为L3={aibici∣i≥1}
示
例
4
\pmb{示例4}
示例4示例4示例4
文
法
G
4
:
=
(
{
S
,
A
,
B
,
C
,
D
,
E
}
,
{
a
}
,
P
4
,
S
)
\quad \quad 文法\text{G}_4 \; : \; = ( \{ \text{S}, \text{A}, \text{B}, \text{C}, \text{D}, \text{E} \}, \{ \text{a} \}, \text{P}_4, \text{S})
文法G4:=({S,A,B,C,D,E},{a},P4,S)
其
中
P
4
:
{
S
→
AcaB
Ca
→
aaC
CB
→
DB
∣
E
aD
→
Da
AD
→
AC
aE
→
Ea
AE
→
ε
\quad \quad 其中\text{P}_4 \; : \;\begin{cases} \text{S} → \text{AcaB} \\ \text{Ca} → \text{aaC} \\ \text{CB} → \text{DB} \; | \; \text{E} \\ \text{aD} → \text{Da} \\ \text{AD} → \text{AC} \\ \text{aE} → \text{Ea} \\ \text{AE} → \text{ε} \\ \end{cases}
其中P4:⎩⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎧S→AcaBCa→aaCCB→DB∣EaD→DaAD→ACaE→EaAE→ε
P
4
中
规
则
“
AE
→
ε
”
不
满
足
3
型
文
法
和
1
型
文
法
的
定
义
\quad \quad \text{P}_4中规则“\text{AE} → \text{ε}”不满足\pmb{3型文法}和\pmb{1型文法}的定义
P4中规则“AE→ε”不满足3型文法3型文法3型文法和1型文法1型文法1型文法的定义
(
3
型
文
法
和
1
型
文
法
的
定
义
不
允
许
规
则
的
右
部
为
ε
)
\quad \quad (\pmb{3型文法}和\pmb{1型文法}的定义不允许规则的右部为\text{ε})
(3型文法3型文法3型文法和1型文法1型文法1型文法的定义不允许规则的右部为ε)
所
以
文
法
G
4
不
是
一
个
3
型
文
法
和
1
型
文
法
\quad \quad 所以文法\text{G}_4不是一个\pmb{3型文法}和\pmb{1型文法}
所以文法G4不是一个3型文法3型文法3型文法和1型文法1型文法1型文法
P
4
中
规
则
“
Ca
→
aaC
”
不
满
足
2
型
文
法
的
定
义
“
α
→
β
(
{
α
∈
V
N
β
∈
V
∗
)
”
\quad \quad \text{P}_4中规则“\text{Ca} → \text{aaC}”不满足\pmb{2型文法}的定义“α→β \; \left( \begin{cases} α ∈ \text{V}_\text{N} \\ β ∈ \text{V}^* \\ \end{cases} \right)”
P4中规则“Ca→aaC”不满足2型文法2型文法2型文法的定义“α→β({α∈VNβ∈V∗)”
(
2
型
文
法
的
定
义
只
允
许
规
则
的
左
部
为
单
个
非
终
结
符
)
\quad \quad (\pmb{2型文法}的定义只允许规则的左部为单个非终结符)
(2型文法2型文法2型文法的定义只允许规则的左部为单个非终结符)
所
以
文
法
G
4
不
是
一
个
2
型
文
法
\quad \quad 所以文法\text{G}_4不是一个\pmb{2型文法}
所以文法G4不是一个2型文法2型文法2型文法
可
以
看
出
所
有
的
规
则
都
满
足
0
型
文
法
的
定
义
“
α
→
β
(
{
α
∈
V
∗
且
至
少
包
含
一
个
非
终
结
符
β
∈
V
∗
)
”
\quad \quad 可以看出所有的规则都满足\pmb{0型文法}的定义“α→β \; \left( \begin{cases} α ∈ \text{V}^*且至少包含一个非终结符 \\ β ∈ \text{V}^* \\ \end{cases} \right)”
可以看出所有的规则都满足0型文法0型文法0型文法的定义“α→β({α∈V∗且至少包含一个非终结符β∈V∗)”
所
以
文
法
G
4
是
一
个
0
型
文
法
\quad \quad 所以文法\text{G}_4是一个\pmb{0型文法}
所以文法G4是一个0型文法0型文法0型文法
另
外
,
我
们
还
可
以
推
导
、
归
纳
出
文
法
G
4
对
应
的
语
言
为
L
4
=
{
a
2
i
∣
i
≥
1
}
\quad \quad 另外,我们还可以推导、归纳出文法\text{G}_4对应的语言为\text{L}_4 = \{ a^{2^i} \; | \; i \ge 1 \}
另外,我们还可以推导、归纳出文法G4对应的语言为L4={a2i∣i≥1}
四、语法树与句型分析
1、语法树(语法分析树)
(1).语法树
-
语法树
- 语法树就是按照某一规则进行推导时所形成的树
-
其具有如下性质:
- 根结点是文法的开始符
- 每个结点都是文法 G \text{G} G的某一终结符或非终结符
- 若某一结点有至少一个子结点,则该结点一定是非终结符
- 若某一结点 A \text{A} A有 n n n个子结点 B 1 , B 2 , … , B n \text{B}_1, \text{B}_2, \dots, \text{B}_n B1,B2,…,Bn,则必有规则 A → B 1 B 2 ⋯ B n \text{A} → \text{B}_1 \text{B}_2 \cdots \text{B}_n A→B1B2⋯Bn
-
子树
- 子树就是某个结点连同它向下射出的部分
-
简单子树
- 简单子树就是只含有单层分支的子树
-
e
g
:
\pmb{eg:}
eg:eg:eg:
- 设 有 文 法 G [ S ] : { S → a AB A → B a ∣ a B → b d 设有文法 \text{G}[\text{S}] \; : \;\begin{cases} \text{S} → a\text{AB} \\ \text{A} → \text{B}a \; | \; a \\ \text{B} → bd \\ \end{cases} 设有文法G[S]:⎩⎪⎨⎪⎧S→aABA→Ba∣aB→bd
- 根 据 推 导 序 列 S ⇒ a AB ⇒ a B a B ⇒ a b d a B 根据推导序列 \text{S} \Rightarrow a\text{AB} \Rightarrow a\text{B}a\text{B} \Rightarrow abda\text{B} 根据推导序列S⇒aAB⇒aBaB⇒abdaB,可作出语法树如下:
-
- 该 语 法 树 有 如 下 左 图 的 子 树 , 有 如 下 右 图 的 简 单 子 树 该语法树有如下左图的子树,有如下右图的简单子树 该语法树有如下左图的子树,有如下右图的简单子树
(2).推导⟷语法树
语法树并非与语法相对应,而是与推导相对应
更为准确地说,一个推导序列 确定 一个语法树,一个语法树 确定 一个广义推导
-
推导⟶语法树
-
-
e
g
:
\pmb{eg:}
eg:eg:eg:
- 设 有 文 法 G [ N ] : { N → ND ∣ D D → 0 ∣ 1 ∣ 2 ∣ ⋯ ∣ 9 设有文法 \text{G}[\text{N}] \; : \;\begin{cases} \text{N} → \text{ND} \; | \; \text{D} \\ \text{D} → 0 \; | \; 1 \; | \; 2 \; | \cdots | \; 9 \\ \end{cases} 设有文法G[N]:{N→ND∣DD→0∣1∣2∣⋯∣9
- 对 于 推 导 序 列 N ⇒ ND ⇒ DD ⇒ 2D ⇒ 28 , 可 构 造 以 下 推 导 树 : 对于推导序列\text{N} ⇒ \text{ND} ⇒ \text{DD} ⇒ \text{2D} ⇒ \text{28},可构造以下推导树: 对于推导序列N⇒ND⇒DD⇒2D⇒28,可构造以下推导树:
-
语法树⟶推导
-
-
e
g
:
\pmb{eg:}
eg:eg:eg:
- 设 有 文 法 G [ N ] : { N → ND ∣ D D → 0 ∣ 1 ∣ 2 ∣ ⋯ ∣ 9 设有文法 \text{G}[\text{N}] \; : \;\begin{cases} \text{N} → \text{ND} \; | \; \text{D} \\ \text{D} → 0 \; | \; 1 \; | \; 2 \; | \cdots | \; 9 \\ \end{cases} 设有文法G[N]:{N→ND∣DD→0∣1∣2∣⋯∣9
- 有 以 下 推 导 树 : 有以下推导树: 有以下推导树:
-
- 则 可 得 到 以 下 归 约 序 列 ( 不 一 定 唯 一 ) : 则可得到以下归约序列(不一定唯一): 则可得到以下归约序列(不一定唯一): 28 ⇒ △ D8 ⇒ △ DD ⇒ △ ND ⇒ △ N 28 \xRightarrow[△]{} \text{D8} \xRightarrow[△]{} \text{DD} \xRightarrow[△]{} \text{ND} \xRightarrow[△]{} \text{N} 28△D8△DD△ND△N
- 对 应 以 下 推 导 序 列 : 对应以下推导序列: 对应以下推导序列: N ⟹ ND ⟹ DD ⟹ D8 ⟹ 28 \text{N} ⟹ \text{ND} ⟹ \text{DD} ⟹ \text{D8} ⟹ 28 N⟹ND⟹DD⟹D8⟹28
(3).最左推导/最右推导
-
最左推导
- 在一个推导中,如果每步直接推导所被替换的总是最左的非终结符号,则称这种推导为最左推导
-
最右推导(规范推导)
- 在一个推导中,如果每步直接推导所被替换的总是最右的非终结符号,则称这种推导为最右推导,又称规范推导
- 由规范推导所得的句型称为右句型或规范句型
-
e
g
:
eg:
eg:
- 设 有 文 法 G [ N ] : { N → ND ∣ D D → 0 ∣ 1 ∣ 2 ∣ ⋯ ∣ 9 设有文法 \text{G}[\text{N}] \; : \;\begin{cases} \text{N} → \text{ND} \; | \; \text{D} \\ \text{D} → 0 \; | \; 1 \; | \; 2 \; | \cdots | \; 9 \\ \end{cases} 设有文法G[N]:{N→ND∣DD→0∣1∣2∣⋯∣9
- 有 推 导 N ⇒ ∗ 28 有推导\text{N} \xRightarrow[]{*} 28 有推导N∗28
- 对 于 最 左 推 导 N ⇒ ND ⇒ DD ⇒ 2D ⇒ 28 对于最左推导\text{N} ⇒ \text{ND} ⇒ \text{DD} ⇒ \text{2D} ⇒ 28 对于最左推导N⇒ND⇒DD⇒2D⇒28
- 其 语 法 树 如 下 : 其语法树如下: 其语法树如下:
-
- 对 于 最 右 推 导 N ⇒ ND ⇒ N8 ⇒ D8 ⇒ 28 对于最右推导\text{N} ⇒ \text{ND} ⇒ \text{N8} ⇒ \text{D8} ⇒ 28 对于最右推导N⇒ND⇒N8⇒D8⇒28
- 其 语 法 树 如 下 : 其语法树如下: 其语法树如下:
-
- 可 以 看 到 , 该 文 法 的 最 左 推 导 和 最 右 推 导 所 对 应 的 语 法 树 是 相 同 的 可以看到,该文法的最左推导和最右推导所对应的语法树是相同的 可以看到,该文法的最左推导和最右推导所对应的语法树是相同的
- 但 事 实 上 同 一 推 导 的 不 同 推 导 序 列 的 语 法 树 未 必 相 同 但事实上同一推导的不同推导序列的语法树未必相同 但事实上同一推导的不同推导序列的语法树未必相同
(4).二义性
若对某文法的同一句子存在两个不同的语法树,则称该句子是二义性的
包含有二义性句子的文法称为二义性文法,否则称为无二义性文法
若关于某语言不存在无二义性文法,则称该语言先天二义性
示
例
5
\pmb{示例5}
示例5示例5示例5
对
同
一
语
言
L
,
有
以
下
两
种
不
同
的
文
法
:
\quad \quad对同一语言\text{L},有以下两种不同的文法:
对同一语言L,有以下两种不同的文法:
G
[
E
]
:
E
→
E
+
E
∣
E
∗
E
∣
i
∣
(
E
)
G
′
[
E
]
:
{
E
→
E
+
T
∣
T
T
→
T
∗
F
∣
F
F
→
i
∣
(
E
)
\begin{aligned} & \text{G}[\text{E}] \; : \; \text{E} → \text{E} + \text{E} \; | \; \text{E} * \text{E} \; | \; i \; | \; (\text{E}) \\ \\ & \text{G}^{'}[\text{E}] \; : \; \begin{cases} \text{E} → \text{E} + \text{T} \; | \; \text{T} \\ \text{T} → \text{T} * \text{F} \; | \; \text{F} \\ \text{F} → i \; | \; (\text{E}) \\ \end{cases}\\ \end{aligned}
G[E]:E→E+E∣E∗E∣i∣(E)G′[E]:⎩⎪⎨⎪⎧E→E+T∣TT→T∗F∣FF→i∣(E)
下
面
我
们
探
讨
一
下
,
这
两
种
文
法
在
推
导
“
E
⇒
∗
i
+
i
∗
i
”
时
,
不
同
推
导
序
列
下
的
语
法
树
:
\quad \quad下面我们探讨一下,这两种文法在推导“\text{E} \xRightarrow[]{*} i + i * i”时,不同推导序列下的语法树:
下面我们探讨一下,这两种文法在推导“E∗i+i∗i”时,不同推导序列下的语法树:
文
法
G
[
E
]
\quad \quad \pmb{文法\text{G}[\text{E}]}
文法G[E]文法G[E]文法G[E]
其最右推导:
\quad \quad \quad \quad \textbf{其最右推导:}
其最右推导:
E
⇒
E
+
E
⇒
E
+
E
∗
E
⇒
E
+
E
∗
i
⇒
E
+
i
∗
i
⇒
i
+
i
∗
i
\quad \quad \quad \quad \quad \quad \text{E} ⇒ \text{E} + \text{E} ⇒ \text{E} + \text{E} * \text{E} ⇒ \text{E} + \text{E} * i ⇒ \text{E} + i * i ⇒ i + i * i
E⇒E+E⇒E+E∗E⇒E+E∗i⇒E+i∗i⇒i+i∗i
其
语
法
树
如
下
:
\quad \quad \quad \quad 其语法树如下:
其语法树如下:
其最左推导:
\quad \quad \quad \quad \textbf{其最左推导:}
其最左推导:
E
⇒
E
+
E
⇒
i
+
E
⇒
i
+
E
∗
E
⇒
i
+
i
∗
E
⇒
i
+
i
∗
i
\quad \quad \quad \quad \quad \quad \text{E} ⇒ \text{E} + \text{E} ⇒ i + \text{E} ⇒ i + \text{E} * \text{E} ⇒ i + i * \text{E} ⇒ i + i * i
E⇒E+E⇒i+E⇒i+E∗E⇒i+i∗E⇒i+i∗i
其
语
法
树
如
下
:
\quad \quad \quad \quad 其语法树如下:
其语法树如下:
其实还有另一种最左推导:
\quad \quad \quad \quad \textbf{其实还有另一种最左推导:}
其实还有另一种最左推导:
E
⇒
E
∗
E
⇒
E
+
E
∗
E
⇒
i
+
E
∗
E
⇒
i
+
i
∗
E
⇒
i
+
i
∗
i
\quad \quad \quad \quad \quad \quad \text{E} ⇒ \text{E} * \text{E} ⇒ \text{E} + \text{E} * \text{E} ⇒ i + \text{E} * \text{E} ⇒ i + i * \text{E} ⇒ i + i * i
E⇒E∗E⇒E+E∗E⇒i+E∗E⇒i+i∗E⇒i+i∗i
其
语
法
树
如
下
:
\quad \quad \quad \quad 其语法树如下:
其语法树如下:
显
然
,
文
法
G
[
E
]
的
句
子
“
i
+
i
∗
i
”
有
两
种
不
同
的
语
法
树
。
\quad \quad \quad \quad 显然,文法\text{G}[\text{E}]的句子“i + i * i”有两种不同的语法树。
显然,文法G[E]的句子“i+i∗i”有两种不同的语法树。
所
以
,
文
法
G
[
E
]
是
一
种
二
义
性
文
法
。
\quad \quad \quad \quad 所以,文法\text{G}[\text{E}]是一种二义性文法。
所以,文法G[E]是一种二义性文法。
文
法
G
′
[
E
]
\quad \quad \pmb{文法\text{G}^{'}[\text{E}]}
文法G′[E]文法G′[E]文法G′[E]
其最右推导:
\quad \quad \quad \quad \textbf{其最右推导:}
其最右推导:
E
⇒
E
+
T
⇒
E
+
T
∗
F
⇒
E
+
T
∗
i
⇒
E
+
F
∗
i
⇒
E
+
i
∗
i
⇒
T
+
i
∗
i
⇒
F
+
i
∗
i
⇒
i
+
i
∗
i
\quad \quad \quad \quad \quad \quad \text{E} ⇒ \text{E} + \text{T} ⇒ \text{E} + \text{T} * \text{F} ⇒ \text{E} + \text{T} * i ⇒ \text{E} + \text{F} * i ⇒ \text{E} + i * i ⇒ \text{T} + i * i ⇒ \text{F} + i * i ⇒ i + i * i
E⇒E+T⇒E+T∗F⇒E+T∗i⇒E+F∗i⇒E+i∗i⇒T+i∗i⇒F+i∗i⇒i+i∗i
其
语
法
树
如
下
:
\quad \quad \quad \quad 其语法树如下:
其语法树如下:
其最左推导:
\quad \quad \quad \quad \textbf{其最左推导:}
其最左推导:
E
⇒
E
+
T
⇒
T
+
T
⇒
F
+
T
⇒
i
+
T
⇒
i
+
T
∗
F
⇒
i
+
F
∗
F
⇒
i
+
i
∗
F
⇒
i
+
i
∗
i
\quad \quad \quad \quad \quad \quad \text{E} ⇒ \text{E} + \text{T} ⇒ \text{T} + \text{T} ⇒ \text{F} + \text{T} ⇒ i + \text{T} ⇒ i + \text{T} * \text{F} ⇒ i + \text{F} * \text{F} ⇒ i + i * \text{F} ⇒ i + i * i
E⇒E+T⇒T+T⇒F+T⇒i+T⇒i+T∗F⇒i+F∗F⇒i+i∗F⇒i+i∗i
其
语
法
树
如
下
:
\quad \quad \quad \quad 其语法树如下:
其语法树如下:
我
们
还
可
以
举
出
很
多
文
法
G
′
[
E
]
的
句
子
“
i
+
i
∗
i
”
的
很
多
种
语
法
树
,
并
发
现
它
们
都
相
同
。
\quad \quad \quad \quad 我们还可以举出很多文法\text{G}^{'}[\text{E}]的句子“i + i * i”的很多种语法树,并发现它们都相同。
我们还可以举出很多文法G′[E]的句子“i+i∗i”的很多种语法树,并发现它们都相同。
所
以
,
文
法
G
′
[
E
]
是
无
二
义
性
的
。
\quad \quad \quad \quad 所以,文法\text{G}^{'}[\text{E}]是无二义性的。
所以,文法G′[E]是无二义性的。
2、句型分析
(1).句型分析
识别一个符号串是否为某文法的句型,即句型分析
当给定某个符号串时,试图按照某文法的规则为该符号串构造推导/归约或语法树,从而识别出它是该文法的一个句型
目的:用某种分析技术,为程序设计语言构造一个识别程序
(2).分析技术
-
自顶向下分析技术
- 识 别 符 号 ⟹ ⋯ ⟹ 输 入 字 符 串 识别符号 ⟹ \cdots ⟹ 输入字符串 识别符号⟹⋯⟹输入字符串
- [ 从识别符号出发,由它推导出与输入符号串相同的终结符号串 ] 自底向上分析技术
- 输 入 字 符 串 ⇒ △ ⋯ ⇒ △ 识 别 符 号 输入字符串 \xRightarrow[△]{} \cdots \xRightarrow[△]{} 识别符号 输入字符串△⋯△识别符号
- [ 从输入符号触发,将其归约为识别符号 ]
- Tips:现在主流的编译程序用的都是自底向上的分析 e g : \pmb{eg:} eg:eg:eg:
- 设 有 文 法 G [ N ] : { E → E + T ∣ T T → T ∗ F ∣ F F → i ∣ ( E ) 设有文法 \text{G}[\text{N}] \; : \; \begin{cases} \text{E} → \text{E} + \text{T} \; | \; \text{T} \\ \text{T} → \text{T} * \text{F} \; | \; \text{F} \\ \text{F} → i \; | \; (\text{E}) \\ \end{cases} 设有文法G[N]:⎩⎪⎨⎪⎧E→E+T∣TT→T∗F∣FF→i∣(E)
- \;
- 分 析 句 子 i + i : 分析句子 \quad i + i \quad : 分析句子i+i:
- 自 顶 向 下 : E ⟹ E + T ⟹ T + T ⟹ F + T ⟹ i + T ⟹ i + F ⟹ i + i \qquad 自顶向下:\text{E} ⟹ \text{E} + \text{T} ⟹ \text{T} + \text{T} ⟹ \text{F} + \text{T} ⟹ i + \text{T} ⟹ i + \text{F} ⟹ i + i 自顶向下:E⟹E+T⟹T+T⟹F+T⟹i+T⟹i+F⟹i+i
- 自 底 向 上 : i + i ⇒ △ F + i ⇒ △ T + i ⇒ △ E + i ⇒ △ E + F ⇒ △ E + T ⇒ △ E \qquad 自底向上:i + i \xRightarrow[△]{} \text{F} + i \xRightarrow[△]{} \text{T} + i \xRightarrow[△]{} \text{E} + i \xRightarrow[△]{} \text{E} + \text{F} \xRightarrow[△]{} \text{E} + \text{T} \xRightarrow[△]{} \text{E} 自底向上:i+i△F+i△T+i△E+i△E+F△E+T△E
3、句型分析的基本问题
(1).基本问题
句型分析面临以下两个基本问题
\qquad
① 在自顶向下的分析过程中,有规则
U
→
u
1
∣
u
2
∣
⋯
∣
u
n
\text{U} → u_1 \; | \; u_2 \; | \; \cdots \; | \; u_n
U→u1∣u2∣⋯∣un,如何确定用哪个
u
i
u_i
ui替代
U
?
\text{U} \; ?
U?
\qquad
② 在自底向上的分析过程中,有规则
{
A
→
x
B
→
x
\begin{cases} \text{A} → x \\ \text{B} → x \\ \end{cases}
{A→xB→x,应该把
x
x
x 归约到
A
\text{A}
A 还是
B
?
\text{B} \; ?
B?
(2).句柄
设 有 文 法 G [ Z ] , w = x u y 是 其 一 个 句 型 , Z ⇒ ∗ x U y 且 U ⇒ + u ( { U ∈ V N u ∈ V + x , y ∈ V ∗ ) , 则 称 u 是 句 型 w 相 对 于 U 的 短 语 设有文法\text{G}[\text{Z}],w = xuy是其一个句型,\text{Z} \xRightarrow[]{*} x\text{U}y \;且\; \text{U} \xRightarrow[]{+} u\left(\begin{cases} \text{U} \in \text{V}_\text{N} \\ u \in \text{V}^+\\ x, y \in \text{V}^* \end{cases}\right),则称 \pmb{u \; 是句型 \; w \; 相对于 \text{U} 的短语} 设有文法G[Z],w=xuy是其一个句型,Z∗xUy且U+u⎝⎜⎛⎩⎪⎨⎪⎧U∈VNu∈V+x,y∈V∗⎠⎟⎞,则称u是句型w相对于U的短语u是句型w相对于U的短语u是句型w相对于U的短语
当 U ⟹ u 时 , 称 u 是 句 型 w 相 对 于 U 的 直 接 ( 简 单 ) 短 语 当 \text{U} ⟹ u 时,称 \pmb{u \; 是句型 \; w \; 相对于 \; \text{U} \; 的直接(简单)短语} 当U⟹u时,称u是句型w相对于U的直接(简单)短语u是句型w相对于U的直接(简单)短语u是句型w相对于U的直接(简单)短语
句 型 的 最 左 简 单 短 语 称 为 该 句 型 的 句 柄 句型的\pmb{最左简单短语}称为该句型的\pmb{句柄} 句型的最左简单短语最左简单短语最左简单短语称为该句型的句柄句柄句柄
e
g
:
\pmb{eg:}
eg:eg:eg:
设
有
文
法
G
[
N
]
:
{
E
→
E
+
T
∣
T
T
→
T
∗
F
∣
F
F
→
i
∣
(
E
)
\qquad设有文法 \text{G}[\text{N}] \; : \; \begin{cases} \text{E} → \text{E} + \text{T} \; | \; \text{T} \\ \text{T} → \text{T} * \text{F} \; | \; \text{F} \\ \text{F} → i \; | \; (\text{E}) \\ \end{cases}
设有文法G[N]:⎩⎪⎨⎪⎧E→E+T∣TT→T∗F∣FF→i∣(E)
对
句
型
T
+
i
:
\qquad 对句型 \; \text{T} + i \; :
对句型T+i:
E
⇒
∗
E
⇒
+
T
+
i
\qquad \qquad \text{E} \xRightarrow[]{*} \text{E} \xRightarrow[]{+} \text{T} + i
E∗E+T+i
所
以
T
+
i
是
句
型
T
+
i
相
对
于
E
的
短
语
\qquad \qquad 所以 \; \text{T} + i \; 是句型 \; \text{T} + i \; 相对于 \; \text{E} \; 的短语
所以T+i是句型T+i相对于E的短语
E
⇒
∗
T
+
T
⇒
+
T
+
i
\qquad \qquad \text{E} \xRightarrow[]{*} \text{T} + \text{T} \xRightarrow[]{+} \text{T} + i
E∗T+T+T+i
所
以
T
是
句
型
T
+
i
相
对
于
T
的
短
语
\qquad \qquad 所以 \; \text{T} \; 是句型 \; \text{T} + i \; 相对于 \; \text{T} \; 的短语
所以T是句型T+i相对于T的短语
E
⇒
∗
T
+
F
⇒
T
+
i
\qquad \qquad \text{E} \xRightarrow[]{*} \text{T} + \text{F} \xRightarrow[]{} \text{T} + i
E∗T+FT+i
所
以
i
是
句
型
T
+
i
相
对
于
T
的
短
语
、
简
单
短
语
\qquad \qquad 所以 \; i \; 是句型 \; \text{T} + i \; 相对于 \; \text{T} \; 的短语、简单短语
所以i是句型T+i相对于T的短语、简单短语
E
⇒
∗
E
+
i
⇒
T
+
i
\qquad \qquad \text{E} \xRightarrow[]{*} \text{E} + i \xRightarrow[]{} \text{T} + i
E∗E+iT+i
所
以
T
是
句
型
T
+
i
相
对
于
E
的
短
语
、
简
单
短
语
\qquad \qquad 所以 \; \text{T} \; 是句型 \; \text{T} + i \; 相对于 \; \text{E} \; 的短语、简单短语
所以T是句型T+i相对于E的短语、简单短语
因
为
T
出
现
在
句
型
T
+
i
的
最
左
边
,
是
句
型
T
+
i
的
最
左
简
单
短
语
\qquad \qquad 因为 \; \text{T} \; 出现在句型 \; \text{T} + i \; 的最左边,是句型 \; \text{T} + i \; 的最左简单短语
因为T出现在句型T+i的最左边,是句型T+i的最左简单短语
所
以
T
还
是
是
句
型
T
+
i
相
对
于
E
的
句
柄
\qquad \qquad 所以 \; \text{T} \; 还是是句型 \; \text{T} + i \; 相对于 \; \text{E} \; 的句柄
所以T还是是句型T+i相对于E的句柄
根据语法分析树,可以比较容易地找出某一句型的短语、简单短语、句柄
\qquad
子树的末端节点组成的符号串是原树对应句型相对于子树根的短语
\qquad
简单子树的末端节点组成的符号串是原树对应句型相对于子树根的简单短语
\qquad
最左简单子树的末端节点组成的符号串是原树对应句型相对于子树根的句柄
e
g
:
\pmb{eg:}
eg:eg:eg:
设
有
文
法
G
[
N
]
:
{
E
→
E
+
T
∣
T
T
→
T
∗
F
∣
F
F
→
i
∣
(
E
)
\qquad设有文法 \text{G}[\text{N}] \; : \; \begin{cases} \text{E} → \text{E} + \text{T} \; | \; \text{T} \\ \text{T} → \text{T} * \text{F} \; | \; \text{F} \\ \text{F} → i \; | \; (\text{E}) \\ \end{cases}
设有文法G[N]:⎩⎪⎨⎪⎧E→E+T∣TT→T∗F∣FF→i∣(E)
对 句 型 T + i , 绘 制 出 了 如 下 图 所 示 的 语 法 树 : \qquad 对句型 \; \text{T} + i \; ,绘制出了如下图所示的语法树: 对句型T+i,绘制出了如下图所示的语法树:
从
图
中
【
语
法
树
】
中
,
可
以
分
析
出
,
T
+
i
是
句
型
T
+
i
相
对
于
E
的
短
语
\qquad 从图中【语法树】中,可以分析出,\text{T} + i \; 是句型 \; \text{T} + i \; 相对于 \; \text{E} \; 的短语
从图中【语法树】中,可以分析出,T+i是句型T+i相对于E的短语
从
图
中
【
最
左
简
单
子
树
】
中
,
可
以
分
析
出
,
T
是
句
型
T
+
i
相
对
于
E
的
短
语
、
简
单
短
语
、
句
柄
\qquad 从图中【最左简单子树】中,可以分析出,\text{T} \; 是句型 \; \text{T} + i \; 相对于 \; \text{E} \; 的短语、简单短语、句柄
从图中【最左简单子树】中,可以分析出,T是句型T+i相对于E的短语、简单短语、句柄
从
图
中
【
子
树
】
中
,
可
以
分
析
出
,
i
是
句
型
T
+
i
相
对
于
T
的
短
语
\qquad 从图中【子树】中,可以分析出,i \; 是句型 \; \text{T} + i \; 相对于 \; \text{T} \; 的短语
从图中【子树】中,可以分析出,i是句型T+i相对于T的短语
从
图
中
【
简
单
子
树
】
中
,
可
以
分
析
出
,
i
是
句
型
T
+
i
相
对
于
F
的
短
语
、
简
单
短
语
\qquad 从图中【简单子树】中,可以分析出,i \; 是句型 \; \text{T} + i \; 相对于 \; \text{F} \; 的短语、简单短语
从图中【简单子树】中,可以分析出,i是句型T+i相对于F的短语、简单短语
其 实 , 有 了 语 法 分 析 树 以 后 , 对 句 型 分 析 来 说 , 就 不 用 去 找 句 柄 什 么 的 了 其实,有了语法分析树以后,对句型分析来说,就不用去找句柄什么的了 其实,有了语法分析树以后,对句型分析来说,就不用去找句柄什么的了
第 五 章 会 有 另 外 的 、 更 巧 妙 、 更 实 用 的 方 法 去 找 句 柄 第五章会有另外的、更巧妙、更实用的方法去找句柄 第五章会有另外的、更巧妙、更实用的方法去找句柄