文法和语言
- 语言是一个记号系统,完整的定义包括语法和语义两方面。
- 语法是一组说明语言的规则,文法是用来阐明这些语法规则的一个重要形式工具。
- 语义包括静态语义和动态语义,阐明语义要比语法困难的多。
符号和符号串
字母表: 字母表是符号的非空有穷集合。
任何程序语言都有自己的字母表,例如:
- 计算机语言:由符号“0”和“1”组成的字母表,即∑={0,1}
- Pascal字母表为: ∑={AZ, az, 09, +, -, *, /, <, =, >,:,‘,’, ;,., , (, ), {, }, [, ]}
符号串:由字母表中的符号组成的任何有穷序列称之为该字母表上的符号串,也称作”字”。
符号串的几个常用术语 : 设s是符号串
- 前缀 : 移走s的尾部的零个或多于零个符号
- 后缀 : 删去s的头部的零个或多于零个符号
- 子串 : 从s中删去一个前缀和一个后缀
- 子序列 : 从s中删去零个或多于零个符号(不要求是连续的)
- 逆转 : 将s中的符号按相反次序写出而得到的符号串。
- 长度 : 是该符号串中的符号的数目。例 :|aab|=3,|ε|=0。
例 :符号串s=banana
- 前缀:ε,b,ba,ban,bana,banan,banana
- 后缀:banana,anana,nana,ana,na,a,ε
- 子串:banana,anana,banan,anan,…,ε
- 真前缀,真后缀,真子串:x≠s & x ≠ ε
- 子序列:baa (这些符号不要求是连续的)
- 逆转:ananab
- 长度:| banana | = 6
符号串的运算 :
- 连接:设x和y是符号串,它们的连接xy是把y的符号写在x的符号之后得到的符号串。
例如:x=ba,y=nana,xy=banana. - 方幂:x0=ε; x1=x; x2=xx; …;xn=xn-1x;
例: x=ba, 则: x1= ba; x2=baba; x3=bababa;…
符号串集合(语言)的运算 :
设L和M是两个符号串集合,则 :
- 合并:L∪M={s|s∈L or s∈M}
- 连接:LM={ st|s∈L and t∈M}
- 方幂: L0={ε}, L1=L,L2=LL, …, Ln=Ln-1L
- 语言L的闭包,记作L* ,L* =∪Li(i>=0) =L0∪L1∪L2∪L3 ∪…
- 语言L的正闭包,记作L+(L+=L L* ), L+=∪Li(i>=1)=L1∪L2∪L3∪L4∪…
例如:L={A~Z,a~z} D={0~9}
- L∪D={A~Z,a~z ,0~9}
- LD是由所有用一个字母后跟一个数字组成的符号串所构成的集合。
- L4是由所有的四个字母的符号串构的集合。
- L(L∪D)* 是由所有的字母打头的字母和数字组成的符号串所构成的集合.
- D+是由所有的长度大于等于1的数字串所构成的集合.
文法和语言的形式定义
文法G定义为四元组 (VN,VT,P,S),
其中, VN :非终结符号集; VT :终结符号集; P:规则的集合; S:开始符(识别符)。
注: VN, VT和 P 是非空有穷集。S是一个非终结符,它至少要在一条产生式中作为左部出现。VN和VT不含公共的元素,即VN∩VT=φ,用V表示VN∪VT ,称为文法G的字母表。
文法G(VN,VT,P,S)中规则集合P的说明 :
规则(产生式或生成式)是形如α→β的(α,β)有序对,其中α∈(VN∪VT)+,且至少含有一个非终结符,β∈(VN∪VT)* ,α 称为规则的左部,β 称作规则的右部。
例: 文法G=(VN,VT,P,S)
- VN = { S }
- VT ={ 0, 1 }
- P={ S→0S1, S→01 }
- S为开始符号
文法的写法 :
一般不用将文法G的四元组显式的写出来,只写出产生式即可,并约定第一条产生式的左部为识别符。习惯上大写字母表示非终结符,小写字母表示终结符,有时也将G写为G[S]
例 :
G: | G[S] | G[S] |
---|---|---|
S→aSb | A→ab | A→ab|aAb|ε |
A→ab | A→aAb | S→aSb |
A→aAb | A→ε | |
A→ε | S→aSb |
推导的定义 :
- 直接推导“⇒”:
- α→β是文法G的产生式, 若有v, w满足v=γαδ, w=γβδ,其中γ∈V* ,δ∈V* ,则称v直接推导出w (记作 v ⇒ w), 也称w直接归约到v。
- 间接推导:
- 若存在v=w0⇒w1⇒…⇒wn=w (n>0)则记为 v⇒+ w,称作 v推导出 w (或w归约到v)
- 若有 v ⇒+ w 或 v=w, 则记为v ⇒* w
例:
G:S→0S1, S→01
- 0S1 ⇒ 00S11
- 00S11 ⇒ 000S111
- 000S111 ⇒ 00001111
- S ⇒ 0S1 ⇒ 00S11 ⇒ 000S111 ⇒ 00001111
- S ⇒+ 00001111
- S ⇒* S
- 00S11 ⇒* 00S11
句型、句子的定义
- 句型:有文法G,若S ⇒* x,则称x是文法G的句型。
- 句子:有文法G,若S ⇒* x,且x∈VT* ,则称x是文法G的句子。
例:G:S→0S1, S→01
S⇒0S1⇒00S11⇒000S111⇒00001111
G的句型S,0S1 ,00S11 ,000S111,00001111
G的句子00001111
(文法生成的)语言的定义
由文法G生成的语言记为L(G),它是文法G的一切句子 的集合: L(G)={x|S ⇒* x,其中S为文法的开始符号,x ∈VT* }
例:G: S→0S1, S→01
L(G)={ 0n1n | n≥1 }
文法的等价 :
若L(G1)=L(G2),则称文法G1和G2是等价的。
例:文法G1[A]: A→0R, A→01, R→A1与G2[S]: S→0S1, S→01 等价。
文法的类型
通过对产生式施加不同的限制,文法可分为以下四类:
- 0型文法:对任一产生式α→β,都有α∈(VN∪VT)+,且至少含有一个非终结符,β∈(VN∪VT)* 。
- 0型文法的能力相当于图灵机,可以表征任何递归可枚举集。
- 0型文法描述的语言为0型语言,用L0表示。
- 例如 : aSb→cAd
- 1型文法:对任一产生式α→β,都有|β|≥|α|, 仅仅 S→ε除外。
- 1型文法又称作上下文有关文法(context-sensitive):其产生式的形式为α1Aα2→α1βα2,即只有A出现在α1和α2的上下文中时,才允许β取代A。
- 该文法描述的语言为1型语言或上下文有关语言,用L1表示。
- 例如:aUb→aABBaab
- 2型文法:对任一产生式α→β,都有α是一个非终结符,β∈(VN∪VT)*
- 2型文法又称作上下文无关文法(context-free):该文法相当于对1型文法中的规则形式加以限制而得到的。
- 2型文法描述的语言为2型语言或上下文无关语言,用L2表示。
- G[S]: S→AB, A→BS|0, B→SA|1
- 3型文法:任一产生式的形式都为A→aB或A→a,其中A∈VN ,B∈VN ,a∈VT*
- 3型文法又叫正规文法,产生的语言为3型语言(正规语言),是有穷自动机所接受的集合。
- 高级程序设计语言的单词符号,如标识符、无符号整数等都是采用3型文法来描述的。
- G[S]: S→0A|1B|0, A→0A|1B|0S, B→1B|1|0
四类文法之间的逐级“包含”关系 :
上下文无关文法及其语法树
上下文无关文法有足够的能力描述程序设计语言的语法结构。
语法树:是描述上下文无关文法句型推导的直观工具。
语法树的定义:
设G=(VN,VT,P,S)为一上下文无关文法,若一棵树满足下列4个条件,则此树为G的语法树(推导树) :
- 每个结点都有一个标记,此标记是V的一个符号
- 根的标记是S
- 若一结点n至少有一个它自己除外的子孙,并且有标记A,则肯定A∈VN
- 如果结点n的直接子孙从左到右依次为n1,n2,…,nk,并且标记分别为A1,A2,…,Ak,那么A→A1A2…Ak 一定是P中的一个产生式
语法树的结果:
从左到右读出叶子的标记而构成的符号串即为语法树的结果
例: G[S]:
S→aAS
A→SbA
A→SS
S→a
A→ba
构造句型aabbaa的语法树 :
语法树表示的推导过程不唯一
句型aabbaa的可能推导序列 :
- S⇒aAS⇒aAa⇒aSbAa⇒aSbbaa⇒aabbaa
- S⇒aAS⇒aSbAS⇒aabAS⇒aabbaS⇒aabbaa
- S⇒aAS⇒aSbAS⇒aSbAa⇒aabAa⇒aabbaa
规范推导、规范句型:
最左(最右)推导: 在推导的任何一步α⇒β,其中α,β是句型,都是对α中的最左(右)非终结符进行替换。
最右推导又称为规范推导,由规范推导所得的句型称为规范句型。
例:构造句子 i*i+i 的语法树
G‘[E]:
E → i
E → E+E
E → E*E
E → (E)
两种不同的最左推导:
推导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
文法的二义性和语言的二义性:
- 若一个文法存在某个句子对应两棵不同的语法树,则称这个文法是二义的
- 或者,若一个文法存在某个句子有两个不同的最左(右)推导,则称这个文法是二义的
- 判定任给的一个上下文无关文法是否二义,或它是否产生一个先天二义的上下文无关语言,这两个问题是递归不可解的,但可以为无二义性寻找一组充分条件
- 文法的二义性和语言的二义性是不同的概念。因为可能有两个不同的文法G和G’满足L(G)=L(G’),其中G是二义的,G’是无二义的。
- 如果产生上下文无关语言的每一个文法都是二义的,则说此语言是先天二义的。
二义文法改造为无二义文法 :
例 :
G’[E]:
E → i
E → E+E
E → E*E
E → (E)
规定算符优先性和结合性 :
G[E]:
E → T|E+T
T → F|T*F
F →(E)|i
消除二义性后句子 i*i+i 对应的语法树 :
句型的分析
句型分析就是识别一个符号串是否为某文法的句型,是某个推导的构造过程。在语言的编译实现中,把完成句型分析的程序称为分析程序(识别程序)。从左到右的分析算法,即总是从左到右地识别输入符号串,首先识别符号串中的最左符号,进而依次识别右边的一个符号,直到分析结束。(以后介绍的算法均属此类)
从左到右的句型分析算法分类:
- 自上而下分析法:从文法的开始符号出发,反复使用文法的产生式,寻找与输入符号串匹配的推导。
- 自下而上分析法:从输入符号串开始,逐步进行归约,直至归约到文法的开始符号。
从语法树的构造过程来理解两种句型分析方法
- 自上而下方法:从文法符号开始,将它做为语法树的根,向下逐步建立语法树,使语法树的结果正好是输入符号串。
- 自下而上方法:从输入符号串开始,以它做为语法树的结果,自底向上的构造语法树。
句型分析的有关问题 :
- 在自上而下的分析方法中如何选择使用哪个产生式进行推导?
- 假定要被代换的最左非终结符号是B,且有n条规则:B→A1|A2|…|An,那么如何确定用哪个右部去替代B?(回溯)
- 在自下而上的分析方法中如何识别可归约的串?
- 在分析程序工作的每一步,都是从当前串中选择一个子串,将它归约到某个非终结符号,该子串称为“可归约串”。在规范归约中该可归约串称为句柄。
例:文法G: S → cAd, A → ab,A → a
识别输入串w=cabd是否为该文法的句子
- 自上而下的语法分析:
- 推导过程:S ⇒ cAd ⇒ cabd
- 自下而上的语法分析
- 归约过程构造的推导: cAd ⇒ cabd ; S ⇒ cAd
句柄及其相关概念 :
- 短语:xuy是文法G[S]的一句型,如果有 S⇒*xUy 且U⇒+u , 其中U∈VN , u∈V+,则称u是句型xuy相对于非终结符号U的短语。
短语是在句型的推导过程中能由某个非终结符号推导出的子串。 - 直接短语(简单短语):若有 S⇒*xUy 且U⇒u,则称u是句型xuy相对于规则U→u的直接短语。直接短语则是能由某个非终结符号直接推导出的子串。
- 句柄:任一句型的最左直接短语称为该句型句柄。
例 :写出G[E]中句型 i*i+i的所有短语、简单短语和句柄。
G[E]:
E → T|E+T
T → F|T*F
F →(E)|i
首先构造出句型 i1* i2 + i3对应的语法树;
因为F⇒i,所以i1,i2,i3分别是句型i1* i2 + i3相对于规则F→i的直接短语,而句柄是最左侧的直接短语即i1。
因为T⇒+i1,所以i1是句型i1* i2 + i3相对于T的短语,i3也是同样情况。
因为T⇒+i1* i2,所以i1* i2是句型 i1* i2 + i3相对于T的短语。
因为E⇒+i1* i2,所以i1* i2是句型 i1* i2 + i3相对于E的短语。
因为E⇒+ i1* i2 + i3 ,所以i1* i2 + i3是句型i1* i2 + i3相对于E的短语。
综上:i1,i2,i3, i1* i2, i1* i2 + i3均是句型i1* i2 + i3的短语,其中i1,i2,i3为直接短语, i1为句柄。
并不是句型中的任意子序列都可构成短语。如上例中的i2 + i3
有关文法实用中的一些说明
- 对文法进行限制(目的是化简文法)文法中不含有有害规则和多余规则 :
- 有害规则:形如U→U的产生式。会引起文法的二义性
- 多余规则:指文法中任何句子的推导都不会用到的规则,它们以不可到达和不可终止两种情况出现
- 文法中某些非终结符不在任何规则的右部出现,该非终结符称为不可到达。
- 文法中某些非终结符,由它不能推出终结符号串,该非终结符称为不可终止。
- 上下文无关文法中的ε规则 :
- 本书所给上下文无关文法的定义中,某些规则可以具有形式A→ε,称这种规则为ε规则。有些教材对此进行了限制,但这不牵扯到本质的问题。
- 两种定义的唯一差别是ε句子在不在语言中。
对于文法G[S],为了保证任一非终结符A在句子推导中出现,必须满足如下两个条件:
- A必须在某句型中出现即有S ⇒* αAβ,其中α,β属于V*
- 必须能够从A推出终结符号串t来即A ⇒* t,其中t∈VT*
例:化简文法
G[S] :
1) S→Be
2) B→Ce
3) B→Af
4) A→Ae
5) A→e
6) C→Cf
7) D→f
D为不可到达,C为不可终止,即产生式 2)6)7)为多余规则应去掉。
例:给出下述语言的上下文无关文法
L1={anb2ncm|n,m≥0}
L2={anbmc2m|n,m≥0}
解:要产生形如anb2ncm的符号串,可分别产生形如 anb2n和cm的串,所以L1对应的文法为:
S → AB
A → ε|aAbb
B → ε|cB
同理可得L2对应的文法为:
S → AB
A → ε|aA
B → ε|bBcc