考虑以下BNF语法(BNF,递归)

时间:2016-10-22 19:22:05

标签: recursion bnf

写一个BNF语法,用于识别anbn-2形式的所有句子,其中n> 1.
例如,aa,aaab,aaaabb都被接受,但是abbb,aab,aabb不是
(提示:使用递归)。

这是我的推导:
S :: = AZ
Z :: = A | AAB
A :: = a
B :: = b
这是对的吗?

编辑:也许这是正确的?

S - > a | X | Y
X-> aX | a
Y - > aX | b

2 个答案:

答案 0 :(得分:0)

两者都完全不正确。

第一语法:由于A只转向a,而B只转向b,我们可以用a代替A,用B代替B.语法将是:

S -> aZ
Z -> a
Z -> aab

因此,S转向aa或aaab,但不是,例如,aaaabb。

第二语法:使用第一个规则并将S转为a。由于a不是有效单词,因此语法也不正确。 (或者,我们可以将S转为X,然后将X转换为aX 9次,然后将X转换为a,制作aaaaaaaaa,这也是无效的。)

答案 1 :(得分:0)

你的第一个语法只产生:

S -> AZ -> aZ -> aa
S -> AZ -> aZ -> aAAB -> aaab

你的第二个语法允许只包含a的单词,这些单词不属于该语言。例如:

S -> a

我只是从两个a开始,然后产生任意对。因此,语法看起来像(implicit newline (see the end argument per the documentation)):

<term> ::= "aa" | "aa" <pair>
<pair> ::= "ab" | "a" <pair> "b"

示例:

<term> -> "aa"
<term> -> "aa" <pair> -> "aaab"
<term> -> "aa" <pair> -> "aaa" <pair> "b" -> "aaaabb"
...