首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >考虑以下BNF语法(BNF,递归)

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

Stack Overflow用户
提问于 2016-10-22 19:22:05
回答 2查看 458关注 0票数 1

编写一个BNF语法,用于识别所有的句子,形式为anbn-2,其中n>1。

例如,aa,aaab,aaaabb都被接受了,

但abbb,abbb

(提示:使用递归)。

这是我的推论:

S ::= AZ

Z ::= A= AAB

A ::= a

B ::= b

这是正确的吗?

编辑:也许这是正确的?

S -> a_x_x_y

代码语言:javascript
复制
                                                                                       X-> aX | a      
代码语言:javascript
复制
                                                                                               Y -> aX | b
EN

回答 2

Stack Overflow用户

发布于 2016-10-22 19:54:17

两者都是完全不正确的。

第一种语法:由于A只转到a,而b只转到b,所以我们可以用a和b替换A和B。语法如下:

代码语言:javascript
复制
S -> aZ
Z -> a
Z -> aab

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

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

票数 0
EN

Stack Overflow用户

发布于 2016-10-22 19:56:08

你的第一个语法只产生:

代码语言:javascript
复制
S -> AZ -> aZ -> aa
S -> AZ -> aZ -> aAAB -> aaab

您的第二个语法允许只包含a's的单词,这些单词不是语言的一部分。例如:

代码语言:javascript
复制
S -> a

我只需从两个a开始,然后生成任意对。因此,语法看起来像(BNF语法):

代码语言:javascript
复制
<term> ::= "aa" | "aa" <pair>
<pair> ::= "ab" | "a" <pair> "b"

示例:

代码语言:javascript
复制
<term> -> "aa"
<term> -> "aa" <pair> -> "aaab"
<term> -> "aa" <pair> -> "aaa" <pair> "b" -> "aaaabb"
...
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40196119

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档