我正在尝试从有限自动机构造一个正则表达式,但发现我的自己完全陷入了这个问题。要使用的正则表达式是这样的:
? = 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
任何解决方案或提示都很受欢迎!
答案 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
表示空字符串。那么它只是语法转换的问题。
图形:
请参阅this example live,然后随身携带。
答案 1 :(得分:0)
无法从q2进入最终状态。删除它,生成的DFA应该更容易转换。
据我所知,字符串必须是“b *”以“a *”结尾或以“a + bb +”结尾 我现在拥有的是((b *(a +(bb))))但是没有考虑以'a'结尾的字符串。
想象一下q3不是最终状态,而q4是初始状态。那么正则表达式会是什么样子?把它改成你想要的东西不应该太难,只要不要害怕有正则表达式的多个部分所描述的相同状态和/或转换。
还有一个提示:我非常确定您至少需要使用?
或|
一次。