• 締切済み

プログラミングについての質問です。

プログラミングについての質問です。 できるだけ早めの解答をお待ちしてます。 次の構文をC言語として表したいのですが、一応作っては見たもののできません。 1.S→E<A4> 2.E→TX 3.X→+<A1>T<A2>X 4.X→ε 5.T→FY 6.Y→*<A1>F<A2>Y 7.Y→ε 8.F→-<A1>F<A2>Y 9.F→I<A1> 10.F→(E) 11.I→a|b|c|d|e A1はスタック上に項目を挿入するという動作。 A2はスタックから3つの項目を除去し、それらを'='と次に割り当てられる4つ組とともに印刷し、この整数をスタックにおくという動作。 A3はスタックから2つの項目を除去し、それらを'='と次に割り当てられる4つ組とともに印刷し、この整数をスタックにおくという動作。 A4はスタックから1つの項目を除去する。 #include<stdio.h> #include<string.h> intmain(void) { charsymbol[10][10]; inti=0,j,k=0; printf("Inputsymbol:"); while(1) {scanf("%s",symbol[i]); if(strcmp(symbol[i],"_")==0) {i--;break;} i++;} printf("symbol="); for(j=0;j<=i;j++) {printf("%s",symbol[j]);} printf("¥n"); gotoS; S: if(strcmp(symbol[k],"a"|"b"|"c"|"d"|"e")==0) {gotoE;return;} elseif(strcmp(symbol[k],"-")==0) {gotoE;return;} elseif(strcmp(symbol[k],"(")==0) {gotoE;return;} else {gotoerror;} E: if(strcmp(symbol[k],"a"|"b"|"c"|"d"|"e")==0) {gotoT;gotoX;return;} elseif(strcmp(symbol[k],"-")==0) {gotoT;gotoX;return;} elseif(strcmp(symbol[k],"(")==0) {gotoT;gotoX;return;} else {gotoerror;} X: if(strcmp(symbol[k],"+")==0) {k++;gotoT;gotoX;return;} else {if(strcmp(symbol[k],"_")!=0) {gotoerror;} elseif(strcmp(symbol[k],")")!=0) {gotoerror;} } T: if(strcmp(symbol[k],"a"|"b"|"c"|"d"|"e")==0) {gotoF;gotoY;return;} elseif(strcmp(symbol[k],"-")==0) {gotoF;gotoY;return;} elseif(strcmp(symbol[k],"(")==0) {gotoF;gotoY;return;} else {gotoerror;} Y: if(strcmp(symbol[k],"*")==0) {k++;gotoF;gotoY;return;} elseif(strcmp(symbol[k],"_")==0) {gotoerror;} elseif(strcmp(symbol[k],")")==0) {gotoerror;} elseif(strcmp(symbol[k],"+")==0) {gotoerror;} I: if(strcmp(symbol[k],"a"|"b"|"c"|"d"|"e")==0) {k++; } elsegotoerror; F: if(strcmp(symbol[k],"-")==0) {k++;gotoF; } else if(strcmp(symbol[k],"a"|"b"|"c"|"d"|"e")==0) {gotoI;} else {if(strcmp(symbol[k],"(")==0) {k++;gotoE; if(strcmp(symbol[k],")")!=0) gotoerror;} elsegotoerror;} error: printf("No¥n"); exit(1); 制限字数の関係でプログラムを削ったりしています。 見にくくてすみません。 御指導よろしくお願いします。

みんなの回答

  • siffon9
  • ベストアンサー率64% (136/211)
回答No.2

構文はともかくA1~A4の説明が良く解りませんね。 > A1はスタック上に項目を挿入するという動作。 ・挿入する「項目」が不明。何を挿入するの? ・「挿入」というのは、スタックのトップに積むという意味ですか? > A2はスタックから3つの項目を除去し、それらを'='と次に割り当てられる4つ組とともに印刷し、この整数をスタックにおくという動作。 ・「'='と次に割り当てられる4つ組」が意味不明 ・「この整数」って何? ・「スタックにおく」と「スタック上に(項目を)挿入する」は同じ意味ですか? > A3はスタックから2つの項目を除去し、 ・A3が構文にありません あとプログラムは、各構文をラベルとgoto文で表現されていますが、関数にしたほうが良いのではないでしょうか。というかreturn文があるのは、関数を意図しているような気がするのですが。 1.S→E<A4> だったら void parse_S(){ parse_E(); /* 構文Eの処理 */ exec_A4(); /* <A4>の処理 */ return; } みたいな感じ?

すると、全ての回答が全文表示されます。
回答No.1

構文の意味がさっぱりわからないので、ロジック面はパスします。 とりあえずソースを見て気になったところ…… まず、ソースがごちゃごちゃしてわかりにくくなるだけなので、gotoは使わずに関数化しましょう。 > if(strcmp(symbol[k],"a"|"b"|"c"|"d"|"e")==0)  こんなこと書いてもsymbol[k]が"a"~"e"のいずれかかどうかなんて判定はできません。  ・strcmpの文字列比較は1個ずつ  ・比較文字をORするのじゃなく、比較結果をORしましょう。 > {gotoE;return;}  gotoで飛んだら戻ってこないので、その後のreturnは無意味です。 > {gotoT;gotoX;return;}  同様にgoto X以降は絶対に通りません。

すると、全ての回答が全文表示されます。

関連するQ&A