BNF到EBNF的转换

时间:2014-11-07 01:59:01

标签: discrete-mathematics 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)*

1 个答案:

答案 0 :(得分:0)

原来的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)*

你提出的不正确:

  • 你没有放下尖括号。
  • 在原文中,句子是名词短语,后跟动词短语;在你的重写中,它是一个或多个'名词短语后跟动词短语'的序列。
  • 在原文中,名词短语以名词结尾;在你的重写中,它后面可以是一个零或一个文章和一个形容词列表组合的列表(但不是在文章或形容词列表之前)。
  • 在原文中,形容词列表是一个或多个形容词的序列;在你的重写中,是一个零或多个形容词的列表。
  • 在原文中,动词短语是单个动词,可选地后跟副词;在你的重写中,它是一个或多个动词后跟零个或多个副词。
  • 在原文中,名词,文章,形容词,动词和副词中的每一个都是三个替代值中的一个;在您的重写中,每个都是零或更多的列表或相应的三个替代值。

  

我对哪些括号下降感到困惑。我不知道终端和非终端之间有什么区别,以及如何在上面区分它们。删除上标“+”和括号是否正确?

终端符号是代表自己的东西。在这种情况下,诸如“青蛙”,“其中”,“绿色”,“梦想”和“严重”等词语都是终端。

非终端符号是根据其他符号定义的,可以是其他非终端符号,也可以是终端符号。 <Sentence><Noun>等内容属于非终端。

尖括号是<>符号(圆括号或圆括号(),方括号[]或大括号或大括号{}

+中删除括号和Sentence :== (<NounPhrase><VerbPhrase>) +(以及尖括号)会改善它。在标准BNF中,:==符号通常为::=,标准EBNF仅由=替换,并且用逗号明确指示连接:

Sentence = Noun Phrase, Verb Phrase

在标准EBNF中,终端用双引号或单引号括起来(而不是用字体更改)。并且“上标”也不是必需的 - ?+*只会出现在重复的单位之后。 (请注意,标准EBNF在可选事项周围使用[ … ],在重复(零个或多个)项目周围使用{ … },在重复(一个或多个)项目周围使用{ … }-

NounPhrase = Article ? AdjectiveList ? Noun

Noun = "frog" | "grass" | "goblin"