我不太清楚如何回答我的計算機語言課程的問題。我給下面的語句轉換從EBNF形式BNF形式:將EBNF轉換爲BNF基礎知識
EBNF:expr --> [-] term {+ term}
據我瞭解,包括大括號中的表達式要重複零次或更多次,而這包括直角括號內的事情代表零個或一個選項。如果我的理解是正確的,這是否是一個正確的轉換?
我BNF:
expr --> expr - term
| expr + term
| term
我不太清楚如何回答我的計算機語言課程的問題。我給下面的語句轉換從EBNF形式BNF形式:將EBNF轉換爲BNF基礎知識
EBNF:expr --> [-] term {+ term}
據我瞭解,包括大括號中的表達式要重複零次或更多次,而這包括直角括號內的事情代表零個或一個選項。如果我的理解是正確的,這是否是一個正確的轉換?
我BNF:
expr --> expr - term
| expr + term
| term
我不認爲這是正確的。事實上,我不認爲EBNF實際上是有效的EBNF。 How to convert BNF to EBNF這個問題的答案顯示了EBNF是如何構建的,引用了ISO/IEC 14977:1996的Extended Backus-Naur Form標準。
我認爲表達:
expr --> [-] term {+ term}
應寫:
expr = [ '-' ] term { '+', term };
這意味着表達由一個可選的減號,隨後term
,隨後的零序列多出現一個加號和一個term
。
下一個問題:您選擇BNF的哪種方言?事情在這裏變得棘手;有很多方言。但是,這裏有一個可能的翻譯:
<expr> ::= [ MINUS ] <term> <opt_add_term_list>
<opt_add_term_list> ::= /* Nothing */
| <opt_add_term_list> <opt_add_term>
<add_term> ::= PLUS term
其中,MINUS和PLUS是終端(' - '和'+')。這是一個非常嚴峻但很小的BNF。另一種可能的翻譯將是:
<expr> ::= [ MINUS ] <term> { PLUS <term> }*
凡{ ... }*
部分表示零或多個包含圖案...
(在本例這樣PLUS <term>
)的。或者你可以使用帶引號的字符:
<expr> ::= [ '-' ] <term> { '+' <term> }*
所以可能的替代方案列表繼續。你必須看看你被賦予工作的BNF的定義,並且你應該抱怨你被給予的非常草率的EBNF,如果它意味着是ISO標準的EBNF。如果它只是一種隨機BNF風格的語言,稱爲EBNF,我想這只是令人困惑的名字。私人方言只要定義好就可以,但方言不知道的人不可能知道正確答案是什麼。