我试图将给定的BNF列表转换为EBNF,但我完全不知道如何转换。有人能帮忙吗?
BNF是:
<Sentence> :== <NounPhrase><VerbPhrase>
<NounPhrase> :== <Noun>
<NounPhrase> :== <Article><Noun>
<NounPhrase> :== <Article><AdjectiveList><Noun>
<NounPhrase> :== <AdjectiveList><Noun>
<AdjectiveList> :== <Adjective>
<AdjectiveList> :== <Adjective><AdjectiveList>
<VerbPhrase> :== <Verb>
<VerbPhrase> :== <Verb><Adverb>
<Noun> :== frog | grass | goblin
<Article> :== a | the | that
<Adjective> :== purple | green | tiny
<Verb> :== grows | dreams | eats
<Adverb> :== quickly | slowly | badly
扩展的BNF语法使用以下约定:
- 上标?在符号之后意味着它是可选的,可以出现一次,也可以不出现
- 符号后面的上标+表示它必须至少出现一次,但可以出现多次
- 符号后面的上标*意味着它可能一次也不会出现
- 成对的圆括号可用于将符号组合在一起,用于:、+、*运算符
- 尖括号通常从非端子符号中删除,并使用不同的字体来区分端子和非端子
这就是我到目前为止的想法,但我不确定它是否正确。
Sentence :== (<NounPhrase><VerbPhrase>) +
NounPhrase :== <Noun> + (<Article>< AdjectiveList>)?
AdjectiveList :== <Adjective> *
VerbPhrase :== <Verb> + <Adverb>?
Noun :== (frog | grass | goblin)*
Article :== (a | the | that)*
Adjective :== (purple | green | tiny)*
Verb :== (grows | dreams | eats)*
Adverb :== (quickly | slowly | badly)*
原始BNF为:
<Sentence> :== <NounPhrase><VerbPhrase>
<NounPhrase> :== <Noun>
<NounPhrase> :== <Article><Noun>
<NounPhrase> :== <Article><AdjectiveList><Noun>
<NounPhrase> :== <AdjectiveList><Noun>
<AdjectiveList> :== <Adjective>
<AdjectiveList> :== <Adjective><AdjectiveList>
<VerbPhrase> :== <Verb>
<VerbPhrase> :== <Verb><Adverb>
<Noun> :== frog | grass | goblin
<Article> :== a | the | that
<Adjective> :== purple | green | tiny
<Verb> :== grows | dreams | eats
<Adverb> :== quickly | slowly | badly
第一次尝试转换为所需的EBNF方言是:
Sentence :== (<NounPhrase><VerbPhrase>) +
NounPhrase :== <Noun> + (<Article>< AdjectiveList>)?
AdjectiveList :== <Adjective> *
VerbPhrase :== <Verb> + <Adverb>?
Noun :== (frog | grass | goblin)*
Article :== (a | the | that)*
Adjective :== (purple | green | tiny)*
Verb :== (grows | dreams | eats)*
Adverb :== (quickly | slowly | badly)*
你的想法不正确:
- 你没有去掉尖括号
- 在原文中,句子是一个名词短语,后面跟着一个动词短语;在重写中,它是一个或多个"名词短语后接动词短语"的序列
- 在原文中,名词短语以名词结尾;在重写中,它后面可以是一个文章和形容词列表的零或一组合列表(但不能在前面加文章或形容词列表)
- 在原文中,形容词列表是一个或多个形容词的序列;在你的重写中,是一个由零个或多个形容词组成的列表
- 在原文中,一个动词短语是一个单独的动词,后面可选地跟一个副词;在你的改写中,它是一个或多个动词后面跟着零个或更多副词
- 在原文中,名词、冠词、形容词、动词和副词中的每一个都是三个替代值中的一个;在重写中,每个值都是一个包含0个或多个或相应的三个可选值的列表
我有点困惑该去掉哪些括号。我不知道终端和非终端之间的区别是什么,以及如何在上面区分它们。删除上标"+"和括号会更正吗?
终端符号是代表自身的东西。在这种情况下,诸如"青蛙"、"the"、"green"、"dreams"one_answers"baddy"等词都是词尾。
非终端符号是根据其他符号、其他非终端或根据终端来定义的。像<Sentence>
和<Noun>
这样的东西是非终端的。
尖括号是<
和>
符号(相对于圆括号或圆括号()
、方括号[]
或花括号或大括号{}
)。
从Sentence :== (<NounPhrase><VerbPhrase>) +
中删除括号和+
(以及尖括号)将改进它。在标准BNF中,:==
符号通常是::=
,而在标准EBNF中,仅用=
代替,并且用逗号明确表示连接:
Sentence = Noun Phrase, Verb Phrase
在标准EBNF中,端子用双引号或单引号括起来(而不是用字体更改)。"上标"也没有必要——?
、+
和*
只是出现在重复的单元后面。(注意,标准EBNF在可选事项周围使用[ … ]
,在重复(零个或多个)项目周围使用{ … }
,在重复的(一个或多个子)项目附近使用{ … }-
)。
NounPhrase = Article ? AdjectiveList ? Noun
Noun = "frog" | "grass" | "goblin"