Regex 从任何正则表达式生成上下文无关语法的算法
有人能为我概述一种算法,它可以将任何给定的正则表达式转换成一组等价的CFG规则吗 我知道如何处理诸如(a | b)*之类的基本问题: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->
但是,我在将其形式化为适当的算法时遇到了一些问题,特别是对于可能有许多嵌套操作的更复杂的表达式。如果您只是从理论角度讨论正则表达式,则有以下三种结构:
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