编译原理笔记(二)文法和语言

1.文法的直观概念

文法概述:文法是对一种语言的句子的结构描述,是以有穷的集合刻画无穷的集合的一个工具。

2.符号和符号串

字母表的概念:字母表是元素的非空有穷集合,字母表中的元素称为符号,因此字母表也被称为符号集。

符号串的概念

  • 符号串的定义:由字母表中的符号组成的任何有穷序列被称为符号串。
  • 符号串的长度:符号串中包含的符号的个数称为符号串的长度。不包含任何符号的符号串被称为空串,用ε表示,其长度为0。
  • 符号串的头尾、固有头和固有尾
    • 头和尾:如果z=xy是一个符号串,那么x是z的头,y是z的尾;
    • 固有头和固有尾:如何x是非空的,那么y是固有尾;如果y是非空的,那么x是固有头。
  • 符号串的连接:设x和y是符号串,它们的连接xy是把y的符号写在x的符号之后得到的符号串。
  • 符号串的方幂:设x是符号串,把x自身连接n次得到的符号串称为符号串x的方幂。
  • 符号串集合:若集合A中的一切元素都是某个字母表上的符号串,则称A是该字母表上的符号串集合。
    • 符号串集合的乘积:两个符号串集合A和B的乘积为:AB={xy | x∈A且y∈B},也就是AB是满足x属于A,y属于B的所有符号串所组成的集合。
  • 字母表的闭包: 字母表Σ的闭包用Σ*表示,是该字母表上所有有穷长的串的集合。
    • 字母表的正闭包:将字母表Σ的闭包中删除空串ε,则得到的集合被称为字母表的正闭包,记作Σ+

3.文法和语言的形式定义

产生式(规则)的概念

  • 产生式的表示:形如α→β或α::=β的有序对。这里使用的符号读作“定义为”。
  • 左部和右部:α称为产生式的左部,β称为产生式的右部。

文法的概念:文法G定义为一个四元组(Vn,Vt,P,S)

  • 元组内容解释:Vn是非终结符集合,Vt是终结符集合,P是产生式的集合(Vn、Vt和P都要求非空)。S是识别符或开始符,是一个表示推导开始的非终结符,至少需要在一条产生式中作为产生式的左部出现。
  • 对产生式的要求:产生式的左部和右部都是非终结符集合和终结符集合的并集的闭包中的元素,并且要求左部至少包含一个非终结符。
  • 文法的简略表示:很多时候不用将一个文法用四元组的形式表示出来,而是只写出产生式,并约定用大写字母表示非终结符,用小写字母表示终结符。

推导的概念

  • 直接推导和直接归约:设α→β是文法G=(Vn,Vt,P,S)的一条产生式,x和y是V*中的任意符号,如果有符号串v和w满足:v=xαy,w=xβy,则说v直接产生w。称w是v的直接推导,或者说w直接归约到v。
  • 推导和规约:如果v可以通过一系列的直接推导获得w,则称v推导出w,或称w推导出v。连续使用的直接推导次数被称为推导长度。
  • 推导和规约的表示:直接推导使用一个粗箭头表示;推导在直接推导的箭头上增加了一个“+”号;也可以统一在直接推导的粗箭头上方加一个“*”号统一表示直接推导和推导。

句型、句子、语言、文法等价的概念

  • 句型的概念:设G[S]是一个文法,如果符号串x是从识别符号推导出来的,则称x是文法G[S]的句型。
  • 句子的概念:如果一个句型中只由终结符构成,那么这个句型被称为句子。
  • 语言的定义:一个文法G产生的语言是该文法产生的所有句子的集合,记作L(G)
  • 文法的等价:如果两个文法产生的语言完全相同,那么称这两个文法等价。

4.文法的类型

乔姆斯基文法分类:1956年乔姆斯基建立形式语言的描述,将文法分为0型、1型、2型和3型文法。这四类文法的区别在于对产生式施加的限制不同。

四种不同的文法

  • 0型文法

    • 文法别称:0型文法也被称为短语文法。
    • 产生式限制:产生式的左部至少含有一个非终结符。
  • 1型文法

    • 文法别称:1型文法也被称为上下文有关文法。
    • 产生式限制:产生式均满足左部的长度小于等于右部的长度(除了S→ε之外)。
  • 2型文法

    • 文法别称:2型文法也被称为上下文无关文法。
    • 产生式限制:产生式的左部都是一个非终结符。
  • 3型文法

    • 文法别称:3型文法也被称为正规文法。
    • 产生式限制:每一个产生式都是A→aB或A→a的形式。

四种文法之间的关系:四种文法类型的定义是逐渐增加限制的。所有的3型文法都是2型文法,所有的2型文法都是1型文法,所有的1型文法都是0型文法。

四种文法生成的语言:0型、1型、2型和3型文法生成的语言分别被称为0型语言、上下文有关语言、上下文无关语言和正规语言。

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

上下文无关文法和程序设计语言的关系:上下文无关文法有足够的能力描述现今程序设计语言的语法结构。

语法树(推导树)的概念

  • 语法树的作用:语法树是用于描述上下文无关文法的句型推导的直观工具。
  • 语法树满足的条件
    • 每个结点都有一个标记,此标记是V的一个符号;根的标记为S。
    • 如果一个标记为A的结点有一个除了自己之外的子孙,那么A一定是非终结符。
    • 如果结点n的直接子孙从左到右的顺序为n1 n2 n3…,其标记分别为A1 A2 A3…,那么一定存在一个产生式:A→A1 A2 A3 … AK。
  • 语法树的限制:语法树只表示了在某个推导过程中使用了哪个产生式和施用在哪个非终结符上,并没有明确施用产生式的顺序。

最左推导和最右推导

  • 最左推导:如果在推导过程中的任何一步a直接推导出b,都是对a的最左非终结符进行替换,则称这种推导方式为最左推导。
  • 最右推导:类似于最左推导,如果推导过程中都是对a的最右非终结符进行替换,则称这种推导方式为最右推导。在形式语言中,最右推导也被称为规范推导,所推导得到的句型称为规范句型(右句型)。

注意事项:一个句型对应不止一棵语法树;一个句型也不一定只有一种最左推导或最右推导。

文法和语言的二义性

  • 文法的二义性:如果一个文法中存在某个句子,它有两个不同的最左(最右)推导,则说这个文法是二义的。
  • 语言的先天二义性:如果产生上下文无关语言的每一个文法都是二义的,则说此语言是先天二义的。对于程序设计语言来说,常常希望它的文法是无二义的,因为希望对它的每个语句分析都是唯一的。

6.句型的分析

句型分析概述

  • 句型的分析就是识别一个符号串是否为某个文法的句型,是某个推导的构造过程。
  • 进一步说,当给定一个符号串时,试图按照某个文法的规则为该符号串构造推导或语法树,以此来识别它是否是该文法的一个句型。

编译中的句型分析:编译中的句型分析是指识别一个输入符号串是否为语法上正确的程序的过程。在语言的编译实现中,把完成句型分析的程序称为分析程序或识别程序,分析算法又被称为识别算法。可以分为自顶向下分析和自底向上分析两种方法:

  • 自顶向下的分析方法:从文法的开始符号出发,反复使用各个产生式,寻找匹配于输入符号串的推导。
  • 自底向上的分析方法:从输入符号串开始,逐步进行归约,直到归约到文法的开始符号。

短语的概念

  • 短语的定义:设G是一个文法,S是文法的开始符号。如果对于文法中的一个句型,且该句型中包含有一个非终结符A,而该非终结符A可以推导出一个句型B,那么就称B是该句型相对于非终结符A的短语。
  • 直接短语(简单短语)的定义:对于短语而言,如果非终结符A是直接推导出一个句型B,那么就称B是该句型相对于非终结符A的直接短语。
  • 句柄的定义:一个右句型的直接短语称为该句型的句柄。句柄的概念只适用于右句型。

7.有关文法实际应用的一些说明

有害规则和多余规则:在实际应用中,应该限制文法中不应该含有有害规则和多余规则。

  • 有害规则:左部和右部相同的产生式。之所以说这样的产生式有害,是因为它只会引起文法的二义性。
  • 多余规则:文法中所有句子的推导都用不到的产生式。分为两种形式进行出现。
    • 文法中有些非终结符不在任何规则的右部出现,这种非终结符被称为不可到达的。
    • 文法中存在不能推导出任何终结符的非终结符,这种非终结符被称为不可终止的。

猜你喜欢

转载自blog.csdn.net/hanmo22357/article/details/130500256