编译原理:正规式与有限自动机
正规式与正规集
正规式的作用:表示语言
正规集的作用:表示语言的集合
正规表达式是一种表示法,可以详细描述高级程序语言单词符号或者说每一个正规表达式r 表示一个语言 L(r).例如可以用正规表达式表示C++语言的标识符,而 C++语言的标识符(集合)可以看作一个语言,因此正规表达式 r 实质是用来表示一个语言 L(r).
具体来看什么是正规式和正规集呢?看个例子:
设字母表为 {0,1} ,则0,1, ε,Ø 都是该字母表上的正规式
0|1 ,0*,1*等也是字母表上的正规式
相应的正规集为:{0,1} {ε,0,00,000,0000,...} {ε,1,11,111,1111,...}
规定“*”, “连接” ,“|”运算左结合,
优先级由高到低
正规式 (a)|((b) *(c)) 等价于a|b *c
例:å={A,B,…,Z,a,b,…,z,0,1,…,9}
正规式1:A |B... |Z|a |b...|z
语言1:L( A) ∪ L( B)… ∪ L( Z) ∪ L( a) ∪ L( b)... ∪ L(z)
= {A,B,…,Z,a,b,…,z}
正规式2: 0 |1|.. . |9
语言2:L(0) ∪ L(1) ∪... ∪ L(9)= { 0,1,…,9}
正则式与有限自动机
有限自动机接收的语言等价于正规文法产生的正则语言。而正规式或正则集定义的语言也为正则语言。所以,正规式与有限自动机在描述上等价。对于å上任一正规表达式r ,一定能构造一个NFA m ,使得L( r )=L(m)。
从正规式到有限自动机
举个转化的例子,如下图所示:
从有限自动机到正规式
对于å上任一NFA m,能构造å上一个正规表达式r,使得L( r )=L(m)。
首先,在m的转换图上加进S,Z两个结点。从S用e弧连接到m的所有初态结点,从m的所有终结(接受)结点用e弧连接到Z,从而构成一个新的NFA m’,L(m)=L(m’)。
反复使用下面的替换规则逐步消去NFA m’中的状态结点和弧, 直至剩下 S,Z 为止。在消去结点的过程中,逐步用正规式标记弧。
举个转化的例子,如下图所示: