返回顶部

第二章 文法和语言

作者:@cherish.
课程学习内容为作者从学校的PPT处摘抄,仅供自己学习参考,若需转载请注明出处:https://www.cnblogs.com/cherish-/p/16370380.html


文法和语言

符号和符号串

  • 字母表:字母表是非空有穷集合,其元素称为符号。

  • 符号串:由字母表中的符号组成的有穷序列称为(字母表上的)符号串。不含任何符号的有穷序列称为空串,记为ε

  • 规则:以某种形式表达的在一定范围内共同遵守的章程和制度;这里指符号串的组成规则。

    例如:设字母表={0,1},则101上的符号串,201不是上的符号串。

  • 符号串长度:符号串α的长度是指符号串α中含有符号的个数,记为|α|。特别约定空串ε为零,即|ε|=0

  • 符号串集合:如果集合A的元素都是字母表上的符号串,则称集合A上的符号串集合,简称串集。

    例如:设字母表={a,b,c},A={ε,a,ba,cab},B=a1,ba,cab,则A上的符号串集合,B不是上的符号串集合。

运算

  • 符号串的运算

    α,β为两个符号串,则:

    • 连接:αβ=αβ,如ab=ab

    • α|β=αβ

    • 方幂αn=αα...α=ααn1=αn1α注意α0=ε

    • 闭包α1=α,α2=αα,...

      α的正闭包:α+=α1|α2|...|αn|...

      α的星闭包:α=α0|α1|α2...|αn|...

  • 符号串集合的运算

    A,B为两个符号串集合,则:

    • 乘积AB={xy|xAandyB}

    • AB=A+B={x|xAorxB}

    • 方幂An=AA...A=AAn1=An1A注意A0={ε}

    • 闭包

      A的正闭包:A+=A1A2...An...

      A的星闭包:A=A0A1A2...An...

    • 推论:若A为任一字母表,则A就是该字母表上的所有符号串(包括空串)的集合。

文法和语言的形式化定义

什么是“形式化定义”?

  • 对文法的一种精确的数学定义
  • 定义的“文法”,“句子”等概念,虽然可以和自然语言的对应概念类比,但它们有严格的数学基础,可以被计算机处理。

文法的形式化定义包含哪些内容?

  • 文法的生成规则(<主语> := <名词>|<代词>)
  • 文法使用的非终结符(代词)
  • 文法使用的终结符
  • 文法的开始符号

定义:文法G定义为一个四元组(VN,VT,P,S),记为G=(VN,VT,P,S)。其中:

  • VN是非空有穷集合,称为非终结符集,其元素称为非终结符;
  • VT是有穷集合,称为终结符集,其元素称为终结符;
  • P是非空有穷集合,称为规则集,其元素是字母表VNVT上的规则,VNVT称为文法的字母表V,且VNVT=
  • SVN,称为开始符。

字母表V上的规则:(重写规则、产生式、生成式)

α::=β简记为αβαV+规则的左部,βV称为规则的右部。

αε是空规则

左部相同的多个规则,可以使用符号|简写。如:

  • αβ
  • αδ 可简写为αβ|δ

【例】定义文法G如下:G=(VN,VT,P,S),其中:VN={S},VT={a,b},P={SaSb,Sab}

上式亦可写成如下形式:

  • G=({S},{a,b},P,S),P={SaSb,Sab}
  • G=({S},{a,b},{SaSb,Sab},S)
  • G[S]:SaSb,Sab

【例】:文法G定义如下:G=(VN,VT,P,S),VN={S},VT={0,1},P={S0S1,S01}

这个文法表达的语言是什么?L={0n1n|n1}

直接推导

设文法G=(VN,VT,P,S),如果P中包含αβ,那么任意的串γαδ可以推导出γβδ,我们把这种推导称为直接推导或一步推导,记为γαδγβδNote:γ,δV

直接规约

如果γαδγβδ,我们也可以说γβδ规约 到γαδ,这种规约称为直接归约或一步归约。

多步推导

设文法G=(VN,VT,P,S),对于α,βV=(VNVT),如果α,β之间存在一个推导序列:α=ω0ω1...ωn=β(n1),则称α经过n步推导出β,记作α+β,这种推导称为多步推导或n步推导。Note:ωiV1in

多步规约

如果α+β,也称β规约到α,也称为n步归约或多步归约。

0步及0步以上推导与规约:若有α+β,或αβ,则记作αβ

句型与句子

  • G[S]Sβ,则称β是文法G[S]的句型。
  • βVT,则称β是文法G的句子。

语言

文法G=(VN,VT,P,S)的产生语言定义为文法G的句子集合,记为L(G)。即:L(G)={β|Sβ,βVT}

【例】G[S]:SaSb,Sab,则L(G)={anbn|n1}

文法的等价

文法G1,G2,如果L(G1)=L(G2),则称文法G1G2是等价的。

【例】:

G1=({S,C},{a,d},P,S),P={SaC,CaC,CdC,Cε}

G2=({S},{a,d},P,S),P={SSa,SSd,Sa}

显然有L(G1)=L(G2)={a(a|d)}

文法的类型

0型文法

  • 如果一个文法的所有规则左侧至少含有一个非终结符,则称此文法为0型文法,也称为短语文法
  • 产生式形如:αβ,其中α(VTVN)+且至少含有一个非终结符;β(VTVN)

1型文法

  • 如果一个文法的所有规则左侧符号串的长度不大于右侧符号串的长度(空规则除外),且左侧至少含有一个非终结符,则称此文法为1型文法,也称为上下文相关文法
  • 产生式形如:αβ,其中|α||β|,仅Sε例外。
  • 考虑γAδγβθδA被替换成βθ,跟A的上下文相关。

2型文法

  • αβP,αVN,则文法是2型文法,也称为上下文无关文法β(VTVN)。(即任一产生式左部均为一非终结符。)

3型文法

文法(N,,P,S)的产生式只能是以下两者之一:

  • Aε|a|aBA,BVN,aVT——右线性文法
  • Aε|a|BaA,BVN,aVT——左线性文法

统称3型文法,又叫正则文法

【例】:文法G=(VN,VT,P,S)是正则文法,VN={S,A,B},VT={0,1},P={SA0|B1,A0|1,B0|1}

L(G)={00,01,10,11}

文法的类型于表达能力

  • 0型文法到3型文法,限制逐渐增多,表达能力也逐渐减弱
  • 如果L0,L1,L2L3分别是0型文法、1型文法、2型文法和3型文法能产生的语言之集,则有如下关系:L0L1L2L3

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

  • 上下文无关文法—描述程序语言的语法结构

    【例】G[E]:Ei|E+E|EE|(E)

  • 从一个句型到另一个句型的推导往往不唯一

    如:E+Ei+Ei+i,E+EE+ii+i

  • 最左推导:任何一步αβ都是对α中的最左非终结符进行替换

  • 最右推导:任何一步αβ都是对α中的最右非终结符进行替换

  • 最右推导,也叫做规范推导。由规范推导所得到的句型,叫做规范句型(右句型)。规范推导的逆过程,叫做规范归约

【例】 最左/最右推导过程示例

已知文法如下,试给出句子aabbaa的推导过程。

G[S]:SaAS|a,ASbA|SS|ba

  • 最左推导:SaASaSbASaabASaabbaSaabbaa
  • 最右推导:SaASaAaaSbAaaSbbaaaabbaa

语法树

文法G的任何一个句型,根据其推导都能构造一个语法树,也称为推导树。它是一个满足下列条件的多叉树:

  • 文法的开始符S为树的根节点
  • 对任一产生式Aα,α(VNVT)α的各符号严格依生产式的次序依次为A的子节点;文法符号为其节点标记(节点名)。

【例】 语法树示例

已知文法如下,试给出句子aabbaa的推导过程。

G[S]:SaAS|a,ASbA|SS|ba

  • 最左推导:SaASaSbASaabASaabbaSaabbaa
  • 最右推导:SaASaAaaSbAaaSbbaaaabbaa

结论:

  • 非叶子结点一定是非终结符
  • 全部叶子结点组成的符号串是文法的句子

语法树的二义性

  • 如果文法G的某个句子存在至少两棵不同的语法树,则称该文法G是二义的。
  • 如果文法是无二义性的,一个句子的语法树反映了该句子的全部推导过程。
  • 如果文法是无二义性的,一个句子的最左(最右)推导是唯一的。

【例】语法二义性示例

已知文法G[E]:EE+E|EE|(E)|i,证明G是二义的。

证明:因为句子i+ii存在下列两棵不同的语法树

故文法G[E]是二义性的文法。

语言的二义性

  • 文法的二义性并不等同于语言的二义性。
  • 因为二义性文法G,可能存在与之等价的无二性的文法G,即L(G)=L(G)
  • 如果一个语言不存在无二义性的文法,则称该语言是先天二义性的。
  • 二义性问题是不可判定问题,即不存在一个算法,它能在有限步骤内,确切地判定一个文法是否是二义的。

句型的分析

  • 假设文法G[S]是语言L之文法,即L(G)=L,则“符号串α 是否符合语言L的语法问题”被等价地转化成“推导或归约问题”,即:

    SααVT

  • 推导法 VS 归约法

  • 自顶向下 VS 自底向上

  • Antlr VS Bison

    自顶向下分析

  • 从文法开始符号出发,反复使用规则,寻找匹配符号串(推导)的句型,直到推导出句子或穷尽规则也不能推导出。进行每一步推导时,存在两个选择问题:

    • 选择句型中那一个非终结符进行推导
    • 选择非终结符的那一个规则进行推导
  • 最左推导,穷举规则:

    • 推导过程中一旦出现符号串αα是合法的句子。
    • 穷尽规则,不存在α的推导过程:α不是合法的句子。

【例】w=cabd的推导过程

设文法G[S]:ScAdAa|ab

序号 推导过程 说明
1 S cabd
2 ScAd caba r1匹配c
3 Scad cabd r2,失败,回溯
4 ScAd cabd r3
5 Scabd cabd 成功

Note:ri表示第i个规则。

回溯的效率很低,改进办法——提取公因子,原文法转化为:

G[S]:ScAdAaAAbAε

分析目标:w=cabd

ScAdcaAdcabd

自下而上的分析法

  • 从输入符号串α开始,逐步进行归约,直至归约出文法的开始符号S,则输入串α是文法G定义的句子,否则不是。
    • 归约是推导的逆过程
    • 每步归约时,存在如何选择句型α的子串β进行归约的问题(α=βδ)
  • 方案:按句柄归约—规范归约(移进—归约)
    • 简单优先分析法
    • LR分析法

【例】G[S]:ScAd,Aa,Aab,分析目标:w=cabd

短语、直接短语、句柄

设文法G[S]有:SαAδαβδ,且Aβ

  • β是句型αβδ相对于非终结符A的短语。任一子树的树叶全体(具有共同祖先的叶结点符号串)皆为短语;
  • 特别地,SαAδαβδ,即Aβ,则β是句型αβδ相对于规则Aβ的直接短语(简单短语)。任一简单子树的树叶全体(具有共同父亲的叶节点符号串)皆为简单短语;
  • 右句型的最左直接短语称为该句型的句柄。

【例】:文法G[E]:EE+T|T,TTF|F,F(E)|i,分析句型i1+i2i3的短语、直接短语或句柄。

EE+TE+TFE+Ti3E+Fi3E+i2i3T+i2i3F+i2i3i1+i2i3

  • i3是句型E+Ti3的、相对于非终结符F的直接短语
  • i2是句型E+i2i3的、相对于非终结符T的短语,F的直接短语
  • i1是句型i1+i2i3的、相对于非终结符F的短语、直接短语和句柄

对于上述文法,分析句型i1+i2i3的语法树如下:

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

直接短语:i1,i2,i3

句柄:i1

补充说明

  • 文法不得含有有害规则,多余规则
    • 有害规则:AA
    • 不可达(用)规则:不在任何产生式右部出现的非终结符及其规则
    • 不可终止规则:从某非终结符开始,不可能推导出任意终结符串来。
  • 对文法G中的符号X是有用的,是指X至少出现在一个句子的推导过程中,即X必须同时满足以下两个条件:
    • X必须在某个句型中出现,即存在α,βVSαXβ(可达)
    • 必须能够从X推导出终结符号串,即存在wVT,使αXβw(可终结)
  • 含有无用符号的产生式称为无用产生式

文法化简

对于文法G=(VN,VT,P,S)

  • 删除不终结产生式算法:(满足条件2-可终结)

    • 构造能推导出终结符号串的非终结符集VN1,置VN1=

      1. P中每一个产生式Aα,若αVT;则VN1=A

      2. P中的每一个产生式Bβ,若β(VTVN1),则VN1=B

      3. 重复步骤2直到VN1不再扩大为止。

    • 删除不在VN1中的所有非终结符的相关产生式。

    • G=(VN1,VT,P1,S)

  • 删除不可用产生式算法:(满足条件1-可达)

    • 初始化:VN2=S,VT2=,P2=
      1. 对每一个产生式Aα,若AVN2,则将α中的非终结符并入VN2,终结符并入VT2
      2. 重复步骤1,直到VN2VT2都不再扩大为止;
      3. P中左右部仅含VN2VT2中的符号的所有产生式并入P2中。
    • G=(VN2,VT2,P2,S)

epsilon(ε)规则

  • 在文法设计中,ε规则带来方便,也导致文法讨论和证明的复杂性
  • 一个上下文无关文法G是否必须使用ε规则,完全取决于文法G产生的语言L(G[S])中是否含有ε语句。
  • 可以证明,如果εL(G[S]),则存在一个等价的文法G[S],且G不含ε规则。
  • 如果εL(G[S]),则存在一个等价的文法G[S],且G仅含Sε的一个空规则。
  • 设文法G[S]εL(G),消除ε规则:
    • 首先构造出可以推出空串的非终结符集:Vε
      1. 若有Aε;则令Vε=A
      2. 若有BA1...An且全部AiVε,则令Vε=B
      3. 重复步骤1,2直到Vε不再扩大为止。
    • 删除G[S]中的Aε形式的产生式;
    • 依次改写G[S]中的产生式BX1...Xn;若有XiVε,则用{Xi|ε}替换之(一个分裂成两个);
    • 若有jXiVε,则一个产生式将分裂成2j个。

【例题】

posted @   cherish-lgb  阅读(122)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示