BNF到EBNF的转换



我试图将给定的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"

最新更新