- ベストアンサー
構文解析 べき乗計算について
今、構文解析のプログラムをC言語プログラムで作成しています。 switch文で演算子別に場合分けして(case '+': ~ というような形) しているのですが、べき乗を計算するために case '^': ~ という風にすると実行した時に^を入力しても ^を認識していないのかうまく計算できていません。 そこで試しに case '~': ~ と書き換え、実行時の入力も~でやってみたところ、 うまくべき乗の計算ができていました。 これはなぜなんでしょうか? また、どうすれば^と入力してべき乗の計算ができますか? 回答よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
/* 優先順位付きで整数同士を四則演算するルーチン * ()付きの式、符号としての+、-も評価する * 「2*(3+4)-(-2+5)」も正しく11になる * 評価する文字列の中に「スペース」は入れないこと */ #include <stdlib.h> #include <stdio.h> #include <limits.h> int expr(char *buf,char **p); int expr3(char *buf,char **p) { int a; *p=buf; a=strtoul(*p,p,10); return a; } int expr2(char *buf,char **p) { int a; *p=buf; switch (**p) { case '(': a=expr(++(*p),p); if (**p==')') (*p)++; return a; case '+': return expr3(++(*p),p); case '-': return -1 * expr3(++(*p),p); } return expr3(*p,p); } int expr1(char *buf,char **p) { int a,b; *p=buf; a=expr2(*p,p); switch (**p) { case '\0': return a; case '*': b=expr1(++(*p),p); return a*b; case '/': b=expr1(++(*p),p); if (b) return a/b; return INT_MAX; } return a; } int expr(char *buf,char **p) { int a,b; *p=buf; a=expr1(*p,p); switch (**p) { case '\0': return a; case '+': b=expr(++(*p),p); return a+b; case '-': b=expr(++(*p),p); return a-b; } return a; } void main(void) { int ans; char buf[256]; char *p; scanf("%s",buf); ans=expr(buf,&p); if (*p) printf("%s以降が構文エラー\n",p); else printf("計算結果は%dです\n",ans); } これを元に、優先順位を考え、他の演算子も増やしてみて下さい。 すべての演算子を並列に処理(同じswitch文で振り分け)すると、すべて同じ優先順位になってしまうので、ご注意を。 なお、スペースのスキップはしていないので、必要であれば、適切な位置にスペースの読み飛ばしを挿入して下さい。
その他の回答 (3)
- sakusaker7
- ベストアンサー率62% (800/1280)
ひょっとしてWindowsで開発していて、入力はコマンドラインで与えるとかしてます? c:>hoge a ^ b みたいに。
- asuncion
- ベストアンサー率33% (2127/6290)
とりあえず、ソース全体を載せてください。
- Tacosan
- ベストアンサー率23% (3656/15482)
環境が分からないしプログラムがどうなっているかも分からないので何とも言えませんが, 実行時に '^' を入力したときに, '^' が入っていることは確実なんですか?
お礼
詳しい例ありがとうございます。 参考にします。