代码之家  ›  专栏  ›  技术社区  ›  Mike Samuel

测试两种常规语言的交集

  •  5
  • Mike Samuel  · 技术社区  · 15 年前

    我想测试两种语言是否有共同的字符串。这两种语言都来自下面描述的常规语言的一个子集,我只需要知道两种语言中是否都存在一个字符串,而不是生成一个示例字符串。

    该语言由类似于glob的字符串指定

    /foo/**/bar/*.baz

    在哪里? ** 匹配0个或多个字符,以及 * 匹配零个或多个不是的字符 / ,所有其他字符都是文字。

    有什么想法吗?

    谢谢, 迈克

    编辑:

    我实现了一些看起来性能很好的东西,但还没有尝试过正确性证明。你可以看到 source unit tests

    2 回复  |  直到 13 年前
        1
  •  9
  •   Edmund    15 年前

    构建FAS A B 对于两种语言,并构造“交集fa” AnB . 如果 ANB公司 至少有一个可从开始状态访问的接受状态,那么两种语言中都有一个单词。

    建设 ANB 可能会很棘手,但我相信有一些FA教科书可以涵盖它。我会采取的方法是:

    • 状态 ANB 是下列状态的笛卡尔积 分别。一种状态 ANB 是书面的 (a, b) 在哪里? a 是一种状态 b 州是否处于 .
    • 过渡期 (a, b) ->r (c, d) (意思是,从 (A、B) (c, d) 论符号 r )存在 a ->r c 是在 b ->r d 是在 .
    • (a,b) 启动状态是否处于 ANB 敌我识别 开始状态是否在 分别。
    • (a,b) 接受状态是否处于 ANB 如果在各自的fa中,每个fa都是一个接受状态。

    这一切都是我的头上,因此完全未经证实!

        2
  •  2
  •   Bishnu    15 年前

    我只是做了一个快速搜索,这个问题是可以解决的(aka可以做),但我不知道有什么好的算法可以做到。一个是解决方案是:

    1. 将两个正则表达式都转换为nfas a和b
    2. 创建一个NFA,C,表示A和B的交集。
    3. 现在尝试从0到C中的状态数的每个字符串,看看C是否接受它(因为如果字符串更长,它必须在一点上重复状态)。

    我知道这可能有点难理解,但这是我唯一知道的方法。