上下文无关语法问题

时间:2013-12-02 11:16:16

标签: grammar context-free-grammar

我需要帮助我使用这种语言的无上下文语法:

{b^4 n^m bd^n n^3n+m | m,n >= 0}

到目前为止,我得到了这个:

S-> bbbbXbY
X-> n | E
Y-> dYnnnX

1 个答案:

答案 0 :(得分:1)

假设S是开始符号,E是空字(),您的语言是{b^4 n^r b d^s n^(3s+r) | r,s ≥ 0}

正确的语法

S → bbbbN
N → bD | nNn
D → dDnnn | 

解释

  • S在左侧生成b^4并切换到N。它永远不会再次出现在派生中。
  • N双方生成n^r,然后b生成D并切换到D。之后,它再也不会出现在推导中。
  • 最后d^s n^(3s)生成Y并完成推导。
S                               (start symbol)
→ b^4 N                         (applied S → bbbbN)
→ b^4 n^r N n^r                 (applied N → nNn r-times)
→ b^4 n^r bD n^r                (applied N → bD)
→ b^4 n^r b d^s D (nnn)^s n^r   (applied D → dDnnn s-times)
→ b^4 n^r b d^s (nnn)^s n^r     (applied D → )

原始语法中的错误

您的语法会生成空语言,因为n将始终存在于每个派生步骤(无限递归)的乘积中。上下文也存在一个基本问题:X的第一个序列由S → bbbbXbYX生成,而Y → dYnnnXY → 生成的第二个序列独立于{b^4 n^r b d^s n^(3s+t)} }}。如果您添加bbbbXbddYnnnXnnnX,则语言为Y → dYnnnX。语法将是模糊的,因为n可以生成(使用Y → 两次),X的最终序列通常可以通过多种方式生成。

修复原始语法的步骤

  • 添加Y → dYnnnX以停止无限递归。
  • S → bbbbXbYX的末尾移至S → bbbbXbYX的末尾,以消除歧义。
  • 将新创建的n中的{{1}}链接在一起以强制上下文。必须由两者生成相同数量的{{1}}。

现在你在这个答案的顶部有正确的语法。

相关问题