yaccとlexで、logや三角関数を含む電卓を作るプログラムの組み方
今、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]);
%%