第二章文法和形式语言
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第⼆章⽂法和形式语⾔
第⼆章⽂法和形式语⾔
《编译原理》课程组
计算机⼯程学院
第⼆章⽂法和形式语⾔
2.1 ⽂法的直观概念
2.2 符号和符号串
2.3 ⽂法和语⾔的形式定义
2.4 ⽂法的类型
2.5 上下⽂⽆关⽂法机器语法树
2.6 句型分析
2.7 ⽂法的实⽤限制
第2章⽂法和语⾔
【学习⽬标】
本章⽬的是为语⾔的语法描述寻求⼯具
◇掌握对源程序给出精确⽆⼆义(严谨、简洁、易读)的语法描述⼿段之⼀——⽂法。
◇对形式语⾔的理论有⼀个初步基础
◇根据语⾔⽂法的特点指导语法分析的过程
本章将讨论词法分析程序的设计原则,单词的描述技术,识别机制及词法分析程序的⾃动构造原理。
第2章⽂法和语⾔
【教学重点】
概念:⽂法,推导,直接推导,最左(右)推导,产⽣式,句型,短语,直接短语,句柄,语法树,规范推导,⼆义⽂法等4种⽂法的定义、⽂法的构造和⽂法的推导
语法树的构造和最左(右)推导;
⼆义⽂法、⼆义性的证明;
句型分析;
2.1 ⽂法的直观概念
⼀、语⾔概述
语⾔是由符合语法的句⼦组成的集合。
–汉语-- 所有符合汉语语法的句⼦的全体
–英语-- 所有符合英语语法的句⼦的全体
–程序设计语⾔-- 所有该语⾔的程序的全体
每个句⼦构成的规律
研究语⾔每个句⼦的含义
每个句⼦和使⽤者的关系
⼀、语⾔概述(续1)
研究程序设计语⾔
每个程序构成的规律
每个程序的含义
每个程序和使⽤者的关系
语⾔研究的三个⽅⾯
语法Syntax
语义Semantics
语⽤Pragmatics
⼀、语⾔概述(续2)
语法:指语⾔的⼀组规则,⽤它可以形成和产⽣⼀个合适的程序。
–如何由基本字符构成⼀个个单词;
–如何由⼀系列单词构成程序
语法只定义什么样的符号序列是合法的,⽽不表达这些符号及符号序列的含义语义:明确程序各部分的含义
–静态语义:由⼀系列限定规则组成,并确定哪些合乎语法的程序是合适的;
–动态语义:表明程序要做些什么,要计算什么
⼀、语⾔概述(续3)
形式语⾔:只考虑语法⽽不考虑语义的符号语⾔。
每种语⾔具有两个可识别的特性,
–语⾔的形式
–该形式相关联的意义
“形式”是指这样的事实:语⾔的所有规则只以什么符号串能出现的⽅式来陈述。
形式语⾔理论是对符号串集合的表⽰法、结构及其特性的研究,是程序设计语⾔语法分析研究的基础。
语⾔可以看成在⼀个基本符号集上定义的,按⼀定规则构成的基本符号串组成的所有集合。
⼆、⽂法的直观概念
表达语⾔时,⼀般⽆法穷尽语⾔的所有句⼦,常⽤规则加以描述
例:汉语句⼦的构成规则:
〈句⼦〉∷=〈主语〉〈谓语〉
〈主语〉∷=〈代词〉|〈名词〉
〈代词〉∷= 我| 你| 他
〈名词〉∷= 王明| ⼤学⽣| ⼯⼈| 英语
〈谓语〉∷=〈动词〉〈直接宾语〉
〈动词〉∷= 是| 学习
〈直接宾语〉∷=〈代词〉|〈名词〉
⼆、⽂法的直观概念(续2)
推导:“我是⼤学⽣”是汉语的⼀个句⼦
〈句⼦〉?〈主语〉〈谓语〉
〈代词〉〈谓语〉
我〈谓语〉
我〈动词〉〈直接宾语〉
我是〈直接宾语〉
我是〈名词〉
我是⼤学⽣
2.2 符号和符号串
程序设计语⾔中的单词是基本语法成分,单词符号的语法可以⽤有效的⼯具加以描述,并且基于这类描述⼯具,实现词法分析程序的⾃动构造.
⼀. 符号、字母表和符号串
符号:可以相互区别的基本记号(元素),如字母,数字,标点符号。
字母表:符号(元素)的⾮空有穷集合,常⽤Σ表⽰。
例:V={0,1},Σ={a, b, c, … , x,y, z}
2.2 符号和符号串
符号串:由字母表中的符号构成的有穷序列叫符号串。
例:字母表∑={a,b,c,d} 则有符号串:a,b,c,d,aa,ddd,acc…
字母表∑ ={0,1}上的符号串0,1,00,11,10
注意:ε表⽰空符号串,它表⽰不包含任何符号串,不是空格符。
符号串中的符号是有顺序的。
符号串集合:字母表上若⼲个符号串组成的集合.
例:字母表∑={a,b,c,d} 的符号串集合A={ab,acc,da,a};
约定:⼩写字母a,b,…,r表⽰符号.
⼩写字母: s,t,…,z表⽰字符串;
2.2 符号和符号串
符号串s的头(前缀)和尾(后缀):
–如果z=xy 是⼀符号串,那么x 是z 的头,y 是z 的尾。
如果x 是⾮空的,那么y 是固有尾;同样如果y ⾮空,那么x 是固有头。
–前缀:移⾛符号串s 尾部的零个或多于零个符号得到的符号串。
如:设z=abc, 那么z 的头是ε,a,ab,abc
–后缀:删去符号串s 头部的零个或多于零个符号得到的符号串。
如:z =abc 的尾是ε,c,bc,abc,z 的固有尾是ε,c,bc。
2.2 符号和符号串
符号串s的⼦串:
–从s中删去⼀个前缀和⼀个后缀得到的符号串.
–如:ana是符号串banana的⼀个⼦串.
对于每个符号串s,s和ε两者都是符号串s的前缀、后缀和⼦串。
符号串s的真前缀,真后缀,真⼦串:
–任何⾮空符号串x,相应地,是s 的前缀,后缀或⼦串,并且s ≠ x
2.2 符号和符号串
⼆. 符号串的运算
符号串相等:
符号串x,y,如果两者诸符号依次相等,则两符号相等。
符号串的长度:符号串中包含符号的个数。
|abc|=3;| ε |=0;
符号串的连结:
x,y是字母表上的两个字符串,把y的所有符号相继写在x的符号之后所得到的符号串称为x 与y的连结,⽤xy表⽰。
X=abc,y=def 则xy=abcdef;yx=defabc;xy yx,ε x=x ε =x;
符号串的逆:设x是字母表上的符号串,其逆为符号串x的倒置,记为x。
x=abcd;x=dcba;2.2 符号和符号串
符号串集合的乘积:
设A、B为两个符号串集合,其乘积为AB={xy|x ∈A,y∈B};
eg:A={aa,bb},B={cc,dd},则
AB={aacc,aadd,bbcc,bbdd}
{ε }A=A {ε }=A;
空集:
不含任何元素的集合称为空集。
记为φ;
对任何集合A:A φ= φA= φ; 注意:ε?φ
2.2 符号和符号串
符号串的幂:
x是字母表上的符号串,则x的幂运算为:
x0= ε ; x1= x; x2= xx;… x n= x n-1x=x x n-1 (n>0)
x n表⽰n个x相连结。
eg:x=ok;
则x0= ε ; x1= ok; x2= okok; … x n=okok…ok(n个ok连结)
符号串集合的幂:
A为符号串集合,则符号串集合A的幂运算为:
A0={ε}; A1=A; A2=AA;... A n= A n-1A=AA n-1;(n>0)
A={aa,bb},则A0={ε};A1={aa,bb};
A2=AA={aaaa,aabb,bbaa,bbbb};...
2.2 符号和符号串
符号串集合的闭包和正闭包
集合A的闭包表⽰为A*(亦称为⾃反闭包或星闭包)具体定义为:
A*=A0? A1? A2? A3?…=?A k,k≥0
正闭包表⽰为A+具体定义为
A+=A1? A2? A3?…=?A k,k≥1
由定义可以看到A*= A0 ?A+
例:Σ={a,b}
Σ*={ε,a,b,aa,ab,ba,bb,aaa,aab,…}
Σ+={a,b,aa,ab,ba,bb,aaa,aab,…}
2.2 符号和符号串
三. 语⾔
语⾔是由句⼦组成的集合,是由⼀组符号所构成的集合。
字母表∑上的⼀个语⾔是∑上的⼀些符号串的集合(字母表∑上的每个语⾔是∑*的⼀个⼦集)。
例如:字母表Σ={a,b},Σ*={ε,a,b,aa,ab,ba,bb,aaa,aab,…}
–集合{ab,aabb,aaabbb,…,a n b n,…} 或表⽰为{w|w∈Σ*且w=a n b n,n≥1}为
字母表∑上的⼀个语⾔。
–集合{a,aa,aaa,…} 或表⽰为{w|w∈Σ*,且w=a n,n≥1} 为字母表∑上的⼀个语⾔。
——Σ*的⼦集。
{ε}是⼀个语⾔。
Φ即{}是⼀个语⾔。
2.3 ⽂法和语⾔的形式定义
规则的定义
⽂法的定义
推导的定义
句型、句⼦、语⾔的定义
2.3 ⽂法和语⾔的形式定义(续1)
如何来描述⼀种语⾔?
如果语⾔是有穷的(只含有有穷多个句⼦),可以将句⼦逐⼀列出来表⽰
如果语⾔是⽆穷的,找出语⾔的有穷表⽰。
语⾔的有穷表⽰有两个途经:
⽣成⽅式(⽂法):语⾔中的每个句⼦可以⽤严格定义的规则来构造。
识别⽅式(⾃动机):⽤⼀个过程,当输⼊的⼀任意串属于语⾔时,该
过程经有限次计算后就会停⽌并回答“是”,若不属于,要么能停⽌并回
答“不是”,(要么永远继续下去。
)
⼀、规则(重写规则、产⽣式或⽣成式)
规则,也称重写规则、产⽣式或⽣成式,是形如α→β或α∷=β的(α,β)有序对,其中
α∈V+,β∈V*中的⼀个符号
α称为规则的左部
β称作规则的右部。
例:< 句⼦> → < 主语> < 谓语>
⽂法可利⽤规则来描述。
⼆、⽂法的定义
1、⽂法G定义为四元组(V N,V T,P,S )其中
V N :⾮终结符号集;
V T:终结符号集;
P:产⽣式( 也称规则) 的集合;
V N,V T和P是⾮空有穷集。
S:开始符号,它是⼀个⾮终结符,⾄少要在⼀条产⽣式中作为左部出现。
V N ∩V T = φ
V=V N ∪V T,V称为⽂法G 的字汇表
⼆、⽂法的定义(续1)
例2.1:⽂法G=(V N,V T,P,S),其中
V N={S},
V T={0,1},
P={S→0S1,S→01}。
例2.2:⾮负整数的⽂法G[N]= (V N,V T,P,S),其中,
V N ={N,D},
V T ={0,1,2,3,4,5,6,7,8,9},
P={N →D|ND,
D→0|1|2| (9)
S=N
⼆、⽂法的定义(续2)
例2.3:⽂法G=(Vn,V T,P,S),其中
Vn={标识符,字母,数字}
V T={a,b,c,...,x,y,z,0,1, (9)
P ={〈标识符〉→〈字母〉
〈标识符〉→〈标识符〉〈字母〉
〈标识符〉→〈标识符〉〈数字〉
〈字母〉→a
〈字母〉→b
…
〈字母〉→z
〈数字〉→0
〈数字〉→1
…
〈数字〉→9}
S =〈标识符〉
⼆、⽂法的定义(续3)
⽂法G习惯上只将产⽣式写出。
有如下约定:
–第⼀条产⽣式的左部是识别符号;
–⽤尖括号括起来的是⾮终结符号,否则为终结符,或者⽤⼤写字母表⽰⾮终结符号,⼩写字母表⽰终结符号。
–将G写成G[S],其中S是识别符号,
例2.1还可以写成:
G:S→0S1
S→01
或G[S]:S→0S1
S→01
⼆、⽂法的定义(续4)
为书写简洁,常把相同左部的产⽣式,形如
A→α1
A→α2
…
A→αn
缩写为:
A→α1|α2|…|αn
这⾥的元符号"|"读做"或"。
⼆、⽂法的定义(续5)
⼀个⽂法的⼏种写法
①G=({S,A},{a,b},P,S)
其中P:S→aAb
A→ab
A→aAb
A→ε
②G:S→aAb
A→ab
A→aAb
A→ε
③G[S]:S →aAb A→ab A→aAb A→ε
④G[S]:S→aAb A→ab |aAb |ε
三、推导的定义
⽤⽂法定义语⾔的中⼼思想是:从⽂法的开始符号出发,反复连续使⽤产⽣式,对⾮终结符施⾏替换和展开。
1、直接推导
–⽤“?”表⽰,在⼀个句型中⽤产⽣式的右部替换产⽣式的左部
–例:α→β是⽂法G的产⽣式,若有v,w满⾜:
v =γαδ,w = γβδ, 其中γ∈V*,δ∈V*。
则称v直接推导到w,记作 v?w,或w直接归约到v
例:G:S→0S1,S→01
S?0S1 ?00S11,00S11 ?000S111,
000S111 ?00001111
若v= 0S1,w=0011,则有直接推导v ? w
三、推导的定义(续1)
2、推导
如果存在直接推导的序列:
v=W0? W1? W2…? W n=w,(n>0)
则称v推导出(产⽣)w(推导长度为n),或称w归约到v。
记作v w。
若有v w,或v=w,则记作v w ,(n>=0)
三、推导的定义(续2)
0S1 ?00S11
00S11 ?000S111
000S111 ?00001111
S ?0S1 ?00S11 ?000S111 ?00001111
S ?00001111
S ?S ? 00S11 ?000S111
三、推导的定义(续3)
3、规范推导
最左(最右)推导:在推导的任何⼀步α?β,其中α、β是句型,都是对α中的最左(右)⾮终结符进⾏替换
最右推导被称为规范推导。
例:G[E]:E→E+T|T
T→T*F|F
F→(E)|a
E?E+T ?T+T ?F+T ?a+T ?a+T*F ?a+F*F ?a+a*F ?a+a*a(最左推导)E?E+T ?E+T*F ?E+T*a ?E+F*a ?E+a*a
T+a*a F+a*a a+a*a (最右推导)
四、句型、句⼦和语⾔的定义
句型
有⽂法G,若S => x,则称x是⽂法G的句型。
句⼦
有⽂法G ,若S => x ,且x∈V T*,则称x 是⽂法G 的句⼦。
(句⼦是句型的特殊,x 中只包含终结符。
)
例:G:S→0S1 ,S→01
S ?0S1 ?00S11 ?000S111 ?00001111
G 的句型S, 0S1 ,00S11 ,000S111,00001111
G 的句⼦00001111
四、句型、句⼦和语⾔的定义(续1)
语⾔的定义
由⽂法G⽣成的语⾔记为L(G),它是⽂法G的⼀切句⼦的集合: L(G)={x|S => x,其中S为⽂法的开始符号,且x ∈V T*}从定义看出两点:
–符号串x 可从识别符号推出,也即x 是句型。
–x 仅由终结符号组成,即x 是⽂法G 的句⼦。
⽂法描述的语⾔是该⽂法⼀切句⼦的集合。
例:G:S→0S1,S→01
L(G)={0n1n|n≥1}
四、句型、句⼦和语⾔的定义(续2)
T→T*F|F
F→(E)|a
E?E+T ?T+T ?F+T ?a+T ?a+T*F
a+F*F a+a*F a+a*a
句⼦:⽤符号a ,+ ,* ,( 和) 构成的算术表达式四、句型、句⼦和语⾔的定义(续3)
例⽂法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 n B n E n? a n b n e n
则L(G)={ a n b n e n | n≥1 }
五、语⾔和⽂法
给定⼀个⽂法,能从结构上唯⼀确定其语⾔
给定⼀个语⾔,不能唯⼀确定其⽂法
已知语⾔描述,写出⽂法,应满⾜:
–所描述的语⾔的任何句⼦都能由该⽂法产⽣
–该⽂法推导不出不是已知语⾔的任何句⼦
已知⽂法,写出语⾔的描述,应满⾜:
–该⽂法能推导出任何句⼦都包含在所描述的语⾔中–所描述的语⾔中不包含该⽂法推导不出的句⼦
五、语⾔和⽂法(续1)
已知语⾔描述,写出⽂法
–例:已知语⾔L(G)={ab n a|n>=1}构造其⽂法
已知⽂法,写出语⾔描述
例:G[E] :E→E+T|T
T→T*F|F
F→(E)|a
六、⽂法的等价
若L(G1)=L(G2),则称⽂法G1和G2是等价的。
如⽂法G1[A]:A→0R 与G2[S]:S→0S1 等价
A→01 S→01
R→A1
七、递归规则和递归⽂法
1、递归与递归定义
–递归是指同⼀个操作或⼀组操作的连续重复
–递归定义是指在定义某种事物时⼜⽤到其本⾝
2、递归规则
–左部和右部具有相同的⾮终结符号的规则
例:⽂法中的规则U?xUy
x=ε时,则有U?Uy,为左递归规则
y=ε时,则有U?xU,为右递归规则
3、递归⽂法
–直接递归⽂法
–间接递归⽂法
4、递归⽂法的作⽤
–⽤有限的规则定义⽆限的语⾔
2.4 ⽂法的类型
⼀、⽂法分类
通过对产⽣式施加不同的限制,Chomsky将⽂法分为四种类型:设有⽂法G=(V N,V T,P,S); 0型⽂法:(短语结构⽂法)
对任⼀产⽣式α→β,都有α∈(V N∪V T)+,且α⾄少包含⼀个⾮终结符,β∈(V N∪V T)*
1型⽂法:(上下⽂有关⽂法)
对任⼀产⽣式α→β,都有|β|≥|α|,仅仅 S→ε除外,并且S不出现在其他产⽣式的右部。
即α1Aα2→α1βα2, ,α 1 、α2和β∈(V N∪V T)*
⼀、⽂法分类(续1)
⽂法G[S]是1型⽂法
S→aSBC| aBC
CB →DB
DB →DC
DC→BC
aB→ab
bB→bb
bC→bc
cC→cc
S?aSBC ?aaBCBC ?aabCBC ?aabbcc
⼀、⽂法分类(续2)
2型⽂法:(上下⽂⽆关⽂法)
对任⼀产⽣式α→β,都有α∈V
N ,β∈(V
N
∪V
T
)*
3型⽂法:(正规⽂法)–右线性⽂法
所有产⽣式的形式都为A→aB或A→a,其中A∈V
N ,B∈V
N
,a∈V
T
(a可为ε)
–左线性⽂法
所有产⽣式的形式都为A→Ba或A→a,其中A∈V
N ,B∈V
N
,a∈V
T
(a可为ε)
⼀、⽂法分类(续3)
例:G[E]:E→E+T|T
T→T*F|F
F→(E)|a
例⽂法G=({S,A,B},{0,1},P,S),其中P由下列产⽣式组成:S→0A A→1B S→1B B→1B
S→0 B→1
A→0A B→0
A→0S
显然G是正规⽂法。
⼀、⽂法分类(续4)
例:定义标识符的3型(正规)⽂法
⽂法G[I]:I →lT
I →l
T →lT
T →dT
T →l
T → d
其中l表⽰a~z中的任何⼀英⽂字母,d表⽰0~9中的任⼀数字。
⼀、⽂法分类(续5)
例:定义标识符的3型(正规)⽂法
–⽂法G[I]:I →Tl| I d| l 为左线性⽂法
3型(正规)⽂法变换
若A→αB 或 A→α,其中A∈V N,B∈V N,α∈V T
如当α=ab时,
则A→αB 即 A→abB 可写为: A→aD D→bB
A→α即 A→ab 可写为: A→aD D→b
⼀、⽂法分类(续6)
0型⽂法(短语结构⽂法)
0型⽂法的能⼒相当于图灵机(Turing)。
或者说,任何0型语⾔都是递归可枚举的;
反之,递归可枚举集必定是⼀个0型语⾔。
1型⽂法(上下⽂有关⽂法)
上下⽂有关⽂法的产⽣式的形式描述为α1Aα2→α1βα2,只有A出现在α1和α2的上下⽂中,才允许⽤β取代A。
其识别系统是线性界限⾃动机
⼀、⽂法分类(续7)
2型⽂法(上下⽂⽆关⽂法)
2型⽂法的产⽣式表⽰为形如:A→β,β取代⾮终结符A时,与A所在的上下⽂⽆关。
其识别系统是不确定的下推⾃动机。
3型⽂法(正规⽂法)右/左线性⽂法
识别系统是有穷⾃动机,即所产⽣的语⾔由有穷⾃动机接受。
⼆、四类⽂法之间的关系
四种⽂法之间的逐级“包含”关系
⼆、四类⽂法之间的关系
四种⽂法之间的关系是将产⽣式做进⼀步限制⽽定义的。
语⾔之间的关系依次:有不是上下⽂有关语⾔的0型语⾔,有不是上下⽂⽆关语⾔的1型语⾔,有不是正则语⾔的上下⽂⽆关语⾔。
2.5 上下⽂⽆关⽂法及其语法树
上下⽂⽆关⽂法有⾜够的能⼒描述程序设计语⾔的语法结构例:⽂法G[E]:E→i|E+E|E*E|(E)
E表⽰算术表达式,
i表⽰程序的“变量”,
该⽂法定义了由变量,+,*,(和)组成的算术表达式的语法结构
⼀、语法树
G[E]:E→E+T|T
T→T*F|F
F→(E)|a
E?E+T ?T+T ?F+T ?a+T ?a+T*F
a+F*F a+a*F a+a*a
E?E+T ?E+T*F ?E+T*a ?E+F*a ?E+a*a
T+a*a F+a*a a+a*a
⼀、语法树
设G=( V
,V T,P,S)为⼀上下⽂⽆关⽂法,若⼀棵树满⾜下列4个条件,则此树称作G的语N 法树(推导树,派⽣树):
1. 每个结点都有⼀个标记,此标记是V的⼀个符号
2. 根的标记是S
3. 若⼀结点n⾄少有⼀个它⾃⼰除外的⼦孙,并且有标记A,则肯定A∈V N
4. 如果结点n有标记A,其直接⼦孙结点从左到右的次序是n1,n2,…,n k,其标记分别为A1,A2,…,A k,那么A→A1A2,…,A k⼀定是P中的⼀个产⽣式
语法树的结果:
从左到右读出叶⼦的标记⽽构成的⾏谓之
语法树---句型推导的直观表⽰
给定⽂法G=(V N,V T,P,S),对于G的任何句型都能构造与之关联的语法树
(推导树)
定理:
G为上下⽂⽆关⽂法,
对于α≠ε,有S =>α,当且仅当
⽂法G有以α为结果的⼀棵语法树(推导树)
⼀、语法树
G[E]:E→E+T|T
T→T*F|F
F→(E)|a
E?E+T ?T+T ?F+T ?a+T ?a+T*F
a+F*F a+a*F a+a*a
⼀、语法树
⽤于描述上下⽂⽆关⽂法句型推导的直观⽅法
⼀、语法树
推导过程中施⽤产⽣式的顺序
⼀、语法树(续5)
例:G[E]:E→E+T|T
T→T*F|F
F→(E)|a
试给出表达式a+a*a的推导,并画出语法树。
E?E+T ?T+T ?F+T ?a+T ?a+T*F
a+F*F a+a*F a+a*a
E?E+T ?E+T*F ?E+T*a ?E+F*a ?E+a*a
T+a*a F+a*a a+a*a
E?E+T ?T+T ?T+T*F ?F+T*F ?F+F*F
a+F*F a+F*a a+a*a
⼀棵语法树表⽰了⼀个句型的种种可能的(但未必是所有的)不同推导过程,包括最左(最右)推导。
但是,⼀个句型是否只对应唯⼀的⼀棵语法树呢?⼀个句型是否只有唯⼀的⼀个最左(最右)推导呢?
⼆、⽂法的⼆义性
例:G[E]:
E → i
E → E+E
E → E*E
E → (E)
⼆、⽂法的⼆义性
若⼀个⽂法存在某个句⼦对应两棵不同的语法树,则称这个⽂法是⼆义的。
或者,若⼀个⽂法存在某个句⼦有两个不同的最左(右)推导,则称这个⽂法是⼆义的
⽂法的⼆义性和语⾔的⼆义性是两个不同的概念。
因为可能有两个不同的⽂法G
和G′,其中G是⼆义的,但是却有L(G)=L(G′),也就是说,这两个⽂法所产⽣的语⾔是相同的。
判定任给的⼀个上下⽂⽆关⽂法是否⼆义,或它是否产⽣⼀个先天⼆义的上下⽂⽆关语⾔,这两个问题是递归不可解的,但可以为⽆⼆义性寻找⼀组充分条件
⼆义⽂法改造为⽆⼆义⽂法
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) 规定优先顺序和结合律
如果产⽣上下⽂⽆关语⾔的每⼀个⽂法都是⼆义的,则说此语⾔是先天⼆义的。
对于⼀个程序设计语⾔来说,常常希望它的⽂法是⽆⼆义的,因为希望对它的每个语句的分析是唯⼀的。
2.6 句型的分析
句型分析就是识别⼀个符号串是否为某⽂法的句型,是某个推导的构造过程。
在语⾔的编译实现中,完成句型分析的程序称为分析程序或识别程序。
分析算法⼜称识别算法。
从左到右的分析算法,即总是从左到右地识别输⼊符号串,⾸先识别符号串中的最左符号,进⽽依次识别右边的⼀个符号,直到分析结束。
句型的分析算法分类
分析算法可分为:
⾃上⽽下分析法:
从⽂法的开始符号出发,反复使⽤⽂法的产⽣式,寻找与输⼊符号串匹配的推导。
⾃下⽽上分析法:
从输⼊符号串开始,逐步进⾏归约,直⾄归约到⽂法的开始符号。
两种⽅法反映了两种不同的语法树的构造过程。
句型的分析算法分类
两种⽅法反映了两种语法树的构造过程。
⾃上⽽下⽅法是从⽂法符号开始,将它做为语法树的根,向下逐步建⽴语法树,使语法树的结果正好是输⼊符号串
⾃下⽽上⽅法则是从输⼊符号串开始,以它做为语法树的结果,⾃底向上地构造语法树
⾃上⽽下的语法分析
例:⽂法G:S →cAd
A →ab
A →a
识别输⼊串w=cabd是否为该⽂法的句⼦
⾃下⽽上的语法分析
例:⽂法G:S →cAd
A →ab
A →a
识别输⼊串w=cabd是否该⽂法的句⼦
句型分析的有关问题
1)在⾃上⽽下的分析⽅法中如何选择使⽤哪个产⽣式进⾏推导?
假定要被代换的最左⾮终结符号是B,且有n条规则:B→A1|A2|…|An,那么如何确定⽤哪个右部去替代B?
2)在⾃下⽽上的分析⽅法中如何识别可归约的串?
在⾃下⽽上的分析⽅法中,在分析程序⼯作的每⼀步,都是从当前串中选择⼀个⼦串,将它归约到某个⾮终结符号,该⼦串称为“可归约串”
3)存在确定和不确定分析,本课只讨论确定的分析法。
短语、直接短语、句柄的定义
⽂法G[S]
句型的短语
S => αAδ且 A =>β,则称β是句型αβδ相对于⾮终结符A的短语
句型的直接短语
若有A β,则称β是句型αβδ相对于⾮终结符A 的直接短语
句型的句柄
⼀个句型的最左直接短语称为该句型的句柄
短语、直接短语、句柄的定义
例1:考虑⽂法G[E]: E→T|E+T
T→F|T*F
F→(E)|i
分析i+i*i中的短语、直接短语和句柄
例2:给定⽂法G[E]: E→ET+|T
T→TF*|F
F→FP^|P
P→(E)|i
试根据语法树求句型TF*PP^+短语、直接短语和句柄
2.7 ⽂法的实⽤限制
⽂法中不含有有害规则和多余规则
有害规则:形如U→U 的产⽣式。
会引起⽂法的⼆义性
多余规则:指⽂法中任何句⼦的推导都不会⽤到的规则
⽂法中不含有不可到达和不可终⽌的⾮终结符
1 )⽂法中某些⾮终结符不在任何规则的右部出现,该⾮终结符称为不可
到达。
2 )⽂法中某些⾮终结符,由它不能推出终结符号串,该⾮终结符称为不
可终⽌。
2.7 ⽂法的实⽤限制
对于⽂法G[S],为了保证任⼀⾮终结符A在句⼦推导中出现,必须满⾜如下两个条件:1. A必须在某句型中出现
即有S => αAβ,其中α,β属于V*
2. 必须能够从A 推出终结符号串t 来
即A => t ,其中t∈V T*
化简⽂法
例:G[S] :1) S→Be
2) B→Ce
3) B→Af
4) A→Ae
5) A→e
6) C→Cf C为不可终⽌
7) D→f D为不可到达
产⽣式2),6),7)为多余规则应去掉。
上下⽂⽆关⽂法中的ε规则
具有形式A→ε,的规则称为ε规则
因为ε规则会使得有关⽂法的⼀些讨论和证明变得复杂,有时会限制这种规则的出现两种定义的唯⼀差别是ε句⼦在不在语⾔中。