• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C言語からBNFに変更したいのですが・・)

C言語からBNFに変更する方法

このQ&Aのポイント
  • C言語のコードをBNF形式に変換したい場合、特定の部分を変更する必要があります。
  • コードの一部をBNFに変換する際、一貫した規則を適用する必要があります。
  • 提供されたコードの部分をBNFに変換する場合、<A>と<B>の相互参照などの規則を考慮する必要があります。

質問者が選んだベストアンサー

  • ベストアンサー
  • salsberry
  • ベストアンサー率69% (495/711)
回答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()で失敗する なので、このプログラムでパーズできるシンボル列はありません。

k1234
質問者

お礼

そうなのですか、ありがとうございます^^ 参考にさせて、問題を解いてみます。

その他の回答 (1)

  • salsberry
  • ベストアンサー率69% (495/711)
回答No.1

質問に書いてある内容だけでは、答えられる人はいないと思います。 ・「C言語からBNFに変更したい」とか「C言語の問題からBNFにする」というのは、「このC言語のプログラムがパーズできるシンボル列をBNF記法で表せ」という意味で合っているか ・next、SMILE、HELLO、BYEはそれぞれ何を表しているのか ・scan()は何をするのか ・A()の返り値型はvoidと宣言されているのに、return 0;と書かれているのはおかしい

k1234
質問者

補足

そうなんですか、すみません。説明が足りなかったようですね。 これは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