从有限自动机构造正则表达式

时间:2010-12-20 15:49:23

标签: regex finite-automata automata

我正在尝试从有限自动机构造一个正则表达式,但发现我的自己完全陷入了这个问题。要使用的正则表达式是这样的:

? = 0或1
* = 0或更多
+ = 1或更多
| =或
_ =空字符串
@ =空集
()=括号

据我所知,字符串必须是“b *”以“a *”结尾或以“a + bb +”结尾 我现在拥有的是((b*(a+(bb))*)*) 但这并没有考虑以'a'结尾的字符串。

如上所述,我100%坚持这一点,只是无法理解我应该如何使用它。

图片:http://img593.imageshack.us/img593/2563/28438387.jpg

CODE:
自动机的类型
FA


Q1
Q2
Q3
q4

字母
一个
b

初始状态
Q3

最终状态
Q3
q4

过渡
q1 a q2
q1 b q3
q2 a q2
q2 b q2
q3 a q4
q3 b q3
q4 a q4
q4 b q1

任何解决方案或提示都很受欢迎!

2 个答案:

答案 0 :(得分:2)

如果您将其提供给自动机的工具(例如,Vcsn),您就会得到:

In [1]: import vcsn

In [2]: %%automaton a
   ...: $  -> q3
   ...: q1 -> q2 a
   ...: q1 -> q3 b
   ...: q2 -> q2 a
   ...: q2 -> q2 b
   ...: q3 -> q4 a
   ...: q3 -> q3 b
   ...: q4 -> q4 a
   ...: q4 -> q1 b
   ...: q3 -> $
   ...: q4 -> $
   ...: 
mutable_automaton<letterset<char_letters(ab)>, b>

In [3]: a.expression()
Out[3]: (b+aa*bb)*(\e+aa*)

其中\e表示空字符串。那么它只是语法转换的问题。

图形:

Vcsn graphical rendering

请参阅this example live,然后随身携带。

答案 1 :(得分:0)

无法从q2进入最终状态。删除它,生成的DFA应该更容易转换。

  

据我所知,字符串必须是“b *”以“a *”结尾或以“a + bb +”结尾   我现在拥有的是((b *(a +(bb)))但是没有考虑以'a'结尾的字符串。

想象一下q3不是最终状态,而q4是初始状态。那么正则表达式会是什么样子?把它改成你想要的东西不应该太难,只要不要害怕有正则表达式的多个部分所描述的相同状态和/或转换。

还有一个提示:我非常确定您至少需要使用?|一次。