アプリ版:「スタンプのみでお礼する」機能のリリースについて

C言語のプログラムからBNFにする方法を習っているのですが、どうしてもそのやり方がわかりません。
下にあるプログラムに対応するBNFを自分で作成してみたのですが、
<A>::=A|Bぐらいしかできませんでした。このBNFを作っても、なぜこうなるのかもわかりません。
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
enum symboltype{SMILE,HELLO,BYE,END};
void A();
void B();
void scan();
void error(char *msg);
enum symboltype next;
int main(int argc, char* argv[]){
scan();
A();
if(next != END) error("#PARSE ERROR#");
else puts("#PARSE OK#");
return 0;
}
void A(){
if(next != SMILE) error("#PARSE ERROR#");
else puts("#PARSE OK#");
return 0;
}
void B(){
if(next != SMILE){
scan();
return;
}else if(next != HELLO){
scan();
A();
if(next != BYE) error("#PARSE ERROR#");
scan();
}else error("#PARSE ERROR#");
}
void error(char *msg){
puts(msg);
exit(1);
}
void scan(){
char buff[10];
if(fgets(buff,10,stdin)==NULL){
next=END;
return;
}
if(strcmp(buff,"hello\n")==0) next=HELLO;
else if(strcmp(buff,"bye\n")==0) next=BYE;
else if(strcmp(buff,"(*_*)\n")==0) next=SMILE;
else error("#UNKNOWN TOKEN#");
}
このプログラムに対応するBNFを教えてほしいんです。
お願いしますm(_ _)m
また、BNFはどのように書くのかも教えていただけませんか。

A 回答 (3件)

http://oshiete1.goo.ne.jp/qa4700530.html
とはどこが違うの?
「プログラムに対応する BNF」とは何?
そして最大の疑問なんだけど, 教えている人に聞かないのはなぜ?

この回答への補足

問題自体は一緒ですが、プログラムとしてどこかおかしくても、そのまま作ってほしいんです。
どうも、うまく説明できなくてすみませんm(_ _)m

その最大の疑問ですが、もうこれでいいかなと思い、質問を締め切ってしまったんです。
やってみて、なんか違うなと思ってしまったので、新たに投稿したんです。
これを利用するのは初めてなので、質問を締め切ってしまったから、もう質問できないと思ったので、新しく作ったのです。

補足日時:2009/02/11 13:52
    • good
    • 0

や, だから,


「C言語のプログラムからBNFにする方法を習っている」
んだよね? だとしたら, 「あなたに教えている人がいる」はずでしょ? なんでその人に聞かないのかってのが「最大の疑問」として挙げたこと.
ちなみに「なんか違う」と思ったら「どこがどう違うと思ったのか」をなるべく書くようにしてください. じゃないと, 同じことを繰り返すことになりかねない.
で「プログラムに対応する BNF」とは何?

この回答への補足

そういう意味でしたか。

ご迷惑をおかけして誠に申し訳ございません。

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

BNFを考える前に、提示されているプログラムが受け付ける記号列が具体的にどんなものか分かりますか?


頭の中で考えても分からなければ、実際にこのプログラムを実行して試してみましたか?
残念ながら、このプログラムはどんな入力をしても #PARSE ERROR# か #UNKNOWN TOKEN# を表示して終了するはずです。

> qa4701108.exe
hello
#PARSE ERROR#
> qa4701108.exe
bye
#PARSE ERROR#
> qa4701108.exe
(*_*)
#PARSE OK#
#PARSE ERROR#
> qa4701108.exe
abc
#UNKNOWN TOKEN#

なので、「このプログラムに対応するBNF」はありません。
    • good
    • 0
この回答へのお礼

いえ、頭で考えてもわからなかったので
プログラムを実行してみたんですが、どうも結果がおかしかったので
必ずPARSEOKになるはずなので、どうしてもわかりませんでした。

それと、教えていただいて申し訳ありませんが、解決しました。

後で、知人に聞いてみたところ複数のデータを入力するんです。
(*_*)
(*_*)
のようにするのですから、わからなかったのです。

私の至らなさが足りないばかりに皆さんにご迷惑をおかけしました。
そして、ご協力いただいてありがとうございました。

お礼日時:2009/02/16 18:53

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