一、字母表(有穷符号集合)
1.1 字母表定义
字母表也即符号集,用∑
表示,它是一个包含各种符号的有穷非空集合。
以汉语为例,汉语字母表就是各种汉字、数字、标点符号的集合;以英语为例,英语字母表就是各种字母、数字、标点符号的集合…那么到了编程,字母表就可能是字母、数字、各种专用符号和保留字了。
1.2 字母表上的运算:
- 乘积
- n次幂
- 正闭包
- 克林闭包
二、符号串/串
2.1 符号串相关定义:
符号串是对于字母表来说的一个概念,字母表的符号串指的就是由字母表中各个字符组成的一个有穷序列。
注意这里的“有穷”,指的是符号串本身是由有穷个符号组成,但是符号串的个数是无穷多的(组合方式不同)。
以字母表 ∑={0,1} 为例,它的符号串就有:0,1,00,01,10,11,000 等等。
符号串的长度指的是符号串符号的个数,以 m = 000 为例,|m|= 3。
空符号串 ε 长度为 0,表示不包含任何符号,类似于编程中的空字符串 “”。所以有 εm = mε= m。
以 m = abc 为例,它的头是 ε,a,ab,abc;它的尾是 ε,c,bc,abc。而它的固有头不考虑末尾符号 c,固有尾不考虑首部符号 a。
2.2 符号串的运算:连接、方幂
- 符号串的连接:连接就是两个字符串顺序拼接,比如 x = abc,y = def,那么 xy = abcdef。
- 符号串的方幂:如果一个符号串由多个重复符号构成,如何方便地表示它呢?
比如 y = xxxx…xxxx(n 个 x),那么就可以写成 y = x^n,此时 y 就是 x 的方幂。这点和数学是一样的。不过要注意,x^0 ≠ 1 = ε。
串s的n次幂:将n个s连接起来
三、闭包
以字母表 ∑ = {a,b} 为例,任何由它的符号串作为构成元素的集合,都可以称作字母表的符号串集合。比如说 {ab},{abab,ababab} 等。
两个符号串集合的乘积定义为 AB = {xy| x∈A且y∈b},其实就是笛卡尔积。
一般的字符串集合可能并不能囊括一个字母表的所有符号串,但是有一种集合却能包含所有的符号串,这种特殊的集合称为闭包,记作 ∑*。
*其实就是全选的意思(联想 CSS 中的通配选择符就好理解了)。
∑* = {ε,a,b,ab,ab,ba,aba,aab......} = ∑^0 ∪ ∑^1 ∪ ∑^2 ∪......∪ ∑^n
要注意的是,闭包也包含了空符号串。
将闭包中的空符号串去掉,就成为了正闭包,也即 ∑+。
显然:∑*= ∑^0 ∪ ∑+,∑+ = ∑∑* = ∑*∑。
四、文法
4.1 文法在语言体系中的位置
语言包括语法和语义两个方面,但是语法和语义都是比较抽象的东西,所以我们需要借助一些工具来阐述它们。