今、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.2ベストアンサー
- 回答日時:
ちょっと気になるのですが, YACC ソースで, 例えば
| Abs "(" expr ")" {$$=abs($3);}
となっているのが怪しい気がします. ひょっとして
| Abs LP expr RP {$$=abs($3);}
だったりしません?
回答どうもありがとうございます!
まさにご指摘の通りで、カッコをLP、RPに直した所無事動作しました!うれしいです。
本当にありがとうございました!
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ランキング
-
プログラム言語について。
-
C#とC++について。
-
CLispのloop内の挙動について
-
interface 2021年5月号 P46
-
VBA 電話番号の正規表現について
-
VBAでパワーシェルを実行したい...
-
vba クリップボードクリアにつ...
-
ImageMagickでgif画像の一部が...
-
Windowsのアプリ開発ってなんの...
-
プログラミングのPythonのnoteb...
-
pythonで複数画像からgifを作る...
-
ExcelVBAでFormulaR1C1を列範囲...
-
初心者powershellのPS1ファイル...
-
Google ColaboでGUI作成
-
小学1年生の子です。塾に行かせ...
-
そのまま使っただけなのに・・...
-
プログラマーと学歴の関係性に...
-
Pythonでgif画像が上手く作れない
-
windowsでテキストファイルの各...
-
プログラミング、アーキテクチ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラミング
-
小学1年生の子です。塾に行かせ...
-
vba クリップボードクリアにつ...
-
プログラマーと学歴の関係性に...
-
Webサイト内に埋め込んだmp4動...
-
正規表現で複数マッチ条件で悩...
-
windowsでテキストファイルの各...
-
楽しくて最高のプログラミング...
-
プログラミング ソースコード
-
Pythonって何を意識した言語な...
-
プログラミングを教えたいです...
-
pythonで複数画像からgifを作る...
-
pythonにてseleniumを使うも、...
-
Pythonでgif画像が上手く作れない
-
Google ColaboでGUI作成
-
テキストファイルのファイル名...
-
プログラミング、アーキテクチ...
-
そのまま使っただけなのに・・...
-
このURLで広告を出しているのは...
-
chatGPTで次々と質問をしていく...
おすすめ情報