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
|
/*
* Implementation of functions used to build the abstract syntax tree.
*/
#include "LuaSL_parser_param.h"
#include "LuaSL_yaccer.tab.h"
#include <stdlib.h>
/**
* @brief Allocates space for expression
* @return The expression or NULL if not enough memory
*/
static SExpression* newExpression(EOperationType type, SExpression *left, SExpression *right, int value)
{
SExpression* b = malloc(sizeof *b);
if (b == NULL) return NULL;
b->type = type;
b->value = value;
b->left = left;
b->right = right;
return b;
}
SExpression* createNumber(int value)
{
return newExpression(eVALUE, NULL, NULL, value);
}
SExpression *createOperation(EOperationType type, SExpression *left, SExpression *right)
{
return newExpression(type, left, right, 0);
}
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;
}
}
void deleteExpression(SExpression *b)
{
if (b == NULL) return;
deleteExpression(b->left);
deleteExpression(b->right);
free(b);
}
SExpression *getAST(const char *expr)
{
SParserParam p;
YY_BUFFER_STATE state;
p.expression = NULL;
if (yylex_init(&(p.scanner)))
return NULL;
state = yy_scan_string(expr, p.scanner);
if (yyparse(&p))
return NULL;
yy_delete_buffer(state, p.scanner);
yylex_destroy(p.scanner);
return p.expression;
}
int yyerror(const char *msg)
{
fprintf(stderr,"Error:%s\n",msg); return 0;
}
|