产生式
关于如何从集合中取出符号,构成程序
产生式规则是一个有序对(
α
\alpha
α,
β
\beta
β),通常写作
α
→
β
\alpha\rightarrow \beta
α→β或
α
:
:
=
β
\alpha ::=\beta
α::=β
α
\alpha
α称为产生式的左部/头部,
β
\beta
β称为产生式的右部/体
α
∈
(
V
T
∪
V
N
)
+
\alpha\in (V_T\cup V_N)^+
α∈(VT∪VN)+,
β
∈
(
V
T
∪
V
N
)
∗
\beta\in (V_T\cup V_N)^*
β∈(VT∪VN)∗
产生式用于定义语法成分,描述了一个语法成分的形成规则
例如,标识符的构成规则:
<标识符>
→
\rightarrow
→<字母>
<标识符>
→
\rightarrow
→<标识符><字母>
<标识符>
→
\rightarrow
→<标识符><数字>
竖线|用于简化有相同左部的若干条规则,例如上式可以写为:
<标识符>
→
\rightarrow
→<字母>|<标识符><字母>|<标识符><数字>
文法
EBNF:元语言符号
在EBNF中,终结符号被引号包围
文法是产生式的有穷非空的集合
文法G是一个四元组,表示形式为:
G
[
S
]
=
(
V
N
,
V
T
,
P
,
S
)
G[S]=(V_N,\ V_T,\ P,\ S)
G[S]=(VN, VT, P, S)。其中,
V
N
V_N
VN为非终结符号集,
V
T
V_T
VT为终结符号集,
P
P
P表示产生式的有穷非空的集合,
S
S
S表示开始符号,其至少在一条产生式中作为左部
文法的分类
0型文法:短语结构文法。
α
→
β
,
α
∈
(
V
N
∪
V
T
)
+
,
β
∈
(
V
N
∪
V
T
)
∗
\alpha\rightarrow \beta,\ \alpha\in(V_N\cup V_T)^+,\ \beta\in(V_N\cup V_T)^*
α→β, α∈(VN∪VT)+, β∈(VN∪VT)∗
1型文法:上下文有关文法。
α
→
β
,
1
≤
∣
α
∣
≤
∣
β
∣
,
α
∈
(
V
N
∪
V
T
)
+
,
β
∈
(
V
N
∪
V
T
)
∗
\alpha\rightarrow \beta,\ 1\le |\alpha|\le|\beta|,\ \alpha\in(V_N\cup V_T)^+,\ \beta\in(V_N\cup V_T)^*
α→β, 1≤∣α∣≤∣β∣, α∈(VN∪VT)+, β∈(VN∪VT)∗
2型文法:上下文无关文法。
A
→
β
,
A
∈
V
N
,
β
∈
(
V
N
∪
V
T
)
∗
A\rightarrow \beta,\ A\in V_N,\ \beta\in(V_N\cup V_T)^*
A→β, A∈VN, β∈(VN∪VT)∗
3型文法:正规(正则)文法。右线性:
A
→
a
A\rightarrow a
A→a或
A
→
a
B
A\rightarrow aB
A→aB,
A
,
B
∈
V
N
,
a
∈
V
T
A,B\in V_N,\ a\in V_T
A,B∈VN, a∈VT;左线性:
A
→
a
A\rightarrow a
A→a或
A
→
B
a
A\rightarrow Ba
A→Ba,
A
,
B
∈
V
N
,
a
∈
V
T
A,B\in V_N,\ a\in V_T
A,B∈VN, a∈VT
3型文法需要全都是左线性或右线性,不能同时出现左右两种线性,否则不是3型文法。例如:
S
→
a
A
,
A
→
A
b
∣
ϵ
S\rightarrow aA,\ A\rightarrow Ab|\epsilon
S→aA, A→Ab∣ϵ
不是3型文法,因为同时出现了右线性和左线性
在编译中涉及2型和3型文法
语言的形式定义
得到文法后,需要得到符合文法的语言
推导
符号是双向箭头,需要严格遵从定义
直接推导:如果
α
→
β
\alpha\rightarrow \beta
α→β是文法G的一条产生式,而
γ
,
δ
\gamma,\ \delta
γ, δ是
(
V
T
∪
V
N
)
∗
(V_T\cup V_N)^*
(VT∪VN)∗中任意一个符号串,则将
α
→
β
\alpha\rightarrow \beta
α→β作用于符号串
γ
α
δ
\gamma\alpha\delta
γαδ上得到符号串
γ
β
δ
\gamma\beta\delta
γβδ,称符号串
γ
β
δ
\gamma\beta\delta
γβδ是符号串
γ
α
δ
\gamma\alpha\delta
γαδ的直接推导,记为:
γ
α
δ
⇒
γ
β
δ
\gamma\alpha\delta\Rightarrow\gamma\beta\delta
γαδ⇒γβδ
直接推导逆过程称作直接规约
推导:设
α
0
,
α
1
,
…
,
a
n
(
n
>
0
)
\alpha_0,\ \alpha_1,\ \dots,\ a_n(n>0)
α0, α1, …, an(n>0)均为
(
V
T
∪
V
N
)
∗
(V_T\cup V_N)^*
(VT∪VN)∗中的符号串,且有
α
0
⇒
α
1
⇒
⋯
⇒
α
n
\alpha_0\Rightarrow \alpha_1\Rightarrow \dots\Rightarrow \alpha_n
α0⇒α1⇒⋯⇒αn
此为长度为n的推导,记为
α
0
⇒
+
α
n
\alpha_0\mathop\Rightarrow\limits^+ \alpha_n
α0⇒+αn
关于箭头上的符号:
*:可以是0步推导(
α
0
\alpha_0
α0到
α
n
\alpha_n
αn)
+:多步推导
推导过程中没有算术运算,不涉及符号串的含义
语言
句型:S是起始符,如果 S ⇒ ∗ u S\mathop\Rightarrow\limits^* u S⇒∗u,则称符号串u为文法G[S]的句型
句子:S是起始符,如果 S ⇒ ∗ u S\mathop\Rightarrow\limits^* u S⇒∗u,且 u ∈ V T ∗ u\in V_T^* u∈VT∗,则称符号串u为文法G[S]的句子
句子进行到了终结符阶段
推导与语法树
语言:由某棵语法分析树生成的终结符号串的集合,记做:
L
(
G
[
S
]
)
=
{
u
∣
S
⇒
∗
u
,
u
∈
V
T
∗
}
L(G[S])=\{u|S\mathop\Rightarrow\limits^* u,\ u\in V_T^*\}
L(G[S])={u∣S⇒∗u, u∈VT∗}
从推导到语法树
过程:
1、将开始符号作为根结点
2、对每一个直接推导,画一个分枝
3、重复第二步,直到画不出分枝时结束
一个句子的语法树可能有多个
从语法树到推导
过程:
1、依据分支建立直接推导,然后从语法树中剪去这个分枝
2、重复第一步,直到无分枝可剪
最左推导与最右推导
如果在某个推导过程中的任何一步直接推导
α
⇒
β
\alpha\Rightarrow \beta
α⇒β中,都是对符号串
α
\alpha
α的最左(右)非终结符号进行替换,则称其为最左(右)推导。
最右推导又叫做规范推导。由规范推导得到的句型称为规范句型。
为语言构造文法
“凑规则”方法