2 #include <stdio.h> /* for printf() */
3 #include <stdlib.h> /* for strtod() */
5 #include <math.h> /* for pow() */
10 void yyerror(const char *);
18 %left NEG
/* negation: unary minus */
19 %right
'^' /* exponentation */
23 line: exp
{ yyreturn
= $1; }
27 | exp
'+' exp
{ $$
= $1 + $3; }
28 | exp
'-' exp
{ $$
= $1 - $3; }
29 | exp
'*' exp
{ $$
= $1 * $3; }
30 | exp
'/' exp
{ $$
= $1 / $3; }
31 |
'-' exp %prec NEG
{ $$
= -$2; }
32 | exp
'^' exp
{ $$
= pow
($1, $3); }
33 |
'(' exp
')' { $$
= $2; }
38 /*#define EXPRESSION_VERBOSE*/
40 static const char *yydata
;
42 int parse_expression
(const char *data
, double *d
) {
45 #ifdef EXPRESSION_VERBOSE
46 printf
("%s = ", data
);
50 #ifdef EXPRESSION_VERBOSE
60 #ifdef EXPRESSION_VERBOSE
61 printf
("%f\n", yyreturn
);
70 while
(isspace
(*yydata
)) yydata
++;
72 if
(!*yydata
) return
0;
74 if
(isdigit
(*yydata
) ||
*yydata
== '.') {
75 yylval = strtod
(yydata
, &p
);
76 if
(p
== yydata
) return
0;
79 while
(isspace
(*yydata
)) yydata
++;
87 void yyerror(const char *s
) {
88 fprintf
(stderr
, "%s: \"%s\"\n", s
, yydata
);