C言語の問題からBNFにするのですが、プログラムで、
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#");
}
の部分だけBNFにしたいんですが、自分で考えてもよくわからなくて、なんとか答えを出してみたのですが、結果は<A>::=A|Bと<B>::=B|Aとなってしまいました。この答えであっているのかわからないので、誰か教えてください。もし、違っていた場合は、答えとなぜそうなるのか教えてほしいんです。よろしくお願いします。
No.2ベストアンサー
- 回答日時:
B()はどこからも呼ばれることがないので、無視していいですね。
次にmain()を見ると、scan()とA()を順に呼び出しています。
・scan()を呼ぶと、nextの値がEND, HELLO, BYE, SMILEのどれかになる、あるいはエラーになります。
・A()は、nextの値がSMILEのときだけ成功です。それ以外の場合はエラーになります。
・A()が成功してmain()に戻ると、そこでまたnextの値をチェックします。ENDのときだけ成功で、それ以外の場合はエラーです。
→ scan()でnextがSMILEになった場合: A()は成功するが、main()に戻ったところで失敗する
→ scan()でnextがSMILE以外になった場合: A()で失敗する
なので、このプログラムでパーズできるシンボル列はありません。
No.1
- 回答日時:
質問に書いてある内容だけでは、答えられる人はいないと思います。
・「C言語からBNFに変更したい」とか「C言語の問題からBNFにする」というのは、「このC言語のプログラムがパーズできるシンボル列をBNF記法で表せ」という意味で合っているか
・next、SMILE、HELLO、BYEはそれぞれ何を表しているのか
・scan()は何をするのか
・A()の返り値型はvoidと宣言されているのに、return 0;と書かれているのはおかしい
この回答への補足
そうなんですか、すみません。説明が足りなかったようですね。
これはC言語のプログラムをパーズできるシンボル列をBNF記法で表してくださいという意味です。
SMILE、HELLO、BYEは、enum symboltype{SMILE,HELLO,BYE,END};
のことを表しています。
nextはenum symboltype next;のことを表しています。scan()は
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#");
}
のことです。
A()の返り値型はvoidと宣言されているのに、return 0;と書かれているのはおかしいについてですが、このプログラムに関する問題が他にもあります。プログラムの中で受理できない文を探せという問題があるので
もしかしたら受理できない文なのかもしれません。これだけではわからないかもしれないので、プログラム全体を下に表示したいと思います。
#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#");
}
となっています。わかりにくい説明ですみませんm(_ _)m
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# leetcode21 1 2022/04/21 11:53
- PHP php エラー 2 2022/10/23 16:43
- Visual Basic(VBA) Changeイベントで複数セルへの貼り付けおよび値削除時に1個目のセルのみエラーになる 3 2022/12/21 09:07
- C言語・C++・C# プログラムの時、フローチャートはどうなりますか?図でお願いします。 int main(void) { 1 2022/10/01 22:45
- Visual Basic(VBA) VBAの繰り返し処理について教えてください。 3 2022/08/02 13:21
- Visual Basic(VBA) 【VBAエラー】Nextに対するForがありません 対策について 5 2022/11/21 21:26
- C言語・C++・C# C言語 leetcode21 Merge Two Sorted Lists 2 2022/04/24 19:35
- Visual Basic(VBA) マクロ実行時、自動で背景色を変えたい。 C列にあるチェックボックスをチェックするとB列に「TRUE」 4 2022/11/08 11:14
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
首吊りどこ締めるの
-
至急!尿検査前日にオナニーし...
-
エクセルでエラーが出て困って...
-
納豆食べた後の尿の納豆臭は何故?
-
中出しをするとお腹が痛い・・・。
-
検便についてです。 便は取れた...
-
白血球が多いとどんな心配があ...
-
尿検査の前日は自慰控えたほう...
-
勃起する時って痛いんですか? ...
-
値が入っているときだけ計算結...
-
彼女のことが好きすぎて彼女の...
-
小数点以下を繰り上げたものを...
-
これって喉仏ですか? 私は女性...
-
風俗店へ行く前のご飯
-
EXCELで条件付き書式で空白セル...
-
テスターで断線を調べる方法教...
-
精子が黄色?
-
麻疹風疹の抗体検査結果につい...
-
EXCELの条件付き書式で数式を空...
-
エクセルのラベルの値(文字列...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
首吊りどこ締めるの
-
エクセルでエラーが出て困って...
-
中出しをするとお腹が痛い・・・。
-
白血球が多いとどんな心配があ...
-
検便についてです。 便は取れた...
-
彼女のことが好きすぎて彼女の...
-
EXCELで条件付き書式で空白セル...
-
勃起する時って痛いんですか? ...
-
納豆食べた後の尿の納豆臭は何故?
-
精子が黄色?
-
至急!尿検査前日にオナニーし...
-
小数点以下を繰り上げたものを...
-
これって喉仏ですか? 私は女性...
-
値が入っているときだけ計算結...
-
口の中に黒い血の塊
-
舌の裏の痛みのないプツプツの...
-
甲状腺が腫れているが血液検査...
-
Excelで""で囲む方法
-
健否~書類の書き方~
-
リンク先のファイルを開かなく...
おすすめ情報