交叉正则表达式与组,如何导出分组位的交集?

时间:2010-05-28 11:56:17

标签: c++ regex grouping intersection

我目前正在尝试解决类似于Testing intersection of two regular languages的问题,除了我知道如何进行交集,但还有其他要求。

我打算使用的交叉逻辑是Dragon Book用于将NFA转换为DFA的算法,但同时在两个NFA上执行。由于所有DFA都是NFA(但非确定性很小),因此您可以根据需要重复此更多的交叉点。

我的问题是我的一个正则表达式具有可以作为新正则表达式的一部分进一步使用的组。具体地:

bin/x86/a.out: obj/x86/.*\.o

obj/{[a-zA-Z0-9]+}/{.*}.o: src/\2.c

在第一行的末尾,我有一个匹配x86目标的所有对象的正则表达式。在第二行中,我有一个正则表达式,指定一个可能的构建行,它应该匹配第一个组与固定的“x86”,第二个组与之后的任何给定字符串匹配。在示例中,第一个匹配尚未使用,但它应该是可检索的。为了确保匹配结束(并允许递归规则),我想使用从第一个正则表达式获得的信息来匹配第二个。通过从第一行中获取第二个正则表达式并从第二行中取出第一个正则表来选择该规则,并确定两者的交集(交叉点产生的DFA)是否具有接受状态。如果是这样,那么有些句子都可以解析,因此可以采用该组可以采用的一些值。

通常,是否有可能从第一个正则表达式中提取信息以用于匹配第二个正则表达式的组?

如果不是一般情况,我需要添加哪些限制?

2 个答案:

答案 0 :(得分:0)

我相信反向标记使语言不规则,因此您将无法将其转换为有限自动机。

答案 1 :(得分:0)

  

为什么您的示例看起来像Makefile规则,即使Makefile不支持正则表达式?

因为那是我想做的事情(没有双关语意)。

  

你使用哪个正则表达式库?

没有,到目前为止。我正在考虑根据这个问题的输出编写自己的。如果这是不可能的,我可以使用支持此功能的现有功能。如果这在理论上是可行的,那么我将自己开发以完成这个&按照我的意愿制作应用程序。

  

一些支持先行表达式,这是表达式交集的另一种方式

交集背后的想法是定义通用的规则,并且可以包含多个不同的左侧部分(在通常的makefile中使用%,但如果你确实有多个,则不需要做某种递归make一个变体点 - 例如平台,构建类型或文件名)。如果我不能将第二个正则表达式考虑到组中,我不能递归地使用这样的规则,因为递归在每个步骤/级别之间不会有任何变化。这会降低通用性,但仍然可以接受。尽管如此,知道答案是一个有趣的问题(IE,它可以一般地完成),它将决定我对正则表达式库的要求。

(未发布为原作者,因为我丢失了我的cookie并等待合并后的帐户)。