blob: 9e1d3ca1572d5cefb0fd5fd8c1df157b10f70de5 (
plain)
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
81
82
83
84
85
86
|
#include "LuaSL_parser_param.h"
#include "LuaSL_yaccer.tab.h"
int yyparse(void *param);
static int initParserParam(SParserParam* param)
{
int ret = 0;
ret = yylex_init(¶m->scanner);
param->expression = NULL;
return ret;
}
static int destroyParserParam(SParserParam* param)
{
return yylex_destroy(param->scanner);
}
SExpression *getAST(const char *expr)
{
SParserParam p;
YY_BUFFER_STATE state;
if ( initParserParam(&p) )
{
// couldn't initialize
return NULL;
}
state = yy_scan_string(expr, p.scanner);
if ( yyparse(&p) )
{
// error parsing
return NULL;
}
yy_delete_buffer(state, p.scanner);
destroyParserParam(&p);
return p.expression;
}
int evaluate(SExpression *e)
{
switch(e->type)
{
case eVALUE:
return e->value;
case eMULTIPLY:
return evaluate(e->left) * evaluate(e->right);
case ePLUS:
return evaluate(e->left) + evaluate(e->right);
default:
// shouldn't be here
return 0;
}
}
int yyerror(const char *msg)
{
fprintf(stderr,"Error:%s\n",msg); return 0;
}
int main(void)
{
SExpression *e = NULL;
char test[]=" 4 + 2*10 + 3*( 5 + 1 )";
int result = 0;
e = getAST(test);
result = evaluate(e);
printf("Result of '%s' is %d\n", test, result);
deleteExpression(e);
return 0;
}
|