正则表达式范围和组以DFA形式实现为表

时间:2015-07-04 18:53:55

标签: regex dfa fsm nfa

我目前正在寻找从正则表达式(没有捕获组没有回溯)到表驱动DFA的转换。我通过从Regex创建NFA然后将NFA转换为DFA来实现此目的。我目前通过用“(a | b | ... | y | z)”替换组来处理诸如“[a-z]”之类的组,只需用“(a | b | ... | y | z)”替换它,并且生成的DFA表仍然合理。与“[^ abc]”这样的否定组相同,它将被替换为“(\ u0000 | \ u0001 | ...)”,不包括abc的转义版本,但这会产生巨大的表格。

如何通过将所有字符放在表格中来实现组和范围,以便表格处理它们“优雅”而不是暴力?

1 个答案:

答案 0 :(得分:0)

您正在构建的表具有尽可能多的列,因为有不同的选择可以到达另一个状态。一旦某个字符产生一个唯一的结果,它就必须在表中拥有它自己的条目,因此该表是不可简化的。因此,您必须构建整个表并通过对它们进行分组来删除重复的列。比方说ab总是产生相同的转换,然后您可以将它们分组到[ab]

如果您希望更具建设性,请事先确定等效符号。您可以通过循环遍历所有状态并最初将不同的组设置为包含所有内容的一个大组来实现此目的。接下来,每个状态将每个组拆分为与当前状态转换的组。根据转换拆分它们并删除单例,不需要考虑它们因为它们是原子的。