创建CFG的技巧

时间:2014-11-04 06:33:57

标签: context-free-grammar

我必须创建一个生成

的CFG

{a^n (ab)^n c^m d^l e^k | n>0, k, l, m>=0, k<m, m=l+k}

第一部分很容易,我想出了

S -> aS2abS3 S2 -> aS2ab | epsilon

然而,第二部分非常令人困惑。到目前为止我已经

S3 -> S4 | epsilon

我遇到的问题是如何跟踪所有这些变量? K必须小于m,m必须等于l + k,并且l必须至少为1。有人可以给我一些关于接近这些CFG的一般提示吗?

1 个答案:

答案 0 :(得分:0)

从内到外思考(因为这就是CFG的工作方式),不要被无关的细节弄糊涂。

这里有一个提示:CFG是下推式自动机(PDA),这意味着它们有一个堆栈。 PDA具有良好的对称性,但不能进行反对称。所以他们可以做回文,但不能重复。这就是堆栈的本质。

所以你总是需要寻找镜像。例如,ambm是一种简单的镜像形式,镜像将a转换为b s。

这个稍微复杂一点,但如果你专注于寻找对称性,你会发现它。

话虽如此,这是解决方案:

m > l以来,

cmdlek

可以改写为:

cm-lcldlek

k = m - l起,这与:

相同
ckcldlek

从那里它是微不足道的:

Sinner → cd | c Sinner d
Souter → Sinner | c Souter e