将以下正则表达式转换为NFA

时间:2020-01-26 15:29:32

标签: theory automata nfa

将以下正则表达式转换为NFA: ab((ba)* + a *)

1 个答案:

答案 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-\
                                  ^   |
                                  \___/
相关问题