文法和语言

  • 语言是一个记号系统,完整的定义包括语法和语义两方面。
  • 语法是一组说明语言的规则,文法是用来阐明这些语法规则的一个重要形式工具。
  • 语义包括静态语义和动态语义,阐明语义要比语法困难的多。

符号和符号串

字母表: 字母表是符号的非空有穷集合。

任何程序语言都有自己的字母表,例如:

  • 计算机语言:由符号“0”和“1”组成的字母表,即∑={0,1}
  • Pascal字母表为: ∑={AZ, az, 09, +, -, *, /, <, =, >,:,‘,’, ;,., , (, ), {, }, [, ]}

符号串:由字母表中的符号组成的任何有穷序列称之为该字母表上的符号串,也称作”字”。

符号串的几个常用术语 : 设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→aSbA→abA→ab|aAb|ε
A→abA→aAbS→aSb
A→aAbA→ε
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):其产生式的形式为α12→α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在句子推导中出现,必须满足如下两个条件:

  1. A必须在某句型中出现即有S ⇒* αAβ,其中α,β属于V*
  2. 必须能够从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 
posted @ 2017-12-26 21:33  qianbuhan  阅读(538)  评论(0编辑  收藏  举报