程序语言的语法描述
该系列博文都是对网上的一些学习资料的总结,特别感谢吴伟大佬和王挺老师的课程资源,以及网上其他大佬的博文分享。这里放出一些链接:
1. 一些基本概念
1.1 字的概念
-
考虑一个有穷字母表 Σ \Sigma Σ字符集
-
其中每一个元素称为一个字符
-
Σ \Sigma Σ上的字(也叫字符串)是指由 Σ \Sigma Σ中的字符所构成的一个有穷序列
-
不包含任何字符列的序列称为空字,记为 ε \varepsilon ε
-
用 Σ ∗ \Sigma^* Σ∗表示 Σ \Sigma Σ上的所有字的全体,包含空字 ε \varepsilon ε
-
例如:设 Σ = { a , b } \Sigma=\{a,b\} Σ={a,b},则
Σ ∗ = { ε , a , b , a a , a b , b a , b b , a a a , . . . } \Sigma^* = \{\varepsilon, a, b, aa, ab, ba, bb, aaa, ...\} Σ∗={ε,a,b,aa,ab,ba,bb,aaa,...}
-
Σ ∗ \Sigma^* Σ∗的子集U和V的连接(积)定义为
U V = { α β ∣ α ∈ U & β ∈ V } UV = \{\alpha\beta|\alpha\in U \& \beta \in V\} UV={αβ∣α∈U&β∈V} -
V V V自身的n次积记为
V n = V V V . . . V V^n = VVV...V Vn=VVV...V
- 规定 V 0 = { ε } V^0=\{\varepsilon\} V0={ε}
- 令 V ∗ = V 0 ∪ V 1 ∪ V 2 . . . V^* = V^0\cup V^1 \cup V^2 ... V∗=V0∪V1∪V2... 称 V ∗ V^* V∗是 V V V的闭包
- 记 V + = V V ∗ V^+ = VV^* V+=VV∗, 称 V + V^+ V+是 V V V的正规 闭包
这里正规闭包其实和闭包的区别在于空字,如果V本身不包含空字,V的闭包是包含空字的,但是V的正则闭包不包含空字。如果V本身就包含空字,则V的闭包和正则闭包是完全一样的。
1.2 上下文无关文法
-
文法:描述语言的语法结构和形式规则
-
上下文无关文法G是一个四元式
G = ( V T , V N , S , P ) G=(V_T, V_N, S,P) G=(VT,VN,S,P)
-
其中:
- V T V_T VT:终结符集合(非空)
- V N V_N VN: 非终结符集合(非空),且 V T ∩ V N = ∅ V_T \cap V_N=\emptyset VT∩VN=∅
- S S S : 文法的开始符号, S ∈ V N S \in V_N S∈VN
-
P
P
P : 产生式集合(有限), 每个产生式形式为
- P → α , P ∈ V N , α ∈ ( V t ∪ V N ) ∗ P \rightarrow \alpha, P \in V_N, \alpha \in (V_t \cup V_N)^* P→α,P∈VN,α∈(Vt∪VN)∗
-
→ \rightarrow →也可以用 : : = ::= ::=表示,这种表示称为巴克斯范式(BNF)
-
几点约定
-
P → α 1 P \rightarrow \alpha_1 P→α1
P → α 2 P \rightarrow \alpha_2 P→α2 可以缩写为 P → α 1 ∣ α 2 ∣ . . . ∣ α n P \rightarrow \alpha_1|\alpha_2|...|\alpha_n P→α1∣α2∣...∣αn
其中,“|"读成或, 称 α i \alpha_i αi为 P P P的一个候选式
-
-
定义: 称 α A β \alpha A \beta αAβ直接退出 α γ β \alpha \gamma \beta αγβ,即
α A β ⇒ α γ β \alpha A \beta \Rightarrow \alpha\gamma\beta αAβ⇒αγβ
仅当 A → γ A \rightarrow \gamma A→γ是一个生产式,且 α , β ∈ ( V T ∪ V N ) ∗ \alpha, \beta \in (V_T \cup V_N)^* α,β∈(VT∪VN)∗
- 如果 α 1 ⇒ α 2 ⇒ . . . ⇒ α n \alpha_1 \Rightarrow \alpha_2 \Rightarrow ... \Rightarrow \alpha_n α1⇒α2⇒...⇒αn,则我们称这个序列是从 α 1 \alpha_1 α1到 α n \alpha_n αn的推导,则称 α 1 \alpha_1 α1可以推导出 α n \alpha_n αn。
- 对文法 G ( E ) : E → i ∣ E + E ∣ E ∗ E ∣ ( E ) G(E): E \rightarrow i| E+ E| E*E| (E) G(E):E→i∣E+E∣E∗E∣(E) (需要标明开始符号)
- 通常,用 α 1 ⇒ + α n \alpha_1 \Rightarrow ^+ \alpha_n α1⇒+αn表示从 α 1 \alpha_1 α1出发,经过一步或若干步,可以推出 α n \alpha_n αn
- 用 α 1 ⇒ ∗ α n \alpha_1 \Rightarrow ^ * \alpha_n α1⇒∗αn表示,从 α 1 \alpha_1 α1出发,经过0步或若干步,可以推出 α n \alpha_n αn
- 从一个句型到另一个句型的推导往往不唯一
- 最左推导:任何一步 α ⇒ β \alpha \Rightarrow \beta α⇒β都是对 α \alpha α中最左非终结符进行替换
- 最右推导:任何一步 α ⇒ β \alpha \Rightarrow \beta α⇒β都是对 α \alpha α中最右非终结符进行替换
- 定义:假定一个G是一个文法, S是它的开始符号。如果 S ⇒ ∗ α S \Rightarrow ^* \alpha S⇒∗α,则称 α \alpha α是一个句型。仅包含终结符号的句型是一个句子。文法G产生的句子的全体是一个语言。将它记为L(G)。
L ( G ) = { α ∣ S ⇒ α , α ∈ V t ∗ } L(G) = \{ \alpha | S \Rightarrow \alpha, \alpha \in V ^*_t\} L(G)={α∣S⇒α,α∈Vt∗}
1.2.1 例题
- 文法 G ( A ) : A → c ∣ A b G(A): A \rightarrow c| Ab G(A):A→c∣Ab, G(A)的语言?
cbb…b 即 以c开头,后面接任意个b
-
文法 G ( S ) : G(S): G(S):
S → A ∣ B S \rightarrow A|B S→A∣B
A → a A ∣ a A \rightarrow aA|a A→aA∣a
B → b B ∣ b B \rightarrow bB|b B→bB∣b
aaa…ab…b 即以n个a开始(n>1) 后接m个b(m>1)
- 给出产生语言为 { a n b n ∣ n ≥ 1 } \{a^nb^n|n \ge 1\} {anbn∣n≥1}的文法
G ( S ) : S → a S b ∣ a b G(S): S \rightarrow aSb | ab G(S):S→aSb∣ab
- 给出产生语言为 { a m b n ∣ 1 ≤ n ≤ m ≤ 2 n } \{a^mb^n|1\le n\le m \le 2n\} {ambn∣1≤n≤m≤2n}的文法
G ( S ) : S → a b ∣ a a b ∣ a S b ∣ a a S b G(S): S \rightarrow ab|aab |aSb|aaSb G(S):S→ab∣aab∣aSb∣aaSb