描述此语言的下推自动机

时间:2018-11-01 17:40:16

标签: pushdown-automaton

我们将ABC语言归纳为:

  1. epsilon在ABC中。
  2. 如果x在ABC中,则[x]和(x)也是如此,
  3. 如果x和y都在ABC中,则xy也是如此。

描述此语言的PDA,该PDA被空堆栈接受。所有都给 过渡。

1 个答案:

答案 0 :(得分:0)

首先,我们认识到我们需要一个接受状态q0。因为epsilon是语言,所以我们可以认为q0正在接受(并同时由空堆栈接受和接受状态)。每当到目前为止处理的输入前缀的花括号和括号都相等时,我们将安排q0代表PDA的状态。语言中的所有字符串都将在此处结束,并且具有空堆栈。如果我们处在q0位置,而在堆栈顶部看不到堆栈底部符号Z0,则可以安全地崩溃并拒绝输入(尽管我们将对其进行排列,因此永远不会发生)。

如果q0对应于已看到该语言中的字符串,并且由于该语言中可能存在前缀,但前缀可以返回该语言,因此我们推断出至少需要一个附加状态。将此称为q1。我们可以在状态q0上的[或(并将它们推入堆栈,以便我们记住它们的状态。如果看到]或),则可以从q0到q1添加过渡,因为我们正在安排它,以便处于状态q0表示我们已经看到输入的前缀(该语言是字符串),并且在此阶段看到的右花括号和括号不能固定。

在状态q1中,我们看到一些开括号和/或括号没有与相应的闭括号和/或括号匹配。在任何时候,我们都可以通过返回q1并将遇到的符号推入堆栈的顶部来接受大括号或括号。但是,当遇到右括号时,我们必须注意确保匹配正确的事物。因此,我们只需要转换即可处理匹配的对。我们可能会在不匹配的货币对上崩溃。

如果处于状态q1,我们正在看一个空栈,那么我们就会意识到我们已经匹配了当前段中的所有内容,并且正在看该语言中的字符串;在这种情况下,我们可以将epsilon过渡添加回q0。

完成的PDA如下所示:

Q    s    S    Q'    S'
-    -    -    -     -
q0   [    Z0x  q1    [Z0x
q0   (    Z0x  q1    (Z0x
q1   [    x    q1    [x
q1   (    x    q1    (x
q1   ]    [x   q1    x
q1   )    (x   q1    x
q1   e    Z0   q0    Z0

在上面:

  • e是epsilon,是空字符串
  • x是输入字母上的任意字符串
  • Z0是栈底符号