dポイントプレゼントキャンペーン実施中!

BNFを勉強しているのですが、そのBNFの書き方がわかりません。
どういうふうに作っていくのか、教えていただけませんか?
お願いします。

A 回答 (3件)

バッカス・ナウア記法の意味のBNFでいいんですよね?


大ざっぱな手順としてはこんな感じでしょうか。

1. 現れうる全ての終端記号を列挙する。
2. そのBNFで定義する文法全体を表す非終端記号を決める。
3. 定義がまだ与えられていない非終端記号を左辺として、::= の右辺にその非終端記号の定義を書く。定義に必要ならば、右辺に新たな非終端記号を導入してもよい。左辺の非終端記号と同じ非終端記号が右辺にも現れる再帰的定義になる場合もある。
4. 未定義の非終端記号がなくなるまで、3を繰り返す。
5. 定義したBNFに過不足がないかを確認する。

たとえば、1桁以上の数字(ただし、先頭の桁に0が現れてはいけない)を表すならばこんな感じでしょうか。答えは一つではないので、これとは違う定義も作れます。

<number> ::= <non-zero-digit> | <non-zero-digit> <digits>
<digits> ::= <digit> | <digit> <digits>
<non-zero-digit> ::= 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
<digit> ::= 0 | <non-zero-digit>

この回答への補足

そのように解いていくのですか。

それとわからないところがあるんですが、非終端記号と終端記号です
下に例としてプログラムにこのような文があったとき
enum Days {Sat, Sun, Mon, Tue, Wed, Thu, Fri};
void A
void B
これだと非終端記号はAとBで終端記号はSat, Sun, Mon, Tue, Wed, Thu, Friってことになるんですか?

その部分がよくわからないので、教えていただけませんか?

補足日時:2009/02/12 09:59
    • good
    • 0

> 例としてプログラムにこのような文があったとき


> 略
> これだと非終端記号はAとBで終端記号はSat, Sun, Mon, Tue, Wed, Thu, Friってことになるんですか?

この文脈で唐突に「プログラム」と言われても、その「プログラム」とBNFがどう関係するのかが分かりません。
C言語のenum文の文法を表すBNFを書けということなら、enumや { や ; も終端記号になるでしょう。

百歩譲って
・質問番号4700530や4701108の人と同じような課題をやっていて
・void Aとかvoid Bというのが「何らかの記号列を文法規則に従って読み込む関数」を表している
のだと仮定するならば、
関数A()やB()が読み込める記号列を表す非終端記号として<A>や<B>を導入するのは悪くない考えかもしれません。

ところで、上記の仮定をすると今度はNo.1さんとの
「ある言語の文法をどのように決めて行くかということですか?」
「そのようにとらえてかまいません。」
というやり取りとの関係がよく分からなくなります。

この回答への補足

そうですか、唐突過ぎて申し訳ありません。
私の説明不足ですみません。
そして、ご迷惑をかけて申し訳ありません。

アドバイスを頂き、ありがとうございます。

補足日時:2009/02/16 18:36
    • good
    • 0

質問が漠然としていて何が訊きたいのかわかりません。


BNFの書き方というのは、ある言語の文法をどのように決めて行くか
ということですか?

この回答への補足

そのようにとらえてかまいません。

それとわかりにくい質問ですみません。

補足日時:2009/02/12 09:55
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!