【发布时间】:2014-06-01 02:37:19
【问题描述】:
我尝试使用 Java 实现 Brzozowski 代数方法,以生成给定 DFA 接受的语言的正则表达式,生成的表达式正确但未简化。
例如:
E|(E)e(e)|(A|(E)e(A))(A|e|(B)e(A))*(B|(B)e(e))|(B|(E)e(B)|(A|(E)e(A))(A|e|(B)e(A))*(E|(B)e(B)))(B|e|(E)e(B)|(A|(E)e(A))(A|e|(B)e(A))*(E|(B)e(B)))*(E|(E)e(e)|(A|(E)e(A))(A|e|(B)e(A))*(B|(B)e(e)))
(e = epsilon, E = 空集)
而不是:(A|B)*AB
“传递闭包方法”返回几乎相同的结果。
其中一个解决方案包括最小化自动机,但我认为生成简化的正则表达式太重了。
另外,使用 Java 正则表达式方法来简化正则表达式一点也不漂亮:)。
所以,尝试帮助我找到解决方案会很好。
【问题讨论】:
-
我不知道你的问题的答案。不过,Stack Overflow Regular Expressions FAQ 中的这个答案可能很有趣:DFA versus NFA,如“常规”部分中所列。
-
dk.brics.automaton 库包含一些您可以研究的不同的最小化算法。我不认为该库可以将自动机转换回正则表达式,但您似乎已经知道如何做到这一点。
-
这看起来像是一道自动机作业题。我强烈建议您更深入地了解您要完成的工作以及您尝试过的任何尝试。表明你已经解决了这个问题,这将为你提供帮助提供动力。
标签: java regex finite-automata