与cfg正则表达式交集的算法

时间:2010-11-09 14:23:54

标签: algorithm grammar language-theory

我正在寻找一种算法,如果正则表达式和无上下文语法的交集是空的,则输出该算法。我知道这个问题是可判定的,但是,我找不到任何示例实现(在伪代码中)。

有人可以在.NET中为我提供这样的算法,但这不是必须的。这个问题也称为“常规交叉点”。谷歌搜索它只给我几何算法或关于它的理论。

修改

任何人。我真的坚持下去,还找不到任何东西。

2 个答案:

答案 0 :(得分:4)

以下是我发现的一种方法草图。我认为这应该有效,但它可能不是最好的方法,因为它使用从PDA到CFG的非常混乱的转换。

将正则表达式转换为非确定性有限自动机(NFA)并将其降低到最小确定性有限自动机(DFA)。将上下文无关语法(CFG)转换为下推式自动机(PDA)。这些第一步都是众所周知的,而且算法相当简单。

采取DFA和PDA的交叉点,这也是一个PDA。我们将说DFA具有状态S1,开始状态s1,最终状态F1,以及形式((源,触发器),目的地)的过渡delta1,并且PDA具有状态S2,开始状态s2,最终状态F2和过渡形式的delta2((source,trigger,pop),(destination,push))。新的PDA具有状态S1 X S2,每个状态由一对标记。它具有最终状态F1 X F2,并且开始状态(s1,s2)。现在进行过渡。

对于每个过渡d,delta2的元素,对于每个状态s元素s1,找到转换t形式的delta1元素((s,d.trigger),?)。进行新的转换(((d.source,s),d.trigger,d.pop),((d.destination,t.destination),d.push))。

这个新的PDA应该接受RE和CFG产生的语言的交集。要测试语言是否为空,您需要将其转换回CFG。对此的算法是凌乱和大,但它的工作原理。完成后,标记每个终端符号。然后标记每个符号,该符号在右侧只有标记符号的规则,并重复,直到您不再标记符号。如果您可以标记开始符号,则该语言不为空。否则,语言为空。

答案 1 :(得分:0)

事实上,有一个更简单的算法来计算上下文无关文法和正则表达式之间的交集。它不使用下推自动机,这对于通过多次转换从 CFG 获得的成本可能很高。

此解决方案出现在:

<块引用>

是的。 Ba-Hillel、M. Prles 和 E. Shamir。 1965. 论形式属性 简单的短语结构语法。 Z.Phonetik,Sprachwissen。科姆。 15 (I961),143-172。 Y. Bar-Hillel,语言和信息, Addison-Wesley, Reading, Mass (1965), 116–150。

但是您可以在以下位置找到更简单的版本:

<块引用>

理查德·贝格尔和威廉·加沙克。 .. 交集的证明 上下文无关语言和常规语言的关系是上下文无关的 哪个不使用下推自动机。 http://www.cs.umd.edu/~gasarch/BLOGPAPERS/ cfg.pdf (.).

如果有帮助,这个解决方案是在 Pyformlang (https://pyformlang.readthedocs.io/) 中实现的,你可以在 Github for Python (https://github.com/Aunsiels/pyformlang/blob/master/pyformlang/cfg/cfg.py) 上找到它