Meow语言开发记录-基础 (2)

昨天柠喵大概弄清楚了编译器的工作原理和结构(重复:大概),在之后给自己的Blog加上了评论功能,还加上了几个小伙伴的友链,大家可以去看看哦。今天柠喵又对比了一遍书上的目录和B站编译原理课程的目录,觉得还是视频里的更详细,所以就先看视频好了,姆,顺便把视频链接也贴出来吧:https://www.bilibili.com/video/BV1zW411t7YE?p=7 昨天看完了第一章,今天就把第二章看完吧,同时也做一下笔记。

第二章标题是语言和文法,开始吧~

字母表

字母表被定义为“有穷符号集合”,我们反过来理解这个词,“集合”表示字母表是一个集合,“符号”表示字母表是由一个个的符号来组成的,这里的符号包括英文字母、汉字、标点符号、数学运算符等等,“有穷”表示这个集合中的元素是有限的,意思就是这些元素一个个数可以数的完(但是谁会去一个个数元素的个数啊)。字母表的例子有很多,比如我们最熟悉的26个英文字母组成的英文字母表,二进制字母表(两个符号:0和1),ASCII表和Unicode表等。

字母表的乘运算

之前忘记说了,字母表也可以由Σ符号来代表。既然字母表是集合,那肯定可以进行集合运算了,一般的交集并集补集运算就不讲了,高中数学都讲过了,直接来讲字母表的乘运算。

字母表Σ1和字母表Σ2的乘积表示为:
Σ1×Σ2={ ab | a∈Σ1, b∈Σ2 }

用实际的例子来表示会更加容易懂,假设字母表Σ1={ a, b },字母表Σ2={ c, d },字母表Σ3是字母表Σ1和Σ2的乘积,那字母表Σ3= { ac, bc, ad, bd }。

字母表的幂运算

集合能进行幂运算,所以字母表也能进行幂运算,幂运算就是自己和自己相乘,这就更好理解了。
假设字母表Σ1={ a, b },那么字母表Σ1的二次幂,即Σ121×Σ1={ aa, ab, ba, bb },三次幂四次幂以此类推,一次幂就等于本身。那,零次幂呢?零次幂当然就是空集∅了,也就是啥都没有,而空集∅={ ε },ε符号表示“空”,就是啥也没有的意思,在这里把ε引入,方便待会理解。

一些补充

在离散数学里有一个叫闭包运算的东西,也是集合运算,所以课程里面提了一下字母表的正闭包和克林闭包。
字母表的正闭包Σ+1∪Σ2∪Σ3∪…
字母表的克林闭包Σ*0∪Σ+
但是闭包是啥,柠喵只知道是离散数学的内容,虽然编程语言里也有闭包概念,但是好像和数学中的不一样,就暂时不管吧,但是既然课程里提到了,还是记一下比较好。

串这个东西,用我们更熟悉的词可以代替,其实就是字符串,由字母表中的字符组成,比如这篇文章就是一串超长的字符串。

串的长度

我们用|s|表示字符串s的长度,如果s=abc,那|s|就是3,如果字符串的长度为零呢?长度为零的字符串,肯定就没有任何内容了,是空的,叫空串,依然用ε表示。

串的连接

这个非常好理解,毕竟我们在编程的时候经常拼接字符串,比如Java中String的append方法就是把另一个字符串拼接到原字符串的后面形成新的字符串,当然我们也可以把字符串拼接在前面,也有一种特殊情况,我们把空串和字符串连接了,在程序中会返回原字符串的内容,因为空串连接任意字符串都等于原字符串,也就是εa=a,εb=b。

串的幂运算

如果把字符串的连接看成是乘法运算的话,那我们就可以定义出幂运算了,也就是和自己连接,字符串a的n次幂就是n个a的连接,非常好理解,当然也有特殊情况,a的零次幂就表示零个a连接,就是,啥也没有,是空串。

结束

看一节就已经头晕脑胀了,如果不做笔记的话根本理解不了的吧,看来今天是看不完第二章了,先让柠喵去消化消化。