Regex 从任何正则表达式生成上下文无关语法的算法

Regex 从任何正则表达式生成上下文无关语法的算法,regex,algorithm,nlp,context-free-grammar,computation-theory,Regex,Algorithm,Nlp,Context Free Grammar,Computation Theory,有人能为我概述一种算法,它可以将任何给定的正则表达式转换成一组等价的CFG规则吗 我知道如何处理诸如(a | b)*之类的基本问题: 但是,我在将其形式化为适当的算法时遇到了一些问题,特别是对于可能有许多嵌套操作的更复杂的表达式。如果您只是从理论角度讨论正则表达式,则有以下三种结构: ab # concatenation a|b # alternation a* # repetition or Kleene closure 然后你可以做什么: 创建规则S->

有人能为我概述一种算法,它可以将任何给定的正则表达式转换成一组等价的CFG规则吗

我知道如何处理诸如(a | b)*之类的基本问题:


但是,我在将其形式化为适当的算法时遇到了一些问题,特别是对于可能有许多嵌套操作的更复杂的表达式。

如果您只是从理论角度讨论正则表达式,则有以下三种结构:

ab       # concatenation
a|b      # alternation
a*       # repetition or Kleene closure
然后你可以做什么:

  • 创建规则
    S->(fullRegex)
  • 对于
    fullRegex
    中的每个重复术语
    (x)*
    ,创建一个规则
    x->x
    x->ε
    ,然后将
    (x)*
    替换为
    x
  • 对于每一个替换
    (a | b | c)
    创建规则
    Y->a
    Y->b
    Y->c
    ,然后将
    (a | b | c)
    替换为
    Y
只需递归地重复这个过程(请注意,所有
x、
a
b
c
仍然可以是复杂的正则表达式)。请注意,当然,您必须为每个步骤使用唯一标识符

这应该足够了。这当然不会给出最优雅或最有效的语法,但这正是规范化的目的(应该在单独的步骤中完成,并且必须这样做)

例如:
a(b | cd*(e | f)*)*


我希望你是在开玩笑,当你问我们一个完整的大纲的算法。正如你可能已经注意到的,这将是一个很大的工作。如果你有一个关于某个特定问题的特定问题,请随意提问,但不要要求我们为你实际设计你的代码;S->bs;S->epsilon?我认为您提供的cfg将匹配的唯一字符串是“”,因为它接受的其他字符串都是有限的。这实际上还取决于您希望允许哪些正则表达式语法元素?只有理论意义上的正则表达式?或者在大多数引擎中使用的扩展意义上的regex?@Wug State/Symbol S在我给出的示例中是一个启动状态。哦,我确实忘记了一些规则,编辑:@m.buettner现在让我们谈谈理论意义。
ab       # concatenation
a|b      # alternation
a*       # repetition or Kleene closure
S -> a(b|cd*(e|f)*)*

S -> a X1; X1 -> (b|cd*(e|f)*) X1; X1 -> ε

S -> a X1; X1 -> Y1 X1; X1 -> ε; Y1 -> b; Y1 -> cd*(e|f)*

S -> a X1; X1 -> Y1 X1; X1 -> ε; Y1 -> b; Y1 -> c X2 (e|f)*; X2 -> d X2; X2 -> ε

... and a few more of those steps, until you end up with:

S  -> a X1
X1 -> Y1 X1
X1 -> ε
Y1 -> b
Y1 -> c X2 X3
X2 -> d X2
X2 -> ε
X3 -> Y2 X3
X3 -> ε
Y2 -> e
Y2 -> f