如何获得无上下文语法及其相应的PDA?

时间:2012-01-15 16:27:36

标签: grammar context-free-grammar compiler-theory

我无法理解如何解决这个问题。

我需要制作一个可以验证以下输入的无上下文语法:

L={w € (0,1,2)* | w= 2^n 0^(m+1) 1^(m+n) with n>=0, m>0}

如何创建相应的PDA?

我认为该语言没有prefix-property,因此PDA无法通过空栈接受。 是不是?

1 个答案:

答案 0 :(得分:2)

让我们先试试语法;然后我们会为它制作一个自动机。

在制作CFG时 - 任何语法,包括正则表达式 - 了解语法可以轻松完成的几种简单语言会很有帮助。无上下文语法可以很容易地做任何常规语法可以做的事情,它也可以匹配输入。这意味着像^ n b ^ n,回文,匹配的括号等语言很容易做到。

在查看这样的问题时,请尝试查看这些陈规定型语言中的哪一种,如果有的话,使用您的语言中的全部或部分字符串。在这种情况下,似乎我们在a ^ n b ^ n上有变化;我们需要做两次才能完成添加。

让我们从0 ^(m + 1)1 ^ m开始。我们可以为此制作一个CFG吗?嗯,当然;它实际上与^ n b ^ n相同。这是:

S := 0E
E := 0E1 | -

现在我们需要解决n个术语:我们应该能够在左边加2,在右边加1,数量相等。这也很容易:

S := 2S1 | S'
S' := 0E
E := 0E1 | -

你去吧。要获得CFG,您可以根据这些内容的定义轻松构建自下而上或自上而下的解析器。我们将尝试从头开始制作PDA。

我们的PDA需要在循环中接受2,将每个2推入堆栈。毕竟,我们需要记住我们看到了多少。当我们看到0时,我们应该进入一个新状态,并在循环中保持接受0,在输入中看到的每个0为堆栈添加0。当我们看到1时,我们应该进入一个新状态,并在循环中接受1,从堆栈中移除2或0。如果您获得了正确的实现细节,那么您将能够在与前三个分开的接受状态下接受空堆栈。