构造上下文无关语法

时间:2012-10-17 08:21:35

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

如何为以下语言构建无上下文语法:

L = {a^l b^m c^n d^p   | l+n==m+p; l,m,n,p >=1}

我开始尝试:

S -> abcd | aAbBcd | abcCdD | aAbcdD | AabBcCd

然后A =其他东西......但是我无法正常工作。

我想知道我们怎么能记住为没有增加多少c的shud。 b的增加?
例如:

string : abbccd

2 个答案:

答案 0 :(得分:2)

这是怎么回事:

S1 -> a S2 d                   # at least one a and d
S2 -> a S2 d
S2 -> S3 S4                    # no more d, split into ab and bc parts
S2 -> S4 S5                    # no more a, split into bc and cd parts

S3 -> a S3 b
S3 ->                          # already ensured at least one a and b
S4 -> b S4 c                  
S4 -> b c                      # at least one b and c
S5 -> c S5 d   
S5 ->                          # already ensured at least one c and d

关键是你如何分组......(即“部分”而不是非终端。)

答案 1 :(得分:1)

语法是:

  1. S1 - > a S1 d |的 S2

  2. S2 - > S3 S4

  3. S3 - > a S3 b |小量

  4. S4 - > S5 S6

  5. S5 - > b S5 c |小量

  6. S6 - > c S6 d |小量

  7. 规则1增加了相同数量的a和d。

    规则3增加了相同数量的a和b。

    规则5增加了相同数量的b和c。

    规则6增加了相同数量的c和d's

    规则还确保根据给定的语言维护字母顺序。