将以下正则表达式转换为NFA: ab((ba)* + a *)
答案 0 :(得分:1)
有一个很漂亮的算法可以根据正则表达式的操作一次构建NFA。这里最外面的运算符是串联:您的正则表达式是三个术语的串联:
(a)(b)((ba)* + a*)
这意味着存在一个NFA,它是三个NFA的串联,它接受此表达式生成的语言。语言(a)和(b)的NFA很简单:
L = {a}
q0--a-->q1
L = {b}
q2--b-->q3
假设我们稍后获得了语言(ba)* + a *的NFA,并且其起始符号为q4。然后我们的NFA将如下所示(未标记的过渡是epsilon / lambda / empty):
q0--a-->q1----->q2--b-->q3----->q4
我们可以为子表达式(ba)* + a *重复该算法。这里最外面的操作是+;这意味着存在一个类似于NFA的NFA,其中q5和q6是+运算符左右两侧的子表达式的起始状态:
q4----->q5
|
|
V
q6
a *的NFA很简单:
q6-a-\
^ |
\___/
我将跳过几个步骤,仅写下(ba)*的NFA,但是该算法(用于证明NFA和RE的等效性)也有一个简单的规则:
q5--b-->q7
^ |
| a
\______/
将所有内容放在一起可得出以下结果:
q0--a-->q1----->q2--b-->q3----->q4----->q5--b-->q7
| ^ |
| | a
V \______/
q6-a-\
^ |
\___/