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
72
73
74
75
76
77
78
79
80
|
%{
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include "parser_vars.hpp"
int yylex ();
void yyerror(const char *str);
void debug(const char *format, ...);
Variables vars;
%}
%token NUM VAR END
%right '='
%left '-' '+'
%left '*' '/'
%token '(' ')'
%union {
double val;
char *var;
}
%%
app: /* empty */
| opseq
| opseq END
;
opseq: op
| opseq END op
;
op: expseq { printf("Result: %lf\n", $<val>1); }
| VAR '=' expseq {
debug("= %s %lf\n", $<var>1, $<val>3);
vars.Set($<var>1, $<val>3);
free($<var>1);
}
;
expseq: NUM { debug("NUM %lf\n", $<val>1); }
| VAR {
$<val>$ = vars.Get($<var>1);
debug("VAR %s\n", $<var>1);
free($<var>1);
}
| expseq '+' expseq { $<val>$ = $<val>1 + $<val>3; debug("+ %lf %lf\n", $<val>1, $<val>3); }
| expseq '-' expseq { $<val>$ = $<val>1 - $<val>3; debug("- %lf %lf\n", $<val>1, $<val>3); }
| expseq '*' expseq { $<val>$ = $<val>1 * $<val>3; debug("* %lf %lf\n", $<val>1, $<val>3); }
| expseq '/' expseq { $<val>$ = $<val>1 / $<val>3; debug("/ %lf %lf\n", $<val>1, $<val>3); }
| '(' expseq ')' { $<val>$ = $<val>2; debug("() %lf\n", $<val>2); }
;
%%
void debug(const char *format, ...) {
/*
va_list ap;
va_start(ap, format);
vprintf(format, ap);
va_end(ap);
*/
}
void yyerror(const char *str) {
fprintf(stderr, "error parsing input file: '%s'\n", str);
}
main() {
yyparse();
}
|