语言是由句子组成的集合,是由一组记号所构成的集合 。 汉语...

64
编编编编 编编编编 1 编编编编编编编编编编编 编编编 编编编编编编编编编 ,一 编编 -- 编编编编编编编编编编编编编编编 -- 编编编编编编编编编编编编编编编编编编编 -- 编编编编编编编编编编编编编编 编编编编编编编编编 编编编编编编编 编编编编编编编编编编编 编编 3.1 编编编编编编编 编 3 编 编编编编编 返返返返

Upload: pia

Post on 20-Jan-2016

185 views

Category:

Documents


0 download

DESCRIPTION

第 3 章 文法和语言. 3.1 文法的直观概念. 语言. 语言是由句子组成的集合,是由一组记号所构成的集合 。 汉语 --所有符合汉语语法的句子的全体 英语 --所有符合英语语法的句子的全体 程序设计语言 --所有该语言的程序的全体 研究语言 : 每个句子构成的规律 每个句子的含义 每个句子和使用者的关系. 返回目录. 研究程序设计语言: 每个程序构成的规律 每个程序的含义 每个程序和使用者的关系 语言研究的三个方面: 语法 Syntax - PowerPoint PPT Presentation

TRANSCRIPT

编译原理编译原理

1

• 语言是由句子组成的集合,是由一组记号所构成的集合。。

• 汉语 -- 所有符合汉语语法的句子的全体• 英语 -- 所有符合英语语法的句子的全体• 程序设计语言 -- 所有该语言的程序的全体• 研究语言 :

每个句子构成的规律 每个句子的含义 每个句子和使用者的关系

语言3.1 文法的直观概念

第 3 章 文法和语言

返回目录

编译原理编译原理

2

研究程序设计语言: 每个程序构成的规律 每个程序的含义 每个程序和使用者的关系语言研究的三个方面: 语法 Syntax 语义 Semantics 语用 Pragmatics

编译原理编译原理

3

语法 -- 表示构成语言句子的各个记号之间的组合规律。组合规律。语义 -- 表示按照各种表示方法所表示的各个记号的特定含含

义义。(各个记号和记号所表示的对象之间的关系)。语用 -- 表示在各个记号所出现的行为中,它们的来源、使来源、使

用和影响用和影响。

编译原理编译原理

4

• 如果不考虑语义和语用,即只从语法语法这一侧面来看语言,这种意义下的语言称作形式语言形式语言。

• 形式语言抽象地定义为一个数学系统。“形式”是指这样的事实:语言的所有规则只以什么符号串能出现的方式来陈述。形式语言理论是对符号串集合的表示法、结构及其特性的研究。是程序设计语言语法分析研究的基础。

形式语言

编译原理编译原理

5

文法

“ 我是大学生”是否是该语言的句子?

〈句子〉 ::= 〈主语〉〈谓语〉

〈主语〉 ::= 〈代词〉 | 〈名词〉

〈代词〉 ::= 你 | 我 | 他

〈名词〉 ::= 王明 | 大学生 | 工人 | 英语

〈谓语〉 ::= 〈动词〉〈直接宾语〉

〈动词〉 ::= 是 | 学习

〈直接宾语〉 ::= 〈代词〉 | 〈名词〉

以自然语言为例:用 EBNF 描述一种语言:

编译原理编译原理

6

〈句子〉 〈主语〉〈谓语〉 〈代词〉〈谓语〉  我〈谓语〉  我〈动词〉〈直接宾语〉  我是〈直接宾语〉  我是〈名词〉  我是大学生

〈句子〉 ::= 〈主语〉〈谓语〉〈主语〉 ::= 〈代词〉 | 〈名词〉〈代词〉 ::= 你 | 我 | 他〈名词〉 ::= 王明 | 大学生 | 工人 | 英语〈谓语〉 ::= 〈动词〉〈直接宾语〉〈动词〉 ::= 是 | 学习〈直接宾语〉 ::= 〈代词〉 | 〈名词〉

编译原理编译原理

7

我是大学生

王明是大学生

王明学习英语

他学习英语

你是工人

我大学生是

大学生是王明

英语学习王明

大学生学习他

工人是英语

下列语句是否为该文法的句子:

编译原理编译原理

8

• 字母表:元素的非空有穷集合。(符号集)• 符号:字母表中的元素。

例如:

汉语的字母表中包括汉字、数字及标点符号等。

PASCAL 语言的字母表是由字母、数字、若干专用符号及 BEGIN 、 IF 之类的保留字组成。

3.2 符号和符号串

编译原理编译原理

9

•符号串:由字母表中的符号组成的任何有穷序列称为该字母表上的符号串。

1. 空符号串 ε( 没有符号的符号串 ) 是上的符号串

2. 若 x 是上的符号串 ,a 是的元素 , 则 xa 是上的符号串

3. y 是上的符号串 , 当且仅当它可以由 1 和 2 导出。

例如: Σ={a,b} ε,a,b,aa,ab,aabba,…, 都是上的符号串

编译原理编译原理

10

例: Σ={0,1}ε,0,1,00,01,11,1001110 等都是上的符号串。

例: Σ={a,b,c} 上的符号串有:a,b,c,ab,ba,aaca,acaa 等。

注意:1. 符号串中的符号排列是有顺序的。2. 可以用字母表示符号串,如 x=aaca 。

编译原理编译原理

11

如果 z = xy 是一符号串,那么: x 是 z 的头, y 是 z 的尾; 如果 x 非空,那么 y 是固有尾;如果 y 非

空,那么 x 是固有头。

例:

设 z = abc, 那么

z 的头是: ε,a ,ab , abc (除 abc 外都是固有头)

z 的尾是: ε,c ,bc , abc (除 abc 外都是固有尾)

编译原理编译原理

12

几种表示法( x,z 是符号串 ,t 是符号):

z = x… x 是符号串 z 的头

z = …x… x 在符号串 z 中某处出现

z = t… 符号 t 是 符号串 z 的第一个符号

编译原理编译原理

13

符号串的运算符号串的长度:符号串中符号的个数 . 符号串 s 的长度记为 |s| 。 ε 的长度为 0

连接:符号串 x 、 y 的连接 , 是把 y 的符号写在 x 的符号之后得到的符号串 xy

例 x=ST,y=abu 则 xy=STabu |x|=2,|y|=3,|xy|=5

• εx = xε= x

编译原理编译原理

14

方幂:符号串 x 自身连接 n 次得到的符号串 xx…xx(n 个 x) 定义为 xn 。

• x0=ε, x1=x, x2=xx, x3=xxx

• x=AB, 则 x0=ε, x1=AB, x2=ABAB, x3=ABABAB

•对于 n>0, xn = xxn-1 = xn-1x

编译原理编译原理

15

• 符号串集合:若集合 A 中一切元素都是某字母表上的符号串,则称 A 为字母表上的符号串集合。

• 两个符号串集合 A 和 B 的乘积定义为AB =xy|xA 且 yB若 集合 A=a,b B = c,d则 AB =ac,ad,bc,bd {ε}A = A {ε}= A ( εx = xε= x)∵

• 使用 * 表示上的所有有穷长的串(包括 ε )的集合。 Σ* 称为 Σ 的闭包。

• 从 * 中除去 ε 得到的集合记为 + 。 Σ+ 称为 Σ 的正闭包。

编译原理编译原理

16

Σ* = Σ0 Σ∪ 1 Σ∪ 2 … Σ∪ n …

Σ+ = Σ1 Σ∪ 2 … Σ∪ n …

Σ* = Σ0 Σ∪ +

Σ+ = ΣΣ* = Σ* Σ

Σ+ = Σ* -{ε}

例:设 Σ={0,1} ,则

Σ* ={ε, 0, 1, 00, 01, 10, 11, 000, 001, 010,…}

例:设 Σ={a,b} ,则 Σ*={ε,a,b,aa,ab,ba,bb,aaa,aab,…}

Σ+={a,b,aa,ab,ba,bb,aaa,aab,…}

编译原理编译原理

17

3.3 文法和语言的形式定义• 规则(重写规则、产生式或生成式),是形如

α→β 或 α =β∷ 的( α , β )有序对,其中 α 是某字母表 V 的正闭包 V+ 中的一个符号, β 是 V*中的一个符号。( α V∈ + , β V*)∈

• α 称为规则的左部 ( 或生成式的左部 ) 。• β 称为规则的右部 ( 或生成式的右部 ) 。

编译原理编译原理

18

• 文法 G 定义为四元组( VN , VT , P , S )

– VN :非终结符集– VT :终结符集– P :产生式(规则)集合– S :开始符号(识别符号)VN 、 VT 和 P 是非空有穷集。 S 至少在一条规

则中作为左部出现。VN∩VT= φ , S V∈ N

V=VN V∪ T ,称为文法 G 的字母表(字汇表)。

文法的定义

编译原理编译原理

19

例 3.1 文法 G= ( VN , VT , P , S )

VN = { S }, VT ={ 0, 1 }

P={ S→0S1, S→01 }

S 为开始符号

编译原理编译原理

20

例 3.2 文法 G= ( VN , VT , P , S )

VN ={ 标识符,字母,数字 }

VT ={a,b,c,…x,y,z,0,1,…,9}

P={< 标识符 >→< 字母 >

< 标识符 >→< 标识符 >< 字母 >

< 标识符 >→< 标识符 >< 数字 >

< 字母 >→a,…, < 字母 >→z

< 数字 >→0,…, < 数字 >→9 }

S=< 标识符 >

编译原理编译原理

21

习惯上只将产生式写出。并有如下约定:• 第一条产生式的左部是开始符号。• 用尖括号括起的是非终结符,否则为终结符。或

者大写字母表示非终结符,小写字母表示终结符。• G 可写成 G[S] ,其中 S 是开始符号。

例 3.1 文法 G= ( VN , VT , P , S )

VN = { S }, VT ={ 0, 1 }

P={ S→0S1, S→01 } S 为开始符号 可写成: G : S→0S1

S→01

或写成: G[S] : S→0S1

S→01

编译原理编译原理

22

• 直接推导“”α→β 是文法 G 的产生式, γ,δ V*∈ ,若有 v,w 满足:v=γαδ,w= γβδ,

则说: v (应用规则 α→β )直接产生 w

或说: w 是 v 的直接推导或说: w 直接归约到 v

记作 v w

推导的定义

编译原理编译原理

23

– 例: G : S→0S1 , S→01– 直接推导:

• 0S10011 ( v=0S1 , w=0011 ,使用规则S→01 , γ=0 , δ=1 )

• S 0S1 ( v=S , w=0S1 ,使用规则 S→0S1 , γ=ε , δ= ε )

• 0S100S11 ( v=0S1 , w=00S11 ,使用规则S→0S1 , γ=0 , δ=1 )

编译原理编译原理

24

例 : 文法 G= ( VN , VT , P , S )

VN ={ 标识符,字母,数字 }

VT ={a,b,c,…x,y,z,0,1,…,9}

P={< 标识符 >→< 字母 >

< 标识符 >→< 标识符 >< 字母 >

< 标识符 >→< 标识符 >< 数字 >

< 字母 >→a,…, < 字母 >→z

< 数字 >→0,…, < 数字 >→9 }

S=< 标识符 >指出下面直接推导所使用的规则:

< 标识符 > < 标识符 >< 字母 >

< 标识符 > < 字母 > < 数字 > < 字母 > < 字母 > < 数字 >

abc < 数字 > abc5

编译原理编译原理

25

例: G : S→0S1 , S→01

0S1 00S11 000S111 00001111 即 0S1 00001111

也记作 0S1 00001111

若存在 v =w0 w1 ... wn=w, (n>0)

则称 v 推导出(产生) w (推导长度为 n ),或称w 归约到 v. 记作 v w

若有 v w ,或 v=w ,则记为 v w

+

+

+*

+*

*和和

++

*

*

*

编译原理编译原理

26

例 G: < 标识符 >→< 字母 > < 标识符 >→< 标识符 >< 字母 >

< 标识符 >→< 标识符 >< 数字 > < 字母 >→a,…, < 字母 >→z < 数字 >→0,…, < 数字 >→9

< 标识符 > < 标识符 >< 数字 > < 字母 > < 数字 > x < 数字 > x 1

即: < 标识符 > x1 ,也可记作:< 标识符 > x1

+ *

*

+

编译原理编译原理

27

文法的句型、句子的定义文法的句型、句子的定义• 句型

设 G[S] 是一文法,如果符号串 x 是从识别符号推导出来的,即 S x ,则称 x 是文法 G[S] 的句型。

• 句子 x 仅由终结符号组成(即 S x ,且

x V∈ T* ),则称 x 是 G[S] 的句子。

例: G : S→0S1 , S→01

S 0S1 00S11 000S111 00001111

*

*

*

*

编译原理编译原理

28

语言的定义• 由文法 G 生成的语言记为 L(G), 它是文法 G 的一

切句子的集合 : L(G)={x|S x ,其中 S 为文法的开始符号,且 x V∈ T*}

例: G : S→0S1 , S→01

L(G)={0n1n|n≥1}

*

*

编译原理编译原理

29

例 3.3 文法 G[S] :( 1 ) S→aSBE( 2 ) S→aBE( 3 ) EB→BE( 4 ) aB→ab( 5 ) bB→bb( 6 ) bE→be( 7 ) eE→ee

L ( G ) ={ anbnen | n≥1 }

编译原理编译原理

30

S a S BE (S→aSBE)

a aBEBE (S→aBE)

aabEBE (aB→ab )

aabBEE ( EB→BE )

aabbEE (bB→bb)

aabbeE (bE→be)

aabbee (eE→ee)

G 生成的每个串都在 L(G) 中L(G) 中的每个串确实能被 G 生成

文法 G[S] :

( 1 ) S→aSBE

( 2 ) S→aBE

( 3 ) EB→BE

( 4 ) aB→ab

( 5 ) bB→bb

( 6 ) bE→be

( 7 ) eE→ee

S a S BE

aaSBEBE

aaaBEBEBE

编译原理编译原理

31

文法的等价

若 L ( G1 ) =L ( G2 ),则称文法 G1 和 G2 是等价的。

如文法 G1[A] : A→0R 与 G2[S] : S→0S1 等价 A→01 S→01

R→A1

编译原理编译原理

32

3.4 文法的类型 通过对产生式施加不同的限制, Chomsky 将文法分

为四种类型:– 0 型文法:对任一产生式 α→β ,都有

α (V∈ N V∪ T)+ , β (V∈ N V∪ T)*

– 1 型文法:对任一产生式 α→β ,都有 |β|≥|α| ,仅仅 S→ε 除外

– 2 型文法:对任一产生式 α→β ,都有 α V∈ N ,β (V∈ N V∪ T)*

– 3 型文法:任一产生式 α→β 的形式都为 A→aB或 A→a ,其中 A V∈ N , B V∈ N , a V∈ T

编译原理编译原理

33

• 1 型文法:对任一产生式 α→β ,都有 |β|≥|α| , 仅仅 S→ε 除外

• 上下文有关文法: α1Aα2→α1βα2(A 在 VN 中,其他在 V* 中, β≠ε)

• 2 型文法:对任一产生式 α→β ,都有 α V∈ N ,β (V∈ N V∪ T)*

• 上下文无关文法: A→β(A 在 VN 中, β 在 V*中, )

• 3 型文法也叫正规文法

编译原理编译原理

34

例: 1 型(上下文有关)文法 文法 G[S] : S→aSBE

S→aBE

EB→BE

aB→ab

bB→bb

bE→be

eE→ee

编译原理编译原理

35

例: 1 型(上下文有关)文法 文法 G[S] : S→CD Ab→bA

C→aCA Ba→aB

C→bCB Bb→bB

AD→aD C→ε

BD→bD D→ε

Aa→bD

L(G)={ww|w {a,b}*}∈

编译原理编译原理

36

例: 2 型(上下文无关)文法 文法 G[S] : S→aB|bA

A→a|aS|bAA

B→b|bS|aBB

文法 G[S] : S→0A|1B|0

A→0A|1B|0S

B→1B|1|0

编译原理编译原理

37

例:定义标识符的 3 型(正规)文法 文法 G[I] :I → lT

I → l

T → lT

T → dT

T → l

T → d

编译原理编译原理

38

文法和语言

– 0 型文法产生的语言称为 0 型语言– 1 型文法或上下文有关文法( CSG )产生的语

言称为 1 型语言或上下文有关语言( CSL )– 2 型文法或上下文无关文法( CFG )产生的语

言称为 2 型语言或上下文无关语言( CF L )– 3 型文法或正则(正规)文法( RG )产生的

语言称为 3 型语言正则(正规)语言( RL )

编译原理编译原理

39

3.5 上下文无关文法及其语法树

上下文无关文法有足够的能力描述现今程序设计语言的语法结构– 算术表达式– 语句

•赋值语句• 条件语句•读语句• ……

编译原理编译原理

40

算术表达式上下文无关文法表示 文法 G=({E}, {+,*,i,(,)}, P, E}

P: E → i

E → E+E

E → E*E

E → (E)

编译原理编译原理

41

< 条件语句 >→if< 条件 >then< 语句 > | if< 条件 >then< 语句 >else < 语句 >

条件语句上下文无关文法表示

编译原理编译原理

42

上下文无关文法的语法树上下文无关文法的语法树• 用于描述上下文无关文法的句型推导的直观方法

例 : G[S]:S→aASA→SbAA→SSS→aA→ba

S

a A S

S b A a

a b a

句型 aabbaa 的语法树(推导树)

叶子结点:树中没有子孙的结点。从左到右读出推导树的叶子标记,所得的句型为推导树的结果。也把该推导树称为该句型的语法树。

编译原理编译原理

43

推导过程中施用产生式的顺序

例 : G[S]:S→aASA→SbAA→SSS→aA→ba

S

a A S

S b A a

a b a

句型 aabbaa 的语法树(推导树)

SaASaAaaSbAaaSbbaaaabbaaSaASaSbASaabASaabbaSaabbaaSaASaSbASaSbAaaabAaaabbaa

编译原理编译原理

44

• 最左(最右)推导:在推导的任何一步 αβ ,其中 α 、 β 是句型,都是对 α 中的最左(右)非终结符进行替换

• 最右推导被称为规范推导。• 由规范推导所得的句型称为规范句型

SaASaAaaSbAaaSbbaaaabbaa

SaASaSbASaabASaabbaSaabbaa

SaASaSbASaSbAaaabAaaabbaa

例 : G[S]:S→aASA→SbAA→SSS→aA→ba

编译原理编译原理

45

问题:一个句型是否对应唯一的一棵语法树? 例: G[E]:

E → i

E → E+E

E → E*E

E → (E)

E

E + E

E * E i

i i

E

E * E

i E + E

i i

句型 i*i+i 的两个不同的最左推导:

推导 1 : E E+E E*E+E i*E+E i*i+E i*i+i

推导 2 : E E*E i*E i*E+E i*i+E i*i+i

编译原理编译原理

46

二义文法

若一个文法存在某个句子对应两棵不同的语法树,则称这个文法是二义的。或者,若一个文法存在某个句子有两个不同的最左(右)推导,则称这个文法是二义的。

产生某上下文无关语言的每一个文法都是二义的,则称此语言是先天二义的。

编译原理编译原理

47

• 判定任给的一个上下文无关文法是否二义,或它是否产生一个先天二义的上下文无关语言,这两个问题是递归不可解的。但可以为无二义性寻找一组充分条件。

• 二义文法改造为无二义文法 G[E]: E → i G[E] : E → T|E+T

E → E+E T → F|T*F E → E*E F → ( E ) |i E → (E) 规定优先顺序和结合律

编译原理编译原理

48

3.6 句型的分析 句型分析 就是识别一个符号串是否为某文法的句型,是某

个推导的构造过程。 句型分析的意义 在编译过程中句型分析可以判断一个程序是否符

合该语言的语法规则,即程序有无语法错误。 在语言的编译实现中,把完成句型分析的程序称

为分析程序或识别程序。分析算法又称识别算法。 从左到右的分析算法,即总是从左到右地识别输入符号串,首先识别符号串中的最左符号,进而依次识别右边的一个符号。

编译原理编译原理

49

对于直接推导: v w ,我们可以说: v 直接产生 w 或 w 直接归约到 v 。所以可以从两个方向来考虑推导序列的建立过程。

对于上下文无关文法,语法树是句型推导过程的几何表示,故可借助语法树进行句型分析。

句型分析方法

编译原理编译原理

50

1. 分析思想 从文法的开始符号出发,反复使用各种产生式,寻找“匹配”

于输入符号串的推导。 例:2. 语法树的构建过程 从文法开始符号出发,将它做为语法树的根,向下逐步建立

语法树,使语法树的末端结点符号串正好是输入符号串。 例:

3. 存在的相关问题 对于同一个非终结符的多个产生式,如: A→ α1|α2|…|αn ,如何确定用哪个产生式的右部去替代 A 呢 ?

有一种解决办法是从各种可能的选择中随机挑选一种,并希望它是正确的。如果以后发现它是错误的,我们必须退回去,再试另外的选择,这种方式称为回溯。显然这样做代价极高。

自上而下的分析方法

编译原理编译原理

51

例:文法 G[S] :  ① S→cAd  ② A→ab  ③ A→a 识别输入串 w=cabd 是否该文法的句子?

解:推导序列的建立过程: S cAdcabd

编译原理编译原理

52

S

例:文法 G[S] : ① S→cAd   ② A→ab  ③ A→a 识别输入串 w=cabd 是否该文法的句子?解:语法树的构建过程:

C A d

S C A d

S

a b

使用产生式:① 使用产生式: ②

编译原理编译原理

53

自下而上的分析方法1. 分析思想 从输入符号串开始,逐步进行“归约”,(用产

生式右部的符号串替换其左部的符号)直至归约到文法的开始符号。例:

2. 语法树的构建过程 从输入符号串开始,以它做为语法树的末端结

点符号串,自底向上地构造语法树。 例:3. 存在的相关问题 在分析程序工作的每一步,都是从当前串中选择一个子串,将它归约到某个非终结符号,我们暂且把这个子串称为 " 可归约串 " 。问题是,每一步如何确定这个 " 可归约串 " 。

编译原理编译原理

54

例:考虑文法 G[S] :  ① S→cAd ② A→ab ③ A→a

解:识别输入串 w=cabd 是否该文法的句子?  首先从输入符号串开始。扫描 cabd ,从中寻找一个子串,该子串与某一产生式的右端相匹配。子串 a和子串 ab 都是合格的,假若我们选用了 ab ,用产生式 (2) 的左端A 去替代它,即把 ab 归约到了A ,得到了串 cAd 。构造了一个直接推导 cAd cabd ,接下去,在得到的串cAd 中又找到了子串 cAd与产生式 (1) 的右端相匹配,则用 S 替代 cAd ,或称将 cAd 归约到 S,得到了又一直接推导 S cAd ,符号串 cabd 的推导序列为:   S cAd cabd 。

编译原理编译原理

55

例:文法 G[S] : ① S→cAd   ② A→ab   ③ A→a  识别输入串 w=cabd 是否该文法的句子?解:语法树的构建过程:

A

使用产生式② 使用产生式①

S

A

C da bc a b d c a b d

编译原理编译原理

56

短语、直接短语、句柄的定义

文法 G[S] , αβδ 是 G 的一个句型,如果:S αAδ 且 A β 。则称 β是句型 αβδ相对于非终结符 A 的短语。若有 A β则称 β是句型 αβδ相对于规则 A→β

的直接短语((或简单短语))。一个句型的最左直接短语称为该句型的句柄。

+* +

编译原理编译原理

57

由子树确定短语、直接短语、句柄

短语:一棵子树的所有叶子自左至右排列起来形成一个相对于子树根的短语。 直接短语:仅有父子两代的一棵子树,它的所有叶子自左至右排列起来所形成的符号串。即直接短语为简单子树的叶子从左到右组成的符号串 。句柄:一个句型的分析树中最左那棵只有父子两代的子树的所有叶子的自左至右的排列。即句柄为最左简单子树的叶子自左至右的排列。

编译原理编译原理

58

E

F T

T F

F

i1 * i2 + i3

短语: i1,i2,i1*i2,i3,i1*i2+i3

直接短语: i1,i2,i3

句柄: i1

例 G[E] :E→E+T|T T→T*F|F F→(E)|i句型: i*i+i

编译原理编译原理

59

有关文法的实用限制

文法中不得含有有害规则和多余规则。有害规则:形如 U→U 的产生式。会引起文法的二义性。多余规则:指文法中任何句子的推导都不会用到的规 则,有两种情况:

1 )文法中某些非终结符不在任何规则的右部出现,该非终结符称为不可到达的。2)文法中某些非终结符,由它不能推出终结符

号串来,称为不可终止的。

3.7 有关文法实用中的一些说明

编译原理编译原理

60

对于文法 G[S] ,为了保证任一非终结符 A在句

子推导中出现,必须满足如下两个条件:

1 ) A 必须在某句型中出现。2)必须能从 A 推出终结符号串 t 来。

*+

编译原理编译原理

61

化简文法例: G[S] 1) S→Be 2) B→Ce 多余规则(不可终止) 3) B→Af 4) A→Ae 5) A→e 6) C→Cf 多余规则(不可终止) 7) D→f 多余规则(不可到达)

编译原理编译原理

62

上下文无关文法中的 ε规则 具有形式 A→ε 的规则称为 ε规则,其中 A∈VN ,

某些著作和讲义中限制这种规则的出现。因为 ε规 则会使有关文法的一些讨论和证明变得复杂,两种 定义的唯一差别是 ε句子在不在语言中。

如果语言 L有一个有穷的描述,则 L∪{ε} 也同样 有一个有穷描述。并且可以证明,若 L是上下文有 关语言、上下文无关语言或正规语言,则 L∪{ε} 和 L-{ε} 分别是上下文有关语言、上下文无关语 言和正规语言。

编译原理编译原理

63

定理 3.1 文法 G , P中的每一个产生式的形式均

为 A→α ,其中 A∈VN, α∈(VN ∪VT)*(即 α

可能为 ε) ,则 L(G) 也能由这样一种文法产生:每一个产生式或者为 A→β 形式,其中 A∈VN, β ∈(VN ∪VT)+(即 β≠ε) ,或者 S→ε 且 S不出现在任何产生式右边。

编译原理编译原理

64

定理 3.2 G 是上下文有关文法,则存在另一个上下

文有关文法 G1 , L(G)=L(G1) ,且 G1的开始符号不出现在 G1 的任何产生式的右边。

若 G 为上下文无关文法或正规文法,类似结论成立。