-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathexp.y
71 lines (54 loc) · 1.82 KB
/
exp.y
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
%{
#define YYSTYPE double
#include "define.h"
float yyanswer;
int yy_indx;
extern std::vector<DATASET_INFO> expSet;
int yyerror(char *s)
{
fprintf(stderr, "%s\n", s);
return(0);
}
extern "C" int yylex ();
%}
%token NUMBER
%token VARIABLE
%token PLUS MINUS TIMES DIVIDE POWER
%token LEFT_PARENTHESIS RIGHT_PARENTHESIS
%token SQRT LN LOG EXP SIN COS TAN ABS
%token END
%left PLUS MINUS
%left TIMES DIVIDE
%left NEG
%right POWER
%start Input
%%
Input:
/* Empty */
| Line Input
;
Line:
END
| Expression END { yyanswer = $1; }
| error END { yyerrok; }
;
Expression:
NUMBER { $$=$1; }
| VARIABLE { $$=expSet[(int)$1].data[yy_indx]; }
| Expression PLUS Expression { $$=$1+$3; }
| Expression MINUS Expression { $$=$1-$3; }
| Expression TIMES Expression { $$=$1*$3; }
| Expression DIVIDE Expression { $$=$1/$3; }
| MINUS Expression %prec NEG { $$=-$2; }
| Expression POWER Expression { $$=pow($1,$3); }
| SQRT LEFT_PARENTHESIS Expression RIGHT_PARENTHESIS { $$ = sqrt($3); }
| LN LEFT_PARENTHESIS Expression RIGHT_PARENTHESIS { $$ = log($3); }
| LOG LEFT_PARENTHESIS Expression RIGHT_PARENTHESIS { $$ = log10($3); }
| EXP LEFT_PARENTHESIS Expression RIGHT_PARENTHESIS { $$ = exp($3); }
| SIN LEFT_PARENTHESIS Expression RIGHT_PARENTHESIS { $$ = sin($3); }
| COS LEFT_PARENTHESIS Expression RIGHT_PARENTHESIS { $$ = cos($3); }
| TAN LEFT_PARENTHESIS Expression RIGHT_PARENTHESIS { $$ = tan($3); }
| ABS LEFT_PARENTHESIS Expression RIGHT_PARENTHESIS { $$ = fabs($3); }
| LEFT_PARENTHESIS Expression RIGHT_PARENTHESIS { $$=$2; }
;
%%