编译原理笔记--2

语言及其文法

基本概念

字母表

字母表 ∑是一个有穷符号集合

​ 符号:字母,数字,标点符号

​ 例:

​ 二进制字母表: 二进制字母表: 二进制字母表: 二进制字母表: { 0,1 }

​ ASCII字符集

​ Unicode字符集

字母表上的运算

字母表 ∑1和∑2的乘积 (product)

​ ∑1∑2={ ab |a∈ ∑1, b∈ ∑2}

​ 例: { 0, 1} { 0, 1} a, b} ={0 a, 0 b, 1 a, 1 b}

字母表 ∑的n次幂 ( power)

∑0 ={ ={ ε }
∑n=∑n-1 ∑

n ≥ 1

例子:

{0, 1}3={0, 1} ,{0, 1} ,{0, 1}

={000,001,010,011,100,101,110,111}

字母表的 n次幂:长度为 n的符号串构成的集合

字母表 ∑的正闭包

​ ∑+ = ∑ ∪ ∑2 ∪ ∑3 ∪ …

例: {a, b, c, d }+== {a, b, c, d,

aa , ab , ac, ad, ba , bb, bc , bd …, , …

,
aaa , aab , aac , aad , aba , abb , abc , …}

字母表的正闭包:长度正数的符号串构成的集合

字母表 ∑的克林闭包

∑*= ∑0 ∪ ∑+ = ∑0 ∪ ∑ ∪ ∑2 ∪ ∑3 ∪ …

例: {a, b, c, d }+== { ε,a, b, c, d,

aa , ab , ac, ad, ba , bb, bc , bd …, , …

,
aaa , aab , aac , aad , aba , abb , abc , …}

字母表的克林闭包:任意符号串(长度可以为零)构成的集合

设∑是一个字母表,对于任意一个 x∈∑*,x称为是 ∑上的一个 上的一个 串

​ 串是 字母表中 符号的 一个 有穷 序列

串s的长度 ,通常记作 ,通常记作 |s|,是指 s中符号的个数

​ 例: |aab |=3 |=3

空串 是长度为 0的串 用 ε(epsilon )表示

|ε|= 0 

串上的运算--连接

如果 x和y是串,那么 x和y的连接 (concatenation )
是把 y附加到 x后面而形成的串,记作 xy

例如,如果 x=dog 且 y=house ,那么 xy =doghouse

空串 是连接运算的 单位元 ( identity ),即对于任
何串 s都有, εs = sε =s

设x,y,z 是三个字符串,如果 x= yz , 则称 y是x的前缀 ,z是x的后缀

串上的运算-幂

串s的幂运算

s0= ε = ε ,

sn= s n-1s, n ≥ 1

​ s1= s0s=εs = s s = ,s2(s的平方)= ss ,s3(s的三次方)= sss ,…

​ 例:如果 s =ba ,那么 s1= ba ,s2=baba , s3=bababa ,

​ 串s的n次幂:将 n个s连接起来

文法的定义

自然语言的例子--句子的构成规则

<句子> ----> <名词短语> <动词短语>

<名词短语> ----> <形容词> <名词短语>

<名词短语> -----> <名词>

<动词短语> ----> <动词> <名词短语>

<形容词> ----> little

<名词> ---> boy

<名词> ----> apple

<动词> ----> eat

未用尖括号起来部分表示语言的基本符号

尖括号起来部分称为语法成分

文法的形式会定义

G=(VT,VN,P,S)

VT:终结符集合

​ 终结符 (terminal symbol)是文法所定义的 语言基本 符号

​ 有时也称为 有时也称为 有时也称为 token

​ 例:VT={apple, boy, eat, little}

VN:非终结符集合

​ 非终结符 (nontermina )是用来表示语法成分的符号, 有时也称为“ 语法变量”

​ 例: VN= { = { <句子> , <名词短语> , <动词短语> <名 词> , … , … }

P:产生式集合

产生式 (production )描述了将终结符和非组合成串的方法
产生式的一般形: 产生式的一般形: 产生式的一般形式:

​ α→β

读作: α定义为 定义为 β

​ α∈(VT∪VN)+,且α中至少包含 中至少包含 VN中的 一个元素:称为产生式头 (hea d)或左部 (left side)
​ β∈(VT∪VN)*:称为产生式的 :称为产生式的 :称为产生式的 体(body )或右部 (right side)

例: P= <句子> ----> <名词短语> <动词短>

​ <名词短语> ----> <形容词> <名词短语> ,
… … … … …

S:开始符号

S∈VN。开始符号 (start symbo l)表示的 是该文法中最大语法成分

例: S= <句子>

例: G=( {id, +, **, (, )}, {E}, P,E)*

P={E→ E+E,

​ E→ E*E,

​ E→ (E),

​ E→ id }

G:E→ E+E

E→ E*E

E→ (E)

E→ id

约定:
不引起歧义的 前提下,可以 只写产生式 只写产生式

产生式的简写

对一组有 相同左部 相同左部 的产生式

​ α→β1, α→β2, … , , … α→βn

可以简记为:

​ α→β1| β2| … | | … | … | … βn

读作: α定义为 β1,或者 β2,…,或者 βn

β1,β2,…,βn称为 α的候选式 (Candidate )

例子

E→ E+E
 E→ E*E
  E→ (E)
   E→ id

转化为

E → E+ E| E * E |( E) | id ) | id)

符号约定

下述符号是 终结符

​ (a) 字母表中 排在前面的小写字母 排在前面的小写字母 排在前面的小写字母 排在前面的小写字母 ,如 a、b、c

​ (b) 运算符 ,如 +、*等

​ (c) 标点符号 ,如 括号、逗号等

​ (d) 数字 0、1、. . . . . 、9

​ (e) 粗体字符串 ,如 id 、if 等

下述符号是非终结符

 (a) 字母表中 排在前面的大写字母 排在前面的大写字母 排在前面的大写字母 排在前面的大写字母 ,如 A、B、C

 (b) 字母 S。通常表示开始符号 。通常表示开始符号 。通常表示开始符号 。通常表示开始符号 。通常表示开始符号

 (c) 小写、斜体的名字 小写、斜体的名字 小写、斜体的名字 小写、斜体的名字 小写、斜体的名字 小写、斜体的名字 小写、斜体的名字 ,如 expr 、stmt 等

 (d) 代表程序构造的大写字母 代表程序构造的大写字母 代表程序构造的大写字母 代表程序构造的大写字母 代表程序构造的大写字母 代表程序构造的大写字母 。如 E(表达式 表达式 )、T(项)和F(因子 )

字母表中 排在后面的大写字母 (如 X、Y、Z) 表示 文法符号 (即终结符或非终结符)

字母表中 排在后面的小写字母 (主要是 (主要是 u、v、. . . 、z) 表示 终结符号串 (包括 (包括 空串 )

 小写希腊字母 ,如 α、β、γ,表示 文法符号串 (包括 (包括 空串 )

除非特别说明 第一个产生式的左部 就是 开始符号 开始符号

语言的定义

自然语言的例子

<句子> ----> <名词短语> <动词短语>

<名词短语> ----> <形容词> <名词短语>

<名词短语> -----> <名词>

<动词短语> ----> <动词> <名词短语>

<形容词> ----> little

<名词> ---> boy

<名词> ----> apple

<动词> ----> eat

单词串:little boy eats apple

推导 和归约

给定文法 G= (VT , V N , P S , P S , P S , P S ),如果 α→β ∈ P,那么 可以将符号串 γαδ中的 α替换 为β,也就是说,将 ,也就是说将 γαδ 重写 (rewrite rewrite )为γβδ,记作 γαδ --> γβδ。此时,称文法 中的符号串 γαδ 直接推导 (directly derive directly derive directly derive directly derivedirectly derive )出 γβδ

​ 简而言之,就是产生式的右部替换产生式的左部

如果 α0-->α1,α1-->α2,α2-->α3,…,αn-1-->αn,则 可以记作 α0-->α1--->α2-->α3-- …---> αn-1--->αn,称符 号串 α0经过 n步推导 出αn,可简记为 ,可简记为 α0-->n αn(n倍的an)

α -->0α

-->+表示“经过正数步推导” 表示“经过正数步推导” 表示“经过正数步推导” 表示“经过正数步推导” 表示“经过正数步推导”

-->*表示“经过若干(可以是 表示“经过若干(可以是 表示“经过若干(可以是 表示“经过若干(可以是 表示“经过若干(可以是 表示“经过若干(可以是 表示“经过若干(可以是 0)步推导” )

句型和句子

如果 S--->* α,α∈(VT∪VN)*,则称 α是G的一个 句型

​ 一个句型中既可以包含 终结符,又可以包含 非终 结符 ,也可能是 空串

​ 如果 S-->* w,w ∈VT*,则称 w是G的一个 句子 (sentence)

​ 句子是不包含非终结符 的句型

语言的形式化定义

由文法 G的开始符号 S推导出的所有句子构成 的集合称为 的集合称为 的集合称为 的集合称为 文法 G生成的语言 ,记为 L(G )。 即

L(G )={w | S -->* w, w∈ VT* }

语言上的运算

文法的分类

Chomsky文法分类体系

0型文法 (TypeType -0 Grammar Grammar )

1型文法 (TypeType -1Grammar Grammar )

2型文法 (TypeType -2Grammar )

3型文法 (TypeType -3Grammar Grammar )

0型文法

​ α → β

无限制文法 /短语结构文法

∀α → β∈P, α中至少包含1个非终结符

0型语言

由0型文法 G生成的语言 生成的语言 生成的语言 L(G )

1型文法

​ α → β

上下文有关文法(Context-Sensitive Grammar , CSG )

∀α → β∈P,|α|≤|β |

产生式的一般形式: α1Aα2 → α1βα2 ( β≠ε )

上下文有关语言(1型语言)

由上下文有关文法 (1型文法) G生成的语言L(G )

CSG 中不包含 ε-产

2型文法

​ α → β

上下文无关文法 (Context-Free Grammar, CFG )

∀α → β∈P,α ∈ VN

产生式的一般形式:A→β

上下文无关语言( 2型语言)

 由上下文无关法 (2型文法 ) G生成的语言 L(G )

3型文法

​ α → β

正则文法(Regular Grammar, RG )

➢ 右线性(Right Linear)文法: A→wB 或 A→w

➢ 左线性(Left Linear) 文法: A→Bw 或 A→w

➢左线性文法和右线性文法都称为正则文法

正则语言(3型语言)

➢由正则文法 (3型文法) G生成的语言L(G )

正则文法能描述程序设计语言的多数单词

四种文法之间的关系

逐级限制

➢ 0型文法:α中至少包含1个非终结符

➢ 1型文法(CSG) :|α|≤|β|

➢ 2型文法(CFG) :α ∈ VN

➢ 3型文法(RG):A→wB 或 A→w (A→Bw 或A→w)

逐级包含

CFG的分析树

CFG的分析树

➢ 根节点的标号为文法开始符号

➢ 内部结点表示对一个产生式A→β的应用,该结点的标号是此产生式左部A 。该结点的子结点的标号从左到右构成了产生式的右部β

➢ 叶结点的标号既可以是非终结符,也可以是终结符。从左到右排列叶
节点得到的符号串称为是这棵树的产出( yield )或边缘(f rontier)

分析树是推导的图形化表示

给定一个推导 S --> α1--> α2--->…--> αn ,对于推导过程中得到的每一个句型αi,都可以构造出一个边缘为αi的分析树

推导过程:E
---> -E ---> - ( E ) ---> - ( E+E ) ---> - ( id+E )---->( id+id )

(句型的)短语

给定一个句型,其分析树中的每一棵子树的边缘称为该句型的一个短语(phrase)

➢ 如果子树只有父子两代结点,那么这棵子树的边缘称为该句型的一个直接短语(immediate phrase)

二义性文法

如果一个文法可以为某句子生成 多棵分析树 , 则称这个文法是 则称这个文法是 则称这个文法是 则称这个文法是 二义性 的

二义性文法的判定

对于任意一个上下文无关文法,不存在一个算法,
判定它是无二义性的;但能给出一组充分条件,
满足这组充分条件的文法是无二义性的

满足,肯定无二义性

不满足,也未必就是有二义性的

猜你喜欢

转载自www.cnblogs.com/a-small-Trainee/p/12420093.html