2013-02-17 35 views
4

如何將此BNF轉換爲EBNF?如何將BNF轉換爲EBNF

<vardec> ::= var <vardeclist>; 
<vardeclist> ::= <varandtype> {;<varandtype>} 
<varandtype> ::= <ident> {,<ident>} : <typespec> 
<ident> ::= <letter> {<idchar>} 
<idchar> ::= <letter> | <digit> | _ 
+3

[轉換BNF到EBNF]的可能的重複(http://stackoverflow.com/questions/8101594/converting-bnf-to-ebnf) – CharlesB 2013-02-17 14:44:46

+0

究竟是什麼問題? – 2013-02-17 14:46:35

+1

'可能重複'的問題有一個答案,其中包含兩個關於SO材料的鏈接。它肯定會提出一個大致相同的問題;但它並沒有很好的答案,所以它不是很好的重複。 – 2013-02-17 14:58:04

回答

0

刪除尖括號,並把所有的終端到報價:

vardec ::= "var" vardeclist; 
vardeclist ::= varandtype { ";" varandtype } 
varandtype ::= ident { "," ident } ":" typespec 
ident ::= letter { idchar } 
idchar ::= letter | digit | "_" 
+1

第一次近似;有一些細節需要修復。 – 2013-02-17 15:05:41

9

EBNF或Extended Backus-Naur FormISO 14977:1996,並且是PDF可從ISO免費*。它沒有被計算機語言標準廣泛使用。還有一個描述它的paper,並且該論文包含彙總EBNF表示法的表格。

  Table 1: Extended BNF 
Extended BNF Operator Meaning 
------------------------------------------------------------- 
unquoted words   Non-terminal symbol 
" ... "     Terminal symbol 
' ... '     Terminal symbol 
(...)     Brackets 
[ ... ]     Optional symbols 
{ ... }     Symbols repeated zero or more times 
{ ... }-     Symbols repeated one or more times† 
=    in  Defining symbol 
;    post  Rule terminator 
|    in  Alternative 
,    in  Concatenation 
-    in  Except 
*    in  Occurrences of 
(* ... *)     Comment 
? ... ?     Special sequence 

*運算符與前面的(無符號)整數一起使用;它似乎沒有考慮到可變數量的重複 - 例如在初始字符之後1-15個字符使標識符長達16個字符。此LIS

在標準中,左括號(稱爲開始組符號和右括號)稱爲端基符號;開放式方括號[開始選項符號和方括號是結束選項符號;左大括號{起始重複符號和大括號}末尾重複符號。單引號'被稱爲第一個報價符號和雙引號"第二個報價符號

*是的,免費 - 即使您也可以支付74瑞士法郎,如果你願意。查看包含可付費項目的框下的註釋。


問題尋求這種「BNF」轉換成EBNF:

<vardec> ::= var <vardeclist>; 
<vardeclist> ::= <varandtype> {;<varandtype>} 
<varandtype> ::= <ident> {,<ident>} : <typespec> 
<ident> ::= <letter> {<idchar>} 
<idchar> ::= <letter> | <digit> | _ 

的BNF沒有被正式定義,因此我們必須做出一些(容易)猜測到這意味着什麼。翻譯是例程(如果BNF被正式定義它可以是機械的):

vardec  = 'var', vardeclist, ';'; 
vardeclist = varandtype, { ';', varandtype }; 
varandtype = ident, { ',', ident }, ':', typespec; 
ident  = letter, { idchar }; 
idchar  = letter | digit | '_'; 

括號具有圍繞非端子被除去的角度;定義符號::=被替換爲=;如;_等終端用引號引起來;級聯明確標記爲,;並且每個規則以;結束。原文中的分組和替代操作恰巧與標準符號相符。注意,用逗號顯式連接意味着多字非終端是明確的。


†本身表明{...}-符號是不是標準的一部分,只是在紙張的標準休閒研究。然而,由於在commentjmmut筆記,標準不明確的{…}-含義:

§5.8語法術語

...

當一個語法長期是一個語法因素之後 一個除符號後跟一個句法異常它表示滿足 條件的任何符號序列:

a)它是由句法因子表示的符號序列,它不是由句法異常 表示的符號序列。

...

注 - { "A" } -代表的序列的一個或多個A的,因爲它是一個語法長期與空句法例外。

+0

謝謝,這有幫助! – 2013-02-17 16:30:49

+0

我想要注意的是符號'{...} - **是標準的一部分(第4頁末尾,在5.8句法術語下),只是不是以直觀的方式。它顯示瞭如何僅使用「{」,「}」和「-'」一個或多個「規則的定義:」ee = {「A」} - ,「E」;'定義「AE」 ,「AAE」,「AAAE」等 注意{「A」} - 表示一個或多個A的序列,因爲它是一個帶有空語法異常的句法項。 – jmmut 2017-07-18 09:20:49

+1

@jmmut:謝謝。發現得好。 '這是一件有趣的極簡主義。我已經更新了我的答案。我不確定是否過度殺人;有可能。 – 2017-07-18 14:34:40