【编译原理】第二章:语言和文法

一、词法语法分析基本概念

  • 字母表
  • 字母表的乘积
  • 字母表的正闭包()和克林闭包()
  • (String)和空串()及其运算

二、文法的定义

  • :文法,
  • :终结符集合,不可再分;(Token)
  • :非终结符集合,可再分;
  • :产生式集合,将终结符和非终结符组合成串的方法,记作 ,也就是句子构成规则;
    其中,
    例:
  • :开始符号;
    例:上例中的开始符号为<句子>

1. 示例



上述文法表示,该文法由终结符集合,非终结符集合,产生式集合,以及开始符号构成。
而产生式表示,一个表达式(Expression),可以由一个标识符(Identifier)、或者两个表达式由加号或乘号连接、或者另一个表达式用括号包裹()构成。

约定:在不引起歧义的情况下,可以只写产生式。如以上文法可以简写为:

2. 产生式的简写

产生式

可以简写为:

如上例中,

可以简写为:

三、语言的定义

1. 推导和规约

给定文法,如果有,那么可以将符号串重写为,记作,这个过程称为推导
如上例中,可以推导出或或等等。

如果,
可以记作,则称为经过n步推导出,记作。

推导的反过程称为归约

2. 句型和句子

如果,则称是的一个句型(sentential form)。

3. 语言的形式化定义

由文法的开始符号推导出的所有句子构成的集合称为文法G生成的语言,记作。
即:

文法 包含了无穷多个句子。


文法

表示什么呢?
代表小写字母;
代表数字;
表示若干个字母和数字构成的字符串;
说明是一个字母、或者是字母开头的字符串。
那么这个文法表示的即是,以字母开头的、非空的字符串,即标识符的构成方式。

4. 语言上的运算

并、连接、幂、克林闭包、正闭包。
如上例表示为:

四、文法的分类

0型文法(无限制文法,PSG)

中必须包含一个非终结符

1型文法(上下文有关文法,CSG)


产生式一般形式:
即上式中只有当上下文满足与时,才能进行从到的推导。

上下文有关文法不包含空产生式()。

2型文法(上下文无关文法,CFG)


产生式的一般形式:
即产生式左边都是非终结符。

3型文法(正则文法,RG)

右线性文法
左线性文法
以上都成为正则文法。
即产生式的右侧只能有一个终结符,且所有终结符只能在同一侧。

例:(右线性文法)

以上文法满足右线性文法。
以上文法生成一个以字母开头的字母数字串(标识符)。
以上文法等价于上下文无关文法

练习:将以上右线性文法改写为左线性文法。

正则文法能描述程序设计语言中的多数单词。

四种文法之间的关系

  • 逐级限制
    0型文法:中至少包含1个非终结符;
    1型文法:
    2型文法:
    3型文法:()

  • 逐级包含
    3型文法2型文法1型文法0型文法。

五、CFG(上下文无关文法)的分析树

正则文法能描述程序设计语言中的多数单词,但不能表示句子构造,所以用到最多的是CFG。

1. 分析树

分析树

根节点表示文法开始符号S;
内部节点表示对产生式的应用;该节点的标号是产生式左部,子节点从左到右表示了产生式的右部;
叶节点(又称边缘)既可以是非终结符也可以是终结符。

2. (句型的)短语

给定一个句型,其分析树的每一棵子树的边缘称为该句型的一个短语
如果子树高度为2,那么这棵子树的边缘称为该句型的一个直接短语

短语

直接短语一定是某产生式的右部,但反之不一定。

3. 二义性文法

如果一个文法可以为某个句子生成多棵分析树,则称这个文法是二义性的

二义性

二义性原因:多个if只有一个else;
消岐规则:每个else只与最近的if匹配。

你可能感兴趣的:(【编译原理】第二章:语言和文法)