2

コンピュータ言語のクラスの質問に答える方法がよくわかりません。次のステートメントをEBNF形式からBNF形式に変換します。

EBNF:expr --> [-] term {+ term}

中括弧に含まれる表現は0回以上繰り返され、直角中括弧に含まれるものは0または1つのオプションを表すことを理解しています。私の理解が正しければ、これは正しい変換でしょうか?

私のBNF:

expr --> expr - term
       | expr + term
       | term

ボーナスリーディング

4

1 に答える 1

2

それは正しくないと思います。実際、EBNF が実際に有効な EBNF だとは思いません。「 BNF を EBNF に変換する方法」という質問への回答は、有効な EBNF がどのように構築されているかを示しており、ISO/IEC 14977:1996、拡張バッカス-ナウア形式標準から引用しています。

私は次の表現だと思います:

expr --> [-] term {+ term}

次のように記述します。

expr = [ '-' ] term { '+', term };

これは、式がオプションのマイナス記号で構成され、termその後に が続き、その後にプラス記号と が 0 回以上出現するシーケンスが続くことを意味しますterm

次の質問: BNF のどの方言をターゲットにしていますか? ここで事態はややこしくなります。方言が多い。ただし、可能な翻訳の 1 つを次に示します。

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

部分{ ... }*は、含まれるパターンの 0 個以上を意味します...(PLUS <term>この例ではそうです)。または、引用符を使用できます。

<expr> ::= [ '-' ] <term> { '+' <term> }*

そして、可能な選択肢のリストは続きます。与えられた BNF の定義を確認する必要があります。与えられた非常にずさんな EBNF については、それが ISO 標準の EBNF であることが意図されていた場合は、文句を言う必要があります。それが EBNF と呼ばれるランダムな BNF スタイルの言語であった場合、紛らわしいのは名前だけだと思います。私的な方言は、定義されていれば問題ありませんが、方言に精通していない人が正解を知ることはできません。

于 2013-02-25T06:48:16.930 に答える