2014-11-07 60 views
-1

我試圖將給定的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)* 
+0

您是否搜索過嗎? [如何將BNF轉換爲EBNF]缺少哪些信息(http://stackoverflow.com/questions/14922242/how-to-convert-bnf-to-ebnf)? – 2014-11-07 02:51:45

+0

抱歉,我忘記發佈其他部分,現在已經修復。我已經得到了這些轉換規則的幫助。 – 2014-11-07 03:05:15

+0

描述的EBNF約定不是EBNF-EBNF是ISO標準([ISO 14977:1996](http://www.iso.ch/cate/d26153.html),可免費獲得)。你仍然沒有回答我的問題,即「另一個問題缺少什麼信息?」,其編輯「你對你的任務或者BNF沒有了解嗎?」和「你試過什麼?」。 – 2014-11-07 03:13:31

回答

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)* 

你想出ISN」 t正確:

  • 您還沒有放棄尖括號。
  • 在原文中,一個句子是一個名詞短語後跟一個動詞短語;在你的重寫中,它是一個或多個「名詞短語後跟動詞短語」的序列。
  • 在原文中,名詞短語以名詞結尾;在你的重寫中,可以跟着一個零或一個文章和形容詞列表組合的列表(但不是在文章或形容詞列表之前)。
  • 在原文中,形容詞列表是一個或多個形容詞的序列;在你的重寫中,是一個零個或多個形容詞的列表。
  • 在原文中,動詞短語是單個動詞,後面可以跟一個副詞;在你的重寫中,它是一個或多個動詞,後面跟零個或多個副詞。
  • 在原文中,名詞,文章,形容詞,動詞和副詞中的每一個都恰好是三種可選值之一;在你的重寫中,每個都是一個零個或多個或相應的三個替代值的列表。

我有點困惑,其中括號下降。我不知道終端和非終端之間有什麼區別,以及如何區分它們。將刪除上標「+」和括號糾正它?

終端符號是表示自己的東西。在這種情況下,諸如「青蛙」,「the」,「green」,「dreams」和「badly」等詞是終端。

非終端符號是用其他​​符號來定義的,或者是其他的終端,或者是終端。諸如<Sentence><Noun>之類的東西不是終端。

尖括號是<>符號(相對於圓形括號或括號(),方括號[],或花括號或括號{})。

Sentence :== (<NounPhrase><VerbPhrase>) +中刪除括號和+(和尖括號)會改善它。在標準的BNF,所述:==符號通常::=和在標準EBNF由剛剛=取代,和級聯用逗號明確指出:

Sentence = Noun Phrase, Verb Phrase 

在標準EBNF,端子被包含在雙引號或單引號(而不是字體改變)。並且'上標'不是必需的 - ?,+*只出現在重複單元之後。 (請注意,標準EBNF圍繞可選事項使用[ … ],圍繞重複(零個或多個)項目使用{ … },圍繞重複(一個或多個)項目使用{ … }-

NounPhrase = Article ? AdjectiveList ? Noun 

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