aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/LuaSL/src/LuaSL_LSL_tree.c
blob: 7cebecc506af58d2e39c895b6c6c16b713089bd7 (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
/*
 * Implementation of functions used to build the abstract syntax tree.
 */

#include "LuaSL_LSL_tree.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;
}