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はどのように書くのかも教えていただけませんか。
No.1
- 回答日時:
とはどこが違うの?
「プログラムに対応する BNF」とは何?
そして最大の疑問なんだけど, 教えている人に聞かないのはなぜ?
この回答への補足
問題自体は一緒ですが、プログラムとしてどこかおかしくても、そのまま作ってほしいんです。
どうも、うまく説明できなくてすみませんm(_ _)m
その最大の疑問ですが、もうこれでいいかなと思い、質問を締め切ってしまったんです。
やってみて、なんか違うなと思ってしまったので、新たに投稿したんです。
これを利用するのは初めてなので、質問を締め切ってしまったから、もう質問できないと思ったので、新しく作ったのです。
No.2
- 回答日時:
や, だから,
「C言語のプログラムからBNFにする方法を習っている」
んだよね? だとしたら, 「あなたに教えている人がいる」はずでしょ? なんでその人に聞かないのかってのが「最大の疑問」として挙げたこと.
ちなみに「なんか違う」と思ったら「どこがどう違うと思ったのか」をなるべく書くようにしてください. じゃないと, 同じことを繰り返すことになりかねない.
で「プログラムに対応する BNF」とは何?
No.3ベストアンサー
- 回答日時:
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」はありません。
いえ、頭で考えてもわからなかったので
プログラムを実行してみたんですが、どうも結果がおかしかったので
必ずPARSEOKになるはずなので、どうしてもわかりませんでした。
それと、教えていただいて申し訳ありませんが、解決しました。
後で、知人に聞いてみたところ複数のデータを入力するんです。
(*_*)
(*_*)
のようにするのですから、わからなかったのです。
私の至らなさが足りないばかりに皆さんにご迷惑をおかけしました。
そして、ご協力いただいてありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# プログラムの時、フローチャートはどうなりますか?図でお願いします。 int main(void) { 1 2022/10/01 22:45
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- その他(プログラミング・Web制作) 十進BASICでの再帰についての質問です。 2 2022/11/18 09:17
- C言語・C++・C# leetcode21 1 2022/04/21 11:53
- PHP php エラー 2 2022/10/23 16:43
- Visual Basic(VBA) VBAの繰り返し処理について教えてください。 3 2022/08/02 13:21
- C言語・C++・C# C言語 共用体について コマンドライン引数で値を2つ入力したときに、argv[2]の値をUNI u1 4 2022/04/25 20:34
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Vba 実数および実数タイプの変...
-
VBAにてメール作成した際、一部...
-
あるプログラムのコマンドライ...
-
パックマンプログラム
-
Notepad++の関数リスト表示でC...
-
VBAが止まります。
-
「Outlookが他のプログラムによ...
-
自動クエリとはどういうもので...
-
これはDos攻撃になりますか?
-
Excelで4096点以上のFFTの方法
-
VBでのPublic変数につ...
-
Excelに埋め込んだVBAのプログ...
-
VBAでユーザーフォームが自動的...
-
読み込み中にアクセス違反が発...
-
寿命
-
セルフイメージを高める21日...
-
binファイルってiphone専用です...
-
プログラムのループの周期を設...
-
RSAのCプログラム
-
自作のプログラムがウイルスと...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
あるプログラムのコマンドライ...
-
Excelで4096点以上のFFTの方法
-
「Outlookが他のプログラムによ...
-
Excelに埋め込んだVBAのプログ...
-
VBAにてメール作成した際、一部...
-
Notepad++の関数リスト表示でC...
-
自動クエリとはどういうもので...
-
読み込み中にアクセス違反が発...
-
PICマイコンのコピー(クローン...
-
XnViewにwebpを「いつも開く」...
-
未使用の変数を一括検索する方法
-
VBAでユーザーフォームが自動的...
-
UWSCで指定のフォルダを開きたい。
-
パックマンプログラム
-
このプログラミング誰か教えて...
-
モジュール、アプリケーション...
-
Vba UserFormを前面に出す方法...
-
特定のwebサイトのタイトルや記...
-
ドロップダウンリストの文字を...
-
テキストボックスのエンターキ...
おすすめ情報