目录
-
字母表∑ 是一个有穷符号的集合(符号包括字母、数字、标点符号等等) 字母表的运算 串就是字母表的真子集构成的有序的符号 串的运算
词法分析的基本概念
-
字母表
- 概念
字母表是一个有穷符号集合。用 ∑ 表示
字母,数字,标点符号… 都属于符号
- 字母表的运算
- 字母表∑的乘积
- 字母表的n次幂
那么这里的字母表的 0 次幂就是长度为 0 的字符串构成的集合叫空串。
- 字母表的正闭包
- 字母表的克林闭包
可以看到字母表的克林闭包 和 字母表的正闭包 只是多了一个0 次幂。
- 概念
-
串
- 概念
就是说串是由字母表的子集构成的。
-
串的长度
串的长度就是串中含有的字符的个数
- 串上的运算–连接
- 串上的运算–幂运算
串的 N 次幂就是将 N 个 S连接起来
- 概念
文法定义
-
自然语言的例子:
我们来分析一般的句子的构成规则。一般的句子由名词短语和动词短语构成。然后再细分下去。我们可以看到的是用 尖括号括起来的 叫做 语法成分。就是我们说的名词动词等等。没有用尖括号括起来的 是语言的基本符号。就是语言的基本组成
-
文法的形式化定义
G=(Vt,Vn,P,S)
这里面的各个符号的意思
-
Vt : 终结符集合 (相当于前面没有用括号括起来的句子的组成的部分 )
终结符是文法所定义语言的基本符号,有时也称为了token.
例如:Vt = {apple,boy,eat,little}
-
Vn:非终结符集合 (相当于前面用括号括起来的句子的语法成分)
非终结符是用来表示语法成分的符号。有时也称作语法变量。
例如:Vn = {<句子>,<名词短语>,<动词短语>,<谓语动词>…}
值得注意的是:
-
P产生式的集合
产生式 描述了将终结符和非终结符组合成为串的方式。
产生式的一般形式:
α→β 读作: α定义为β
例子:
-
S开始符号
开始符号 表示的是该文法中 最大的语法成分
例子: 上面的开始符号就是句子。因为句子就是该文法中最大的语法符号
实例分析:
约定:
我们约定再不产生歧义的情况下,可以不用这么麻烦,直接写文法的产生式就行。不用全部都写。 -
- 产生式的简写
-
符号的约定
为了避免总是进行表达式的简写。我们对符号进行约定,就可以直接使用符号进行表达就行了。
-
终结符的约定
-
非终结符的约定
-
文法符号的约定
我们通常用 字母表中排在后面的 大写字母(如,X,Y,Z)。 表示文法符号(既可以表示终结符也可以表示非终结符) 排在字母表中 后面的小写字母表示 终结符串 (包括空串) 小写的希腊字母(如α,β,γ,等)表示文法字符串(包括空串)
-
开始符号的约定
如果没有特别说明一般都认为 第一个产生式的左部就是开始符号
总结一下就是:
字母表前面的 **小写字母** 表示终结符 字母表前面的 **大写字母** 表示非终结符 字母表后面的 大写字母 表示文法字符串(既可以表示终结符也可以表示非终结符) 字母表后面的 小写字母 表示终结字符串 (包含空串) 字母表后面的 希腊字母 表示文法字符串 (包含空串)
-
语言的定义
-
自然语言的例子
在上面一节我们学习了文法(语言规则),那么如何判定一个词串是否是满足文法的句子呢
下面我们就来回答这个问题 -
推导
这是推导的定义。 说白了就是如果 α→β,就可以讲符号串中的 γαc 替换为γβc 有点等效替换的意思
经过几步的推导能够写出这样式子就记为几 如经过3步推导出的就可记为 a>> 3a
了解了这些以后我们就可以来看看 litter boy eats apple是不是句子?
重点是看这些能不能够推导出。
通过这种自顶向下的方式我们看到,我们是可以根据文法规则来推导出 litter boy eat apple 是一个句子。句子→ little boy eat apple.
那么什么是归约呢?
-
归约
我们可以看到自顶向下我们可以叫做为推导 那么自下向顶我们可以叫做为归约。 也就是推导的逆过程我们叫做归约 通过一步一步的归约,替换,将一个字符串变为我们所熟知的文法
-
句子和句型
这里我们可以看到句型和句子的定义 句型中既可以包含 终结符 也可以包含 非终结符 也可能是 空串 而句子只是句型中的一种。 句子是不包含 非终结符的 句型
我们下面来看上面的例子
之前的分析中 只有最后一个是句子,其余的都是句型。以为只有最后一个不包含非终结符。其余的都是包含终结符的。
-
语言的形式化定义
简单的说就是 由文法G的开始符号S推导出的所有的句子构成的集合成为文法G的生成的语言。记为L(G)
上面提出的问题,语言中可以包含的句子有无限个。
-
例子
这个题我们可以看到,T经过最后的迭代,不停的变换,最后是由L 和 D 组成的。而在放到开始字符串S中去,就也是D和L组成的,而D和L一个是数字,一个是字母,两个在一起组成的是标识符。
所以文法G表示的是标识符就是这样进行推导来的
-
语言上的运算