集合的运算
设L和D都是某些字符串的集合,定义
L∪D为两个集合的并。
LD为两个集合的连接,即LD={αβ:α∈L,β∈D}。
Lk为两集合L的k次自连接。例如L3=LLL=(LL)L。特别地,记L0={ϵ},其中ϵ为我们常提到的空串。
L∗=⋃∞k=0Lk为L的所有有限次自连接的并。
正则表达式的定义
设Σ是一个非空字符集。那么在该字符集上满足下面条件的表达式,成为正则表达式。
空表达式是正则表达式,它对应的语言为{ϵ}。
任意的a∈Σ有a为正则表达式,它对应的语言为{a}。
如果r和s是正则表达式,那么(r)|(s)是正则表达式,它对应的语言为L(r)∪L(s)其中L(r)和L(s)分别为r和s对应的语言。
如果r和s是正则表达式,那么(r)(s)是正则表达式,它对应的语言为L(r)L(s)。
如果r是正则表达式,那么(r)∗是正则表达式,它对应的语言为(L(r))∗。
根据上面的定义,若r是正则表达式,我们有
r?=ϵ|r是正则表达式,它代表满足模式r的字符串出现0次或一次。
正则表达式与产生式的关系
一个正则表达式可以定义一个字符串集合,而一个字符串集合,就可以定义成一种语言。我们知道,产生式就是用来定义语言的。接下来,我们将证明,任何正则表达式,都可以通过相应的产生式来定义。
空正则表达式对应的产生式为空产生式
对于任意的a∈Σ,表达式a对应的产生式为
设r是正则表达式,则表达式r∗对应的产生式为
其中R→r表示的是与表达式r相对应的产生式组成的集合。
设r和s是正则表达式,则表达式rs对应的产生式为
设r和s是正则表达式,则表达式r|s对应的产生式为
其他词法记号的定义
有了正则表达式的定义以后,其他词法记号的定义可以很容易给出。
我们先定义一些字符集合。记<letter>为所有大小写字母组成的集合。记<digit>数字组成的集合。记<ascii>为所有ascii字符组成的集合。注意这些ascii字符都是指它的可打印形式。例如,制表符为‘\t’或者‘\009’。
变量标识符,它对应的产生式为
数值常量,它对应的产生式为
注意:在一般的正则表达式规定中,会用中括号[]来描述一个集合,用句点.表示匹配任何一个字符。在我们上面三个产生式中,用花括号{}来描述集合,而句点(.)是普通字符。
上面3个产生式中,第一个产生式生成整数(无小数点),第二个产生式生成包含整数部分的浮点数,第三个产生式生成不包含整数部分的浮点数。
字符常量和字符串常量的定义比较简单。