我对这个CFG感到困惑。我想将其转换为正则表达式:
A -> aA | B | epsilon
B -> bB | A
请同时提及从CFG到RE的转换规则。
答案 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可以转换为正则表达式。