今、yaccとlexで、logや三角関数を含む電卓を作るプログラムを作成しています。四則演算は実装できました。パイも実装できました。しかしlogや三角関数sin,cos,tanやabs,expなどがどうしても実装できません。以下のプログラムをlinux上のターミナルで実行しsin(90)やlog(90)どと入力しても、sintax errorと返されてしまいます。ちなみに実行時は-lmオプションは付けています。どうしたらこれらが実装できるのでしょうか。ご教授願えると幸いです。
■yaccの.yファイル■
%{
#define YYSTYPE double
#define PAICONST 3.14159265358979
#include <stdio.h>
#include <math.h>
double mcon=PAICONST/180.0;
%}
%token NL NUM LP RP END
%left ADD SUB
%left MUL DIV
%left Pai Abs Sqrt Sin Cos Tan Log Exp NEG
%%
s : list
;
list : /* empty */
| list expr NL { printf ("result: %lf\n", $2);}
| list END { return;}
;
expr: expr ADD expr {$$ = $1 + $3;}
| expr SUB expr {$$ = $1 - $3;}
| expr MUL expr {$$ = $1 * $3;}
| expr DIV expr {$$ = $1 / $3;}
| SUB expr %prec NEG {$$ = -$2;}
| LP expr RP {$$ = $2;}
| NUM {$$ = $1;}
| Pai {$$=PAICONST;}
| Abs "(" expr ")"{$$=abs($3);}
| Sqrt "(" expr ")"{$$=sqrt($3);}
| Sin "(" expr ")" {$$=sin($3*mcon);}
| Cos "(" expr ")" {$$=cos($3*mcon);}
| Tan "(" expr ")" {$$=tan($3*mcon);}
| Log "(" expr ")" {$$=log($3);}
| Exp "(" expr ")" {$$=exp($3);}
;
%%
yyerror(s) char *s; { printf ("%s\n",s);}
main() {
yyparse();
}
#include "lex.yy.c"
■lexの.lファイル■
%{
#include <math.h>
#include <ctype.h>
%}
%%
"+" return (ADD);
"-" return (SUB);
"*" return (MUL);
"/" return (DIV);
"(" return (LP);
")" return (RP);
"." return (END);
(pai|PAI) return(Pai);
(abs|ABS) return(Abs);
(sqrt|SQRT) return(Sqrt);
(sin|SIN) return(Sin);
(cos|COS) return(Cos);
(tan|TAN) return(Tan);
(log|LOG) return(Log);
(exp|EXP) return(Exp);
[0-9]+\.[0-9]*|[0-9]+{
sscanf (yytext, "%lf", &yylval); return (NUM);
}
[ \t] ;
^\n return (END);
\n return (NL);
. return (yytext[0]);
%%
No.4
- 回答日時:
そうだ, ついでに 1点.
「π」は英語では pi と綴ります.
なるほど・・・、勉強になります!
Tacosanさんには本当にお世話になりました。
これにて締め切りとさせていたがきます。
皆様どうもありがとうございました!
No.3
- 回答日時:
syntax error が出てるからおかしいなぁと思ったんだけど, やっぱりね.
レクサで ( や ) を LP/RP に置き換えてるので, パーザが (/) を受け取れないんです.
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- 数学 回答者どもがなかなか答えられないようなので、考えてみました。 ∫[0,π/2]log(sinx)/( 4 2022/08/31 16:30
- C言語・C++・C# c言語でユーザ関数を利用して複素数のべき乗と絶対値の数列を計算するプログラムが作りたいです。 3 2023/01/29 22:13
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# C言語のマクローリン展開ローラン展開のコードについて 3 2022/12/15 14:45
- C言語・C++・C# プログラミングのペーパーテスト 実行結果を表示せよ #include <stdio.h> int h 1 2022/07/09 15:27
- JavaScript アップロードファイルの種類によって処理を分岐させたいのですが書き方が分からずアドバイスお願いします 4 2023/06/17 19:12
- C言語・C++・C# C++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。 2 2023/06/09 11:17
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
プログラミング、アーキテクチ...
-
Windowsのアプリ開発ってなんの...
-
Webプログラムってネイティブア...
-
vba クリップボードクリアにつ...
-
スカラーのベクトル微分
-
HTMLソースが表示のページのも...
-
このURLで広告を出しているのは...
-
ボールの動きがスムーズに動い...
-
ハッシュテーブル(連想配列)が...
-
pythonにてseleniumを使うも、...
-
ものづくりに向いているプログ...
-
Gitで空白のみの変更を削除した...
-
パイソン。スクレイピング。Chr...
-
シェルのSTEP数について教えて...
-
IT業界より楽に稼げる業界って...
-
pythonの条件分岐(if)
-
そのまま使っただけなのに・・...
-
フォルダを自動作成・移動を複...
-
python subprocessに関する質問
-
Python - Excel で Webからデー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
python の 連鎖代入の文法
-
IT業界より楽に稼げる業界って...
-
ものづくりに向いているプログ...
-
プログラムの素朴な質問です 分...
-
このURLで広告を出しているのは...
-
Pythonでターミナルに文字を出...
-
LCD ディスプレイを Raspberry ...
-
ホワイトハッカー
-
強化学習の環境作成、AI。自動...
-
https://paiza.jp/challenges/5...
-
フォルダを自動作成・移動を複...
-
VBAのサブルーチンとプロシージ...
-
プログラミングで例えばゲーム...
-
gpogletramsについてコマンドプ...
-
【ChatGPT】皆さんの人とは変わ...
-
batファイル、コマンドプロンプ...
-
バッチファイルについて
-
Webアプリや業務アプリのデータ...
-
AI(人口知能)とは
-
Pythonのre.split()の正規表現...
おすすめ情報