《编译原理》学习笔记 ·002【第二章:文法和语言(形式语言理论)-1】

注:前言、目录见 https://blog.csdn.net/qq_44220418/article/details/108428971

零、引言

文法和语言这一章节,我们所研究的是 { 单词    如 何 构 成 表达式、各种语句、函数    如 何 书 写 语法规则 词法规则 \begin{cases} \textbf{单词}\;如何构成 \\ \textbf{表达式、各种语句、函数}\;如何书写 \\ \textbf{语法规则} \\ \textbf{词法规则} \\ \end{cases} 单词表达式、各种语句、函数语法规则词法规则

在《编译原理》中,我们对源代码的关注点并不像在学习编程基础那样,把关注点放在代码实现了什么逻辑功能上,而是需要把关注点放在源程序的 语法、语义是否正确


文法,简单来说,就是 用数学的方法 来定义 语言

一、符号串与符号串集合

1、字母表

字母表 是一个 非空有穷集合,习惯上用 大写字母 Σ \pmb{\Sigma} ΣΣΣ 表示。

字母表中至少包含一个元素。

e g : eg: eg:
Σ = { a , b , c } \quad \quad \Sigma = \{a, b, c\} Σ={a,b,c}
V = { 0 , 1 } \quad \quad \text{V} = \{0, 1\} V={0,1}

2、符号串

(1).概念

符号串
符号串 是由字母表中的符号所组成的有穷序列,习惯上用小写字母表示。
特别地,空串 表示不包含任何符号的符号串,用 ε \pmb{\text{ε}} εεε 表示。
e g : eg: eg:
对 于 字 母 表 Σ = { a , b , c } , a 、 a a 、 a b c 都 是 Σ 上 的 符 号 串 \quad \quad 对于字母表 \Sigma=\{a,b,c\}, a、aa、abc都是\Sigma上的符号串 Σ={a,b,c}aaaabcΣ
符号串长度
符号串的长度 表示符号串中包含符号的个数,用 |x| \textbf{|x|} |x| 表示。:
e g : eg: eg:
∣ a b c ∣ = 3 ,    ∣ ε ∣ = 0 \quad \quad |abc| = 3, \; | \text{ε} | = 0 abc=3,ε=0
子符号串
设有非空符号串 u = xvy \text{u} = \text{xvy} u=xvy,其中符号串 v ≠ ε \text{v} ≠ \text{ε} v=ε,则称 v \text{v} v 为符号串 u \text{u} u 的子符号串。
e g : eg: eg:
对 于 x = a b c { a 、 a b 、 a b c 都 是 其 子 串 ε 、 a c 并 不 是 其 子 串 \quad \quad 对于x=abc\begin{cases} a、ab、abc & 都是其子串\\ \text{ε}、ac & 并不是其子串 \end{cases} x=abc{aababcεac
符号串的头与尾
z = x y z = xy z=xy 是一个符号串,则 { x 是 z 的 头 y 是 z 的 尾 \begin{cases} \boldsymbol{x} 是 \boldsymbol{z}的\textbf{头} \\ \boldsymbol{y} 是 \boldsymbol{z}的\textbf{尾} \end{cases} {xzyz,且 { x 是 z 的 固有头 y ≠ ε y 是 z 的 固有尾 x ≠ ε \begin{cases} \boldsymbol{x} 是 \boldsymbol{z}的\textbf{固有头} & \boldsymbol{y} \not= \textbf{ε} \\ \boldsymbol{y} 是 \boldsymbol{z}的\textbf{固有尾} & \boldsymbol{x} \not= \textbf{ε} \end{cases} {xz固有头yz固有尾y=εx=ε
另外,可用省略形式表示符号串,形如 { z = x … z = … y z = … x … \begin{cases} z = x \dots \\ z = \dots y \\ z = \dots x \dots \end{cases} z=xz=yz=x
e g : eg: eg:
对 于 x = 56789 , { ε 、 5 、 56 、 567 、 5678 、 56789 都 是 x 的 头 ε 、 5 、 56 、 567 、 5678 都 是 x 的 固 有 头 \quad \quad 对于x=56789,\begin{cases} \text{ε}、5、56、567、5678、56789 & 都是x的头\\ \text{ε}、5、56、567、5678 & 都是x的固有头 \end{cases} x=56789{ε556567567856789ε5565675678xx

(2).运算

联结(并置)
x x x y y y 是同一字母表上的两个符号串,把 y y y 的各个符号相继写在 x x x 的符号后所得到的符号串称为 x x x y y y联结(或并置),记为 x y \boldsymbol{xy} xy

显然, ∣ x y ∣ = ∣ x ∣ + ∣ y ∣ \pmb{|xy| = |x| + |y|} xy=x+yxy=x+yxy=x+y
特别地, ε x = x ε = x \pmb{\text{ε}x = x\text{ε} = x} εx=xε=xεx=xε=xεx=xε=x

e g : eg: eg:
x = a b , y = a b c , 则 x y = a b a b c \quad \quad x = ab,y = abc,则xy = ababc x=aby=abcxy=ababc
x x x 是某字母表上的符号串,把 x x x 自身联结 n n n 次,即 z = x x … x ( n 个 x ) z = xx…x(n个x) z=xxx(nx),称为符号串 x \boldsymbol{x} x n \boldsymbol{n} n 次方幂,记为 z = x n \pmb{z = x^n} z=xnz=xnz=xn
特别地,当 n = 0 n = 0 n=0 时, x 0 = ε x^0 = \text{ε} x0=ε

显然, ∣ x n ∣ = n ⋅ ∣ x ∣ \pmb{| x^n | = n\cdot|x|} xn=nxxn=nxxn=nx

e g : eg: eg:
x = 0 , y = a , 则 { x 5 = 00000 ( x y ) 5 = 0 a 0 a 0 a 0 a 0 a x y 5 = 0 a a a a a \quad \quad x = 0,y = a,则\begin{cases} x^5 = 00000 \\ (xy)^5 = 0a0a0a0a0a \\ xy^5 = 0aaaaa \end{cases} x=0y=ax5=00000(xy)5=0a0a0a0a0axy5=0aaaaa

3、符号串集合

(1).概念-1

符号串集合
若 集合 A \text{A} A 中的一切元素都是某字母表 Σ Σ Σ 上的符号串,则称 A \text{A} A 为该字母表 Σ Σ Σ 上的符号串集合,常用大写字母 A、B、C、 … \text{A、B、C、}\dots ABC表示。
特别地,空集 表示不包含任何元素的集合,用 ∅ \pmb{\varnothing} 表示。
符号串集合的表示方法 { 枚 举 表 示 法 { 1 , 11 , 111 } 省 略 表 示 法 { 1 , 11 , 111 , …   } 描 述 表 示 法 { x    ∣    x 满 足 条 件 C } \begin{cases} 枚举表示法 & \{ 1, 11, 111 \} \\ 省略表示法 & \{ 1, 11, 111, \dots \} \\ 描述表示法 & \{ x \; | \; x满足条件\text{C} \} \\ \end{cases} {1,11,111}{1,11,111,}{xxC}
e g : eg: eg:
字 母 表 = { x    ∣    x 是 该 字 母 表 上 的 符 号 串 , 且 ∣ x ∣ = 1 } \quad \quad 字母表 = \{ x \; | \; x是该字母表上的符号串,且|x| = 1 \} ={xxx=1}

(2).运算

乘积
两个符号串集合 A \text{A} A B \text{B} B乘积 定义为 AB = { x y    ∣    x ∈ A    且    y ∈ B } \text{AB} = \{ xy \; | \; x \in \text{A} \; 且 \; y \in \text{B} \} AB={xyxAyB}
e g : eg: eg:
A = { 2 , 3 } , B = { 7 , 8 , 9 } , 则 AB = { 27 , 28 , 29 , 37 , 38 , 39 } \quad \quad \text{A} = \{ 2, 3 \}, \text{B} = \{ 7, 8, 9 \},则\text{AB} = \{ 27, 28, 29, 37, 38, 39 \} A={2,3}B={7,8,9}AB={27,28,29,37,38,39}

一个符号串集合的 n \boldsymbol{n} n 次幂 n \boldsymbol{n} n个该集合的乘积,如 { A 0 = { ε } A 1 = A A 2 = AA ⋯ ⋯ A n = A n − 1 A    ( n > 0 ) \begin{cases} \pmb{\text{A}^0 = \{ \text{ε} \}} \\ \text{A}^1 = \text{A} \\ \text{A}^2 = \text{AA} \\ \cdots\cdots \\ \text{A}^n = \text{A}^{n-1}\text{A} \; (n > 0) \\ \end{cases} A0={ε}A0={ε}A0={ε}A1=AA2=AAAn=An1A(n>0)
e g : eg: eg:
A = { 0 , 1 } , 则 A 3 = { 000 , 001 , 010 , 011 , 100 , 101 , 110 , 111 } \quad \quad \text{A} = \{ 0, 1 \},则\text{A}^3 = \{ 000, 001, 010, 011, 100, 101, 110, 111 \} A={0,1}A3={000,001,010,011,100,101,110,111}

(3).概念-2

闭包正闭包
符号串集合 A \text{A} A闭包表示 A \text{A} A上一切长度为 n ( n ≥ 0 ) n(n \ge 0) n(n0)的符号串构成的集合,记为 A ∗ \text{A}^{*} A A ∗ = A 0 ∪ A 1 ∪ A 2 ∪ ⋯ ∪ A n ∪ ⋯ \text{A}^{*} = \text{A}^0 \cup \text{A}^1 \cup \text{A}^2 \cup \cdots \cup \text{A}^n \cup \cdots A=A0A1A2An
符号串集合 A \text{A} A闭包表示 A \text{A} A上一切长度为 n ( n > 0 ) n(n \gt 0) n(n>0)的符号串构成的集合,记为 A + \text{A}^{+} A+ A + = A 1 ∪ A 2 ∪ ⋯ ∪ A n ∪ ⋯ \text{A}^{+} = \text{A}^1 \cup \text{A}^2 \cup \cdots \cup \text{A}^n \cup \cdots A+=A1A2An

显然, { A ∗ = A 0 ∪ A + A + = AA ∗ = A ∗ A \begin{cases} \pmb{\text{A}^* = \text{A}^0 \cup \text{A}^+} \\ \pmb{\text{A}^+ = \text{AA}^* = \text{A}^*\text{A}} \\ \end{cases} {A=A0A+A=A0A+A=A0A+A+=AA=AAA+=AA=AAA+=AA=AA

A + \text{A}^+ A+ 表示 A \text{A} A 中的符号所能组成的一切符号串,故某字母表上的语言是该字母表正闭包的真子集

e g : eg: eg:
字 母 表 V = { 0 , 1 } \quad \quad 字母表\text{V} = \{ 0, 1 \} V={0,1}

则 { V ∗ = { ε , 0 , 1 , 00 , 01 , 10 , 11 , 000 , … …   } V + = { 0 , 1 , 00 , 01 , 10 , 11 , 000 , … …   } \quad \quad 则\begin{cases} \text{V}^* = \{ \text{ε}, 0, 1, 00, 01, 10, 11, 000, \dots\dots \} \\ \text{V}^+ = \{ 0, 1, 00, 01, 10, 11, 000, \dots\dots \} \\ \end{cases} {V={ε,0,1,00,01,10,11,000,}V+={0,1,00,01,10,11,000,}



C 语 言 的 字 符 集 U = { a \quad \quad \text{C}语言的字符集\text{U} = \{ a CU={a , b b b , ⋯ ⋯ \cdots\cdots , z z z , 0 0 0 , ⋯ ⋯ \cdots\cdots , 9 9 9 , + + + , − - , ∗ * , / / / , : : : , ′ ' , ( ( ( , ) ) ) , " " " , ⋯ ⋯ \cdots\cdots } \} }

则 { U + 表 示 由 U 上 的 字 符 构 成 的 任 意 长 度 的 符 号 串 的 集 合 任 何 一 个 正 确 的 C 语 言 源 程 序 是 U + 上 的 一 个 元 素 所 有 正 确 的 C 语 言 源 程 序 构 成 的 符 号 串 集 合 是 U + 上 的 真 子 集 \quad \quad 则\begin{cases} \text{U}^+ 表示 由 \text{U}上的字符构成的任意长度的符号串的集合 \\ \pmb{任何一个正确的\text{C}语言源程序是\text{U}^+上的一个元素} \\ \pmb{所有正确的\text{C}语言源程序构成的符号串集合是\text{U}^+上的真子集} \\ \end{cases} U+UCU+任何一个正确的C语言源程序是U+上的一个元素CU+CU+所有正确的C语言源程序构成的符号串集合是U+上的真子集CU+

二、文法与语言的形式定义

1、文法的形式定义

(1).重写规则

重写规则
一个重写规则(简称“规则”)是一个有序对 ( α , β ) (α,β) (αβ),通常写作 α : : = β 或 α → β \alpha ::= \beta \quad 或 \quad \alpha \rightarrow \beta α::=βαβ
其中, { α 称 为 重 写 规 则 的 左 部 β 称 为 重 写 规 则 的 右 部 这 里 的 : : = 或 → 读 作 “ 定 义 为 ” \begin{cases} \alpha称为重写规则的\pmb{左部} \\ \beta称为重写规则的\pmb{右部} \\ 这里的 \quad ::= \quad 或 \quad \rightarrow \quad 读作“定义为” \end{cases} α左部β右部::=
e g : eg: eg:
\quad \quad 有一组规则 { < 标 识 符 >   →   < 字 母 > { < 字 母 > ∣ < 数 字 > } < 字 母 >   →   a ∣ b ∣ c ∣ … ∣ z < 数 字 >   →   0 ∣ 1 ∣ 2 ∣ … ∣ 9 \begin{cases} \pmb{<标识符>} \ \rightarrow \ \pmb{<字母>\{ <字母> | <数字> \}} \\ \pmb{<字母>} \ \rightarrow \ \pmb{a | b | c | \dots | z} \\ \pmb{<数字>} \ \rightarrow \ \pmb{0 | 1 | 2 | \dots | 9} \\ \end{cases}\quad <><标识符><>  <>{<><>}<字母>{<字母><数字>}<>{<><>}<><字母><>  abczabczabcz<><数字><>  01290∣1∣2∣∣90129或者 { < 标 识 符 >   →   < 字 母 > < 标 识 符 >   →   < 标 识 符 > < 数 字 > < 标 识 符 >   →   < 标 识 符 > < 字 母 > < 字 母 >   →   a ∣ b ∣ c ∣ … ∣ z < 数 字 >   →   0 ∣ 1 ∣ 2 ∣ … ∣ 9 \quad\begin{cases} \pmb{<标识符>} \ \rightarrow \ \pmb{<字母>} \\ \pmb{<标识符>} \ \rightarrow \ \pmb{<标识符><数字>} \\ \pmb{<标识符>} \ \rightarrow \ \pmb{<标识符><字母>} \\ \pmb{<字母>} \ \rightarrow \ \pmb{a | b | c | \dots | z} \\ \pmb{<数字>} \ \rightarrow \ \pmb{0 | 1 | 2 | \dots | 9} \\ \end{cases} <><标识符><>  <><字母><><><标识符><>  <><><标识符><数字><><><><标识符><>  <><><标识符><字母><><><><字母><>  abczabczabcz<><数字><>  01290∣1∣2∣∣90129
\quad \quad 也可以写成如下形式 { B  →   A { A ∣ D } A  →   a ∣ b ∣ c ∣ … ∣ z D  →   0 ∣ 1 ∣ 2 ∣ … ∣ 9 \begin{cases} \pmb{\text{B}} \ \rightarrow \ \pmb{\text{A}\{ \text{A} | \text{D} \}} \\ \pmb{\text{A}} \ \rightarrow \ \pmb{a | b | c | \dots | z} \\ \pmb{\text{D}} \ \rightarrow \ \pmb{0 | 1 | 2 | \dots | 9} \\ \end{cases}\quad BBB  A{AD}A{AD}A{AD}AAA  abczabczabczDDD  01290∣1∣2∣∣90129或者 { B  →  A B  →  BD B  →  BA A  →   a ∣ b ∣ c ∣ … ∣ z D  →   0 ∣ 1 ∣ 2 ∣ … ∣ 9 \quad\begin{cases} \pmb{\text{B}} \ \rightarrow \ \pmb{\text{A}} \\ \pmb{\text{B}} \ \rightarrow \ \pmb{\text{B}\text{D}} \\ \pmb{\text{B}} \ \rightarrow \ \pmb{\text{B}\text{A}} \\ \pmb{\text{A}} \ \rightarrow \ \pmb{a | b | c | \dots | z} \\ \pmb{\text{D}} \ \rightarrow \ \pmb{0 | 1 | 2 | \dots | 9} \\ \end{cases} BBB  AAABBB  BDBDBDBBB  BABABAAAA  abczabczabczDDD  01290∣1∣2∣∣90129
元语言符号
: : =   和   → ::= \ 和 \ \rightarrow ::=   表示 定义为
  ∣    \ | \;   表示 或者
{   } min ⁡ max ⁡ \{ \ \}^{\max}_{\min} { }minmax 表示 括号中的内容至少出现 min ⁡ \pmb{\min} minminmin次、至多出现 max ⁡ \pmb{\max} maxmaxmax
[   ] [ \ ] [ ] 表示 括号内的内容可有可无
(   ) ( \ ) ( ) 表示 提出因子 e g : E → E + T  ∣  E − T eg: \text{E} → \text{E} + \text{T} \ | \ \text{E} - \text{T} eg:EE+T  ET 可写为 E → E ( + ∣ − ) T \text{E} → \text{E}(+|-)\text{T} EE(+)T

(2).文法

文法
文法 G \text{G} G是一个四元组 ( V N , V T , P , S ) (\text{V}_\text{N}, \text{V}_\text{T}, \text{P}, \text{S}) (VN,VT,P,S)
其中, { V N 非 终 结 符 号 集 合 V T 由 终 结 符 号 组 成 的 字 母 表 P 有 穷 非 空 的 重 写 规 则 集 合 S 识 别 符 号 ( S ∈ V N ) \begin{cases} \text{V}_\text{N} & 非终结符号集合 \\ \text{V}_\text{T} & 由终结符号组成的字母表 \\ \text{P} & 有穷非空的重写规则集合 \\ \text{S} & 识别符号{\color{#AA66FF}(\text{S} \in \text{V}_\text{N})} \\ \end{cases} VNVTPSSVN

显然, V N ∩ V T = ∅ \text{V}_\text{N} \cap \text{V}_\text{T} = \varnothing VNVT=

e g : eg: eg:
文 法 G E : { 非 终 结 符 号 集 合 V N = { E , T , F } 终 结 符 号 字 母 表 V T = { + , ∗ , i , ( , ) } 识 别 符 S = E 重 写 规 则 集 合 P : { E → E + T E → T T → T ∗ F T → F F → i F → ( E ) \quad \quad 文法\text{G}_\text{E} : \begin{cases} 非终结符号集合 & \text{V}_\text{N} = \{ \text{E}, \text{T}, \text{F} \} \\ \\ 终结符号字母表 & \text{V}_\text{T} = \{ +, *, i, (, ) \} \\ \\ 识别符 & \text{S} = \text{E} \\ \\ 重写规则集合 & \text{P} : \begin{cases} \pmb{\text{E}} → \pmb{\text{E} + \text{T}} \\ \pmb{\text{E}} → \pmb{\text{T}} \\ \pmb{\text{T}} → \pmb{\text{T} * \text{F}} \\ \pmb{\text{T}} → \pmb{\text{F}} \\ \pmb{\text{F}} → \pmb{\text{i}} \\ \pmb{\text{F}} → \pmb{(\text{E})} \\ \end{cases} \\ \end{cases} GE:VN={E,T,F}VT={+,,i,(,)}S=EP:EEEE+TE+TE+TEEETTTTTTTFTFTFTTTFFFFFFiiiFFF(E)(E)(E)

简 单 分 析 , 这 是 一 个 表 达 式 的 文 法 , 是 一 个 简 单 的 有 加 法 、 乘 法 、 小 括 号 的 表 达 式 文 法 。 \quad \quad 简单分析,这是一个表达式的文法,是一个简单的有加法、乘法、小括号的表达式文法。

判断非终结符与终结符的方法
\quad \quad 一般来说,重写规则的左部都是非终结符,只在重写规则右部出现的都是终结符

字汇表
文法 G \text{G} G的字汇表 V = V N ∪ V T \text{V} = \text{V}_\text{N} \cup \text{V}_\text{T} V=VNVT,即字汇表是出现于文法规则中一切符号所组成的集合。
e g : eg: eg:
有 文 法 G [ < 无 符 号 整 数 > ] , 其 有 如 下 重 写 规 则 : \quad \quad 有文法\text{G}[<无符号整数>],其有如下重写规则: G[<>] { < 无 符 号 整 数 > → < 数 字 串 > < 数 字 串 > → < 数 字 串 > < 数 字 > < 数 字 串 > → < 数 字 > < 数 字 > → 0 ∣ 1 ∣ 2 ∣ ⋯ ∣ 9 \begin{cases} \pmb{<无符号整数>} \quad → \quad \pmb{<数字串>} \\ \pmb{<数字串>} \quad → \quad \pmb{<数字串><数字>} \\ \pmb{<数字串>} \quad → \quad \pmb{<数字>} \\ \pmb{<数字>} \quad → \quad \pmb{ 0 | 1 | 2 | \cdots | 9 } \\ \end{cases} <><无符号整数><><><数字串><><><数字串><><><><数字串><数字><><><><数字串><><><数字><><><数字><>01290∣1∣2∣∣90129
则 { V N = { < 数 字 > , < 数 字 串 > , < 无 符 号 整 数 > } V T = { 0 , 1 , 2 , ⋯   , 9 } V = { 0 , 1 , 2 , ⋯   , 9 , < 数 字 > , < 数 字 串 > , < 无 符 号 整 数 > } \quad \quad 则\begin{cases} \text{V}_\text{N} = \{ <数字>, <数字串>, <无符号整数> \} \\ \text{V}_\text{T} = \{ 0, 1, 2, \cdots, 9 \} \\ \text{V} = \{ 0, 1, 2, \cdots, 9, <数字>, <数字串>, <无符号整数> \} \\ \end{cases} VN={<>,<>,<>}VT={0,1,2,,9}V={0,1,2,,9,<>,<>,<>}

(3).句子

直接推导(一步推导)
对于文法 G \text{G} G,有规则 α → β \alpha → \beta αβ x x x y y y 是 字汇表 V \text{V} V 上的符号串(可以为空串 ε \text{ε} ε),若 V \text{V} V 上有另外两个符号串 v v v w w w ,使 v = x α y v = x \alpha y v=xαy w = x β y w = x \beta y w=xβy,则称 v v v 直接推导直接产生出 w w w,或称 w w w 直接归约到 v v v,分别记为 v ⟹ w \pmb{v \Longrightarrow w} vwvwvw w ⇒ △ v \pmb{w \xRightarrow[\triangle]{} v} w vw vw v
可以用产生式的右部替换产生式的左部
e g : eg: eg:
设 有 文 法 G [ E ] : { E → E + T    ∣    T T → T ∗ F    ∣    F F → ( E )    ∣    i \quad \quad 设有文法\text{G}[\text{E}] : \begin{cases} \pmb{\text{E}} → \pmb{\text{E} + \text{T} \; | \; \text{T}} \\ \pmb{\text{T}} → \pmb{\text{T} * \text{F} \; | \; \text{F}} \\ \pmb{\text{F}} → \pmb{(\text{E}) \; | \; \text{i}} \\ \end{cases} G[E]:EEEE+TTE+TTE+TTTTTTFFTFFTFFFFF(E)i(E)i(E)i

做 出 如 下 一 系 列 直 接 推 导 : \quad \quad 做出如下一系列直接推导:

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 \quad \quad \begin{aligned} \text{E} & \Rightarrow \text{E} + \text{T} \\ & \Rightarrow \text{T} + \text{T} \\ & \Rightarrow \text{F} + \text{T} \\ & \Rightarrow \text{i} + \text{T} \\ & \Rightarrow \text{i} + \text{T} * \text{F} \\ & \Rightarrow \text{i} + \text{F} * \text{F} \\ & \Rightarrow \text{i} + \text{i} * \text{F} \\ & \Rightarrow \text{i} + \text{i} * \text{i} \\ \end{aligned} EE+TT+TF+Ti+Ti+TFi+FFi+iFi+ii

做 出 如 下 一 系 列 直 接 归 约 : \quad \quad 做出如下一系列直接归约:

     i + i ∗ i ⇒ △ i + i ∗ F ⇒ △ i + F ∗ F ⇒ △ i + T ∗ F ⇒ △ i + T ⇒ △ F + T ⇒ △ T + T ⇒ △ E + T ⇒ △ E \quad \quad \quad \quad \quad \; \; \begin{aligned} \text{i} + \text{i} * \text{i} & \xRightarrow[\triangle]{} \text{i} + \text{i} * \text{F} \\ & \xRightarrow[\triangle]{} \text{i} + \text{F} * \text{F} \\ & \xRightarrow[\triangle]{} \text{i} + \text{T} * \text{F} \\ & \xRightarrow[\triangle]{} \text{i} + \text{T} \\ & \xRightarrow[\triangle]{} \text{F} + \text{T} \\ & \xRightarrow[\triangle]{} \text{T} + \text{T} \\ & \xRightarrow[\triangle]{} \text{E} + \text{T} \\ & \xRightarrow[\triangle]{} \text{E} \\ \end{aligned} i+ii i+iF i+FF i+TF i+T F+T T+T E+T E

推导(一步或多步推导)
对于文法 G \text{G} G,若存在一直接推导序列 v = u 0 ⇒ u 1 ⇒ u 2 ⇒ ⋯ ⇒ u n = w v = u_0 \Rightarrow u_1 \Rightarrow u_2 \Rightarrow \cdots \Rightarrow u_n = w v=u0u1u2un=w ( n > 0 ) (n > 0) (n>0),则称 v v v 推导出 w w w ,或称 w w w 归约到 v v v,分别记为 v ⇒ + w \pmb{v \xRightarrow[]{+} w} v+ wv+ wv+ w w ⇒ △ + v \pmb{w \xRightarrow[\triangle]{+} v} w+ vw+ vw+ v,并称 n n n推导长度
e g : eg: eg:
设 有 文 法 G [ E ] : { E → E + T    ∣    T T → T ∗ F    ∣    F F → ( E )    ∣    i \quad \quad 设有文法\text{G}[\text{E}] : \begin{cases} \pmb{\text{E}} → \pmb{\text{E} + \text{T} \; | \; \text{T}} \\ \pmb{\text{T}} → \pmb{\text{T} * \text{F} \; | \; \text{F}} \\ \pmb{\text{F}} → \pmb{(\text{E}) \; | \; \text{i}} \\ \end{cases} G[E]:EEEE+TTE+TTE+TTTTTTFFTFFTFFFFF(E)i(E)i(E)i

做 出 如 下 直 接 推 导 : \quad \quad 做出如下直接推导:

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 \begin{aligned} \text{E} & \Rightarrow \text{E} + \text{T} \\ & \Rightarrow \text{T} + \text{T} \\ & \Rightarrow \text{F} + \text{T} \\ & \Rightarrow \text{i} + \text{T} \\ & \Rightarrow \text{i} + \text{T} * \text{F} \\ & \Rightarrow \text{i} + \text{F} * \text{F} \\ & \Rightarrow \text{i} + \text{i} * \text{F} \\ & \Rightarrow \text{i} + \text{i} * \text{i} \\ \end{aligned} EE+TT+TF+Ti+Ti+TFi+FFi+iFi+ii

可 以 写 成 E ⇒ + i + i ∗ i , 推 导 长 度 为    8 \quad \quad 可以写成 \quad \text{E} \xRightarrow[]{+} \text{i} + \text{i} * \text{i},推导长度为\; 8 E+ i+ii8

广义推导(零步或多步推导)
对于符号串 v v v w w w,若 v ⇒ + w v \xRightarrow[]{+} w v+ w v = w v = w v=w,则称符号串 v v v 广义推导到 符号串 w w w,或称符号串 w w w 广义归约到 v v v,分别记为 v ⇒ ∗ w \pmb{ v \xRightarrow[]{*} w} v wv wv w w ⇒ △ ∗ v \pmb{w \xRightarrow[\triangle]{*} v} w vw vw v
e g : eg: eg:
E ⇒ ∗ E \quad \quad \text{E} \xRightarrow[]{*} \text{E} E E


句型、句子
G [ Z ] \text{G}[\text{Z}] G[Z] 是字汇表 V \text{V} V 上的一个文法 { 若    Z ⇒ ∗ x ,    x ∈ V ∗ 则 称    x    是 文 法 G 的 一 个 句 型 若    Z ⇒ ∗ x ,    x ∈ V T ∗ 则 称    x    是 文 法 G 的 一 个 句 子 \begin{cases} 若 \; \text{Z} \xRightarrow[]{*} x, \; x \in \text{V}^* & 则称 \; x \; 是文法\text{G}的一个\pmb{句型} \\ 若 \; \text{Z} \xRightarrow[]{*} x, \; x \in {\text{V}_\text{T}}^* & 则称 \; x \; 是文法\text{G}的一个\pmb{句子} \\ \end{cases} {Z x,xVZ x,xVTxG句型xG句子
Tips V ∗ 是 指 V 的 闭 包 \text{V}^*是指\text{V}的闭包 VV
e g : eg: eg:
设 有 文 法 G [ E ] : { E → E + T    ∣    T T → T ∗ F    ∣    F F → ( E )    ∣    i \quad \quad 设有文法\text{G}[\text{E}] : \begin{cases} \pmb{\text{E}} → \pmb{\text{E} + \text{T} \; | \; \text{T}} \\ \pmb{\text{T}} → \pmb{\text{T} * \text{F} \; | \; \text{F}} \\ \pmb{\text{F}} → \pmb{(\text{E}) \; | \; \text{i}} \\ \end{cases} G[E]:EEEE+TTE+TTE+TTTTTTFFTFFTFFFFF(E)i(E)i(E)i

做 出 如 下 一 系 列 直 接 推 导 : \quad \quad 做出如下一系列直接推导:

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 \begin{aligned} \text{E} & \Rightarrow \text{E} + \text{T} \\ & \Rightarrow \text{T} + \text{T} \\ & \Rightarrow \text{F} + \text{T} \\ & \Rightarrow \text{i} + \text{T} \\ & \Rightarrow \text{i} + \text{T} * \text{F} \\ & \Rightarrow \text{i} + \text{F} * \text{F} \\ & \Rightarrow \text{i} + \text{i} * \text{F} \\ & \Rightarrow \text{i} + \text{i} * \text{i} \\ \end{aligned} EE+TT+TF+Ti+Ti+TFi+FFi+iFi+ii

因 此 , { E + T T + T F + T i + T i + T ∗ F i + i ∗ i 都 是 文 法 G [ E ] 的 句 型 \quad \quad 因此,\begin{cases} \text{E} + \text{T} \\ \text{T} + \text{T} \\ \text{F} + \text{T} \\ \text{i} + \text{T} \\ \text{i} + \text{T} * \text{F} \\ \text{i} + \text{i} * \text{i} \\ \end{cases}都是文法\text{G}[\text{E}]的句型 E+TT+TF+Ti+Ti+TFi+iiG[E]

而 i + i ∗ i , 既 是 文 法 G [ E ] 的 一 个 句 型 , 又 是 文 法 G [ E ] 的 一 个 句 子 \quad \quad 而\text{i} + \text{i} * \text{i},既是文法\text{G}[\text{E}]的一个句型,又是文法\text{G}[\text{E}]的一个句子 i+iiG[E]G[E]

2、语言的形式定义

(1).语言

假定 G [ S ] \text{G}[\text{S}] G[S] 是一个文法, S \text{S} S 是文法的识别符号。由该文法描述的语言用 L ( G [ S ] ) \pmb{\text{L}(\text{G}[\text{S}])} L(G[S])L(G[S])L(G[S]) 表示,则 L ( G [ S ] ) = { x    ∣    S ⇒ ∗ x    且    x ∈ V T ∗ } \text{L}(\text{G}[\text{S}]) = \{ x \; | \; \text{S} \xRightarrow[]{*} x \; 且 \; x \in {\text{V}_\text{T}}^* \} L(G[S])={xS xxVT}

文法描述的语言是该文法一切句子的集合。
文法描述的语言是该文法的终结符集合的闭包( V T ∗ \pmb{{\text{V}_\text{T}}^*} VTVTVT)的真子集。

e g : eg: eg:
设 有 文 法 G [ E ] : { E → E + T    ∣    T T → T ∗ F    ∣    F F → ( E )    ∣    i \quad \quad 设有文法\text{G}[\text{E}] : \begin{cases} \pmb{\text{E}} → \pmb{\text{E} + \text{T} \; | \; \text{T}} \\ \pmb{\text{T}} → \pmb{\text{T} * \text{F} \; | \; \text{F}} \\ \pmb{\text{F}} → \pmb{(\text{E}) \; | \; \text{i}} \\ \end{cases} G[E]:EEEE+TTE+TTE+TTTTTTFFTFFTFFFFF(E)i(E)i(E)i

则 文 法 G [ E ] 描 述 的 语 言 是 由    i    ,    +    ,    ∗    ,    (    ,    )    组 成 的 所 有 表 达 式 \quad \quad 则文法\text{G}[\text{E}]描述的语言是由 \; \text{i} \; , \; + \; , \; * \; , \; ( \; , \; ) \; 组成的所有表达式 G[E]i,+,,(,)

VT*
(i+)
ii
i)
L(G[E])

像 { ( i + ) ii i ) 这 些 符 号 串 都 不 是 文 法 G [ E ] 的 句 子 , 所 以 他 们 都 不 属 于 集 合 L ( G [ E ] ) \quad \quad 像\begin{cases} (\text{i}+) \\ \text{ii} \\ \text{i}) \\ \end{cases}这些符号串都不是文法\text{G}[\text{E}]的句子,所以他们都不属于集合\text{L}(\text{G}[\text{E}]) (i+)iii)G[E]L(G[E])

L ( G [ E ] ) 是 V T ∗ 的 真 子 集 \quad \quad \text{L}(\text{G}[\text{E}])是{\text{V}_\text{T}}^*的真子集 L(G[E])VT

\quad \quad 一个正确的源程序应该是能够从该语言的文法识别符号开始推导出来的一个符号串,换句话说,如果一个源程序不能从该语言的文法识别符号推导出来,那么这必然是一个错误的源程序



文法和语言的关系

  • 给定一个文法,就能从结构上唯一地确定其语言
  • 给定一个语言,能确定其文法,但这种文法不是唯一的

题 例 1 \pmb{题例1} 1题例11
设 有 文 法 G [ A ]    :    A → b A    ∣    a \quad \quad 设有文法 \text{G}[\text{A}] \; : \; \text{A} → b\text{A} \; | \; a G[A]AbAa
求 证 : 该 文 法 G [ A ] 所 确 定 的 语 言 是 L ( G [ A ] ) = { b i a    ∣    i ≥ 0 } \quad \quad 求证:该文法 \text{G}[\text{A}] 所确定的语言是 \text{L}(\text{G}[\text{A}]) = \{ b^ia \; | \; i \ge 0 \} G[A]L(G[A])={biai0}

数 学 归 纳 法 \quad \quad \pmb{数学归纳法} 数学归纳法

证 明 : \quad \quad \pmb{证明:} 证明:
要 证 明 “ 文 法 G [ A ] 所 确 定 的 语 言 是 L ( G [ A ] ) = { b i a    ∣    i ≥ 0 } ” \quad \quad \quad \quad 要证明 “文法 \text{G}[\text{A}] 所确定的语言是 \text{L}(\text{G}[\text{A}]) = \{ b^ia \; | \; i \ge 0 \}” G[A]L(G[A])={biai0}
即 证 明 “ A 通 过 文 法 G [ A ] 的 规 则 广 义 推 导 出 的 句 子 都 是 是 形 如    b i a    的 终 结 符 号 串 ” \quad \quad \quad \quad 即证明 “\text{A}通过文法 \text{G}[\text{A}] 的规则广义推导出的句子都是是形如 \; b^i a \; 的终结符号串” AG[A]广bia
即 证 明 “ 使 用 规 则 A → b A    ∣    a    可 以 得 到    A ⇒ ∗ b i a ( i ≥ 0 )    ” \quad \quad \quad \quad 即证明 “使用规则\text{A} → b\text{A} \; | \; a \; 可以得到 \; \text{A} \xRightarrow[]{*} b^ia ( i \ge 0) \;” 使AbAaA bia(i0)
现 用 数 学 归 纳 法 证 明 如 下 : \quad \quad \quad \quad 现用数学归纳法证明如下:
①    当    i = 0    时 , 显 然    A ⇒ ∗ a    , 命 题 成 立 \quad \quad \quad \quad \quad \quad ① \; 当 \; i = 0 \; 时,显然 \; \text{A} \xRightarrow[]{*} a \; ,命题成立 i=0A a
②    假 设    i = k ( k ≥ 0 )    时 , 命 题 成 立 , 有    A ⇒ ∗ b k a    \quad \quad \quad \quad \quad \quad ② \; 假设 \; i = k( k \ge 0) \; 时,命题成立,有 \; \text{A} \xRightarrow[]{*} b^k a \; i=k(k0)A bka
当    i = k + 1    时 , A ⟹ b A ⇒ ∗ b ⋅ b k a ( A ⇒ ∗ b k a ) =          b k + 1 a \quad \quad \quad \quad \quad \quad \quad \quad \begin{aligned} 当 \; i = k + 1 \; 时, \text{A} & \Longrightarrow b\text{A} \\ & \xRightarrow[]{*} b \cdot b^k a & (\text{A} \xRightarrow[]{*} b^k a) \\ & \xlongequal[]{\;\;\;\;} b^{k+1} a \end{aligned} i=k+1AbA bbka bk+1aA bka
即    A ⇒ ∗ b k + 1 a    \quad \quad \quad \quad \quad \quad \quad \quad 即 \; \text{A} \xRightarrow[]{*} b^{k+1} a \; A bk+1a
即 当    i = k + 1    时 , 命 题 也 成 立 \quad \quad \quad \quad \quad \quad \quad \quad 即当 \; i = k+1 \; 时,命题也成立 i=k+1
综    ①    ②    , 使 用 规 则 A → b A    ∣    a    可 以 得 到    A ⇒ ∗ b i a ( i ≥ 0 )    \quad \quad \quad \quad 综 \; ① \; ② \;,使用规则\text{A} → b\text{A} \; | \; a \; 可以得到 \; \text{A} \xRightarrow[]{*} b^ia ( i \ge 0) \; 使AbAaA bia(i0)
从 而 原 命 题 得 证 \quad \quad \quad \quad 从而原命题得证

题 例 2 \pmb{题例2} 2题例22
设 L = { a 2 n b    ∣    n ≥ 1 } , 这 里 V T = { a , b } . \quad \quad 设\text{L} = \{ a^{2n} b \; | \; n \ge 1 \},这里\text{V}_\text{T} = \{ a, b \}. L={a2nbn1}VT={a,b}.
试 为 其 构 造 相 应 的 文 法 。 \quad \quad 试为其构造相应的文法。

解 : \quad \quad \pmb{解:} 解:
先 考 虑    n = 1 、 2 、 3    的 特 殊 情 况 { n = 1 a a b n = 2 a a a a b n = 3 a a a a a a b \quad \quad \quad \quad 先考虑 \; n = 1、2、3 \; 的特殊情况\begin{cases} n = 1 & aab \\ n = 2 & aaaab \\ n = 3 & aaaaaab \\ \end{cases} n=123n=1n=2n=3aabaaaabaaaaaab
显 然 , 规 律 是 偶 数 个    a    后 跟 一 个    b    , 且 可 能 有 无 穷 多 个    a    \quad \quad \quad \quad 显然,规律是偶数个 \; a \; 后跟一个 \; b \;,且可能有无穷多个 \; a \; aba
因 此 规 则 中 一 定 有 递 归 \quad \quad \quad \quad 因此规则中一定有递归
可 设 计 规 则    G [ Z ]    :    { Z → A b A → a A a    ∣    a a    或    G [ Z ]    :    { Z → A b A → A a a    ∣    a a    等 。 \quad \quad \quad \quad 可设计规则 \; \text{G}[\text{Z}] \; : \; \begin{cases} \text{Z} → \text{A}b \\ \text{A} → a\text{A}a \; | \; aa \\ \end{cases} \; 或 \; \text{G}[\text{Z}] \; : \; \begin{cases} \text{Z} → \text{A}b \\ \text{A} → \text{A}aa \; | \; aa \\ \end{cases} \; 等。 G[Z]:{ZAbAaAaaaG[Z]:{ZAbAAaaaa


小结:其实从 题 例 1 ‾ \underline{\pmb{题例1}} 1题例11 题 例 2 ‾ \underline{\pmb{题例2}} 2题例22 中看出 文法和语言的关系

(2).递归规则

{ 如 果 一 个 规 则 形 如    U → … U … 则 称 该 规 则 是 递 归 的 如 果 一 个 规 则 形 如    U → U … 则 称 该 规 则 是 左 递 归 的 如 果 一 个 规 则 形 如    U → … U 则 称 该 规 则 是 右 递 归 的 \begin{cases} 如果一个规则形如 \; \text{U} → \dots \text{U} \dots & 则称该规则是\pmb{递归}的 \\ 如果一个规则形如 \; \text{U} → \text{U} \dots & 则称该规则是\pmb{左递归}的 \\ 如果一个规则形如 \; \text{U} → \dots \text{U} & 则称该规则是\pmb{右递归}的 \\ \end{cases} UUUUUU递归左递归右递归

(3).等价

L ( G 1 ) = L ( G 2 ) \text{L}(\text{G}_1) = \text{L}(\text{G}_2) L(G1)=L(G2),则称文法 G 1 \text{G}_1 G1 G 2 \text{G}_2 G2等价的。

e g : eg: eg:
这 三 种 文 法 就 是 等 价 的 { G 1 [ Z ]    :    { Z → A b A → a A a    ∣    a a G 2 [ Z ]    :    { Z → A b A → a a A    ∣    a a G 3 [ Z ]    :    { Z → A b A → A a a    ∣    a a \quad \quad 这三种文法就是等价的\begin{cases} \text{G}_1[\text{Z}] \; : \; \begin{cases} \text{Z} → \text{A}b \\ \text{A} → a\text{A}a \; | \; aa \\ \end{cases} \\ \\ \text{G}_2[\text{Z}] \; : \; \begin{cases} \text{Z} → \text{A}b \\ \text{A} → aa\text{A} \; | \; aa \\ \end{cases} \\ \\ \text{G}_3[\text{Z}] \; : \; \begin{cases} \text{Z} → \text{A}b \\ \text{A} → \text{A}aa \; | \; aa \\ \end{cases} \\ \end{cases} G1[Z]:{ZAbAaAaaaG2[Z]:{ZAbAaaAaaG3[Z]:{ZAbAAaaaa

它 们 都 确 定 了 语 言 L = { a 2 n b    ∣    n ≥ 1 } \quad \quad 它们都确定了语言\text{L} = \{ a^{2n} b \; | \; n \ge 1 \} L={a2nbn1}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

God-Excious

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值