我们将ABC语言归纳为:
描述此语言的PDA,该PDA被空堆栈接受。所有都给 过渡。
答案 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
是栈底符号