Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 基于cfg的正则表达式求交算法_Algorithm_Grammar_Language Theory - Fatal编程技术网

Algorithm 基于cfg的正则表达式求交算法

Algorithm 基于cfg的正则表达式求交算法,algorithm,grammar,language-theory,Algorithm,Grammar,Language Theory,我在寻找一个算法,如果正则表达式和上下文无关语法的交集为空或不为空,则输出该算法。我知道这个问题是可以判定的,但是,我在伪代码中找不到任何示例实现 如果可能的话,有人能在.NET中为我提供这样的算法吗?但这不是必须的。这个问题也称为规则交点。谷歌搜索它只会给我几何算法或理论 编辑: 任何人。我真的被它卡住了,还找不到任何东西。这是我想到的一种方法的草图。我认为这应该是可行的,但这可能不是最好的方法,因为它使用了从PDA到CFG的非常混乱的转换 将正则表达式转换为非确定性有限自动机NFA,并将其简

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

如果可能的话,有人能在.NET中为我提供这样的算法吗?但这不是必须的。这个问题也称为规则交点。谷歌搜索它只会给我几何算法或理论

编辑:


任何人。我真的被它卡住了,还找不到任何东西。

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

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

以DFA和PDA的交叉点为例,这也是一个PDA。我们将说,DFA具有表单源、触发器、目的地的状态S1、开始状态S1、最终状态F1和转换delta1,PDA具有表单源、触发器、pop、目的地、推送的状态S2、开始状态S2、最终状态F2和转换delta2。新的PDA具有状态S1 X S2,每个状态由一对标记。它具有最终状态F1 X F2和开始状态s1、s2。现在是过渡

对于每个转换d,一个delta2的元素,对于每个状态s,一个元素s1,找到转换t,一个delta1的元素,形式为s,d,触发器,?。做一个新的转换d.source,s,d.trigger,d.pop,d.destination,t.destination,d.push


这个新的PDA应该接受RE和CFG产生的语言的交叉点。要测试语言是否为空,需要将其转换回CFG。这方面的算法既杂乱又庞大,但它是有效的。完成此操作后,请标记每个端子符号。然后标记每一个符号,该符号有一条规则,其中右侧只有已标记的符号,并重复此操作,直到不能标记更多符号为止。如果可以标记开始符号,则语言不是空的。否则,语言是空的。

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

该解决方案在以下章节中介绍:

Y.Ba Hillel、M.Prles和E.Shamir。1965关于函数的形式性质 简单短语结构语法。斯普拉希维森州Phonetik。科姆。15 I961143-172。Y.Bar Hillel,语言与信息, 艾迪生·卫斯理,雷丁,马萨诸塞州1965,116-150

但您可以在以下内容中找到更简单的版本:

Richard Beigel和William Gasarch。。证明交叉点 一种上下文无关的语言和一种常规语言是上下文无关的 它不使用下推自动机。 cfg.pdf


如果有帮助,这个解决方案是在Pyformlang中实现的,您可以在Github for Python上找到它

我相信是这样。一个不确定的CFG只有一个以上的规则具有相同的左侧,对吗?因此,它只会在交叉点PDA中产生两个具有相同左手边的过渡。顺便说一下,我使用的是《计算理论》第二版中的元素定义。编辑:或者你的意思是,它是否适用于CFG与CFG的交叉点?我不这么认为。我很确定这将需要两个堆栈,将其放入图灵机器领域。谢谢nullset。这是我已经找到的解决方案,但我通过几周的时间在不同的大学教授那里寻找,发现没有比这更简单的算法了。关于两个CFG的交集,这不再是CFG,因此不能用PDA表示。无论如何,感谢您提供的解决方案: