CFG到正则表达式

时间:2014-11-10 19:10:51

标签: regex context-free-grammar

我对这个CFG感到困惑。我想将其转换为正则表达式:

A -> aA | B | epsilon
B -> bB | A

请同时提及从CFG到RE的转换规则。

1 个答案:

答案 0 :(得分:3)

我想你在这里谈论正式的正则表达式。

简短回答:这只是:(a | b)*

为什么呢?我们来看看:

A -> aA | B | epsilon
B -> bB | A

这相当于这个语法:

A -> aA 
A -> B
A -> epsilon
B -> bB
B -> A

在这里看到什么?

A -> B
B -> A

这些是等效的。我们只需将B替换为A

A -> aA 
A -> epsilon
A -> bA

重新排序:

A -> aA 
A -> bA
A -> epsilon

用ORs重写

A -> aA | bA
A -> epsilon

因素:

A -> (a | b) A
A -> epsilon

简化:

A -> (a | b) A | epsilon

这是:

A -> (a | b)*

或者,在具体的PCRE表示法中:[ab]*

此外,您的问题并不清楚,但您应该知道only some CFG可以转换为正则表达式。