aboutsummaryrefslogtreecommitdiff
path: root/stmt.c
blob: 8d2fdd470c8be5daa6b352807d8df3dab85832e4 (plain) (blame)
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
87
88
89
90
91
92
#include "stmt.h"
#include "call.h"
#include "fn.h"
#include "from.h"
#include "parse.h"
#include "prv.h"
#include "display.h"
#include "exit.h"
#include "set.h"
#include "warn.h"

void stmt_free(struct stmt *s)
{
    switch (s->type)
    {
    case DISPLAY:
        display_free(&s->u.display);
        break;
    case SET:
        set_free(&s->u.set);
        break;
    case CALL:
        call_free(&s->u.call);
        break;
    case WARN:
        warn_free(&s->u.warn);
        break;
    case FROM:
        from_free(&s->u.from);
        break;
    case END:
        end_free(&s->u.end);
        break;
    }
}

int stmt_cgen(const struct stmt *s, struct cgen *c)
{
    switch (s->type)
    {
    case DISPLAY:
        return display_cgen(&s->u.display, c);
    case SET:
        return set_cgen(&s->u.set, c);
    case CALL:
        return call_cgen(&s->u.call, c);
    case WARN:
        return warn_cgen(&s->u.warn, c);
    case FROM:
        return from_cgen(&s->u.from, c);
    case END:
        return end_cgen(&s->u.end, c);
    }

    fprintf(stderr, "%s: unreachable\n", __func__);
    return -1;
}

struct stmt *stmt_cur(const struct prv *p)
{
    const struct fn *fn = fn_cur(p);

    return &fn->stmts[fn->nstmts - 1];
}

const struct seq stmts[] =
{
    {(struct step[]){
        {ID, "display"}, {ANY, NULL, 1}, {ID, "etc"}, {0}}, .fn = display},
    {(struct step[])
        {{ID, "display"}, {ANY, NULL, 1}, {0}}, .fn = display},
    {(struct step[]){
        {ID, "warn"}, {ANY, NULL, 1}, {ID, "etc"}, {0}}, .fn = warn},
    {(struct step[])
        {{ID, "warn"}, {ANY, NULL, 1}, {0}}, .fn = warn},
    {(struct step[])
        {{ID, "from"}, {ANY}, {ID, "to"}, {ANY}, {ID, "using"}, {ID},
            {ID, "by"}, {ANY}, {0}}, .fn = from_idby},
    {(struct step[])
        {{ID, "from"}, {ANY}, {ID, "to"}, {ANY}, {ID, "by"}, {ANY}, {0}},
            .fn = from_by},
    {(struct step[])
        {{ID, "from"}, {ANY}, {ID, "to"}, {ANY}, {ID, "using"}, {ID}, {0}},
            .fn = from_id},
    {(struct step[])
        {{ID, "from"}, {ANY}, {ID, "to"}, {ANY}, {0}}, .fn = from},
    {(struct step[]){{ID, "exit"}, {0}}, .fn = s_exit},
    {(struct step[]){{ID, "set"}, {0}}, .fn = set},
    {(struct step[]){{ID, "call"}, {0}}, .fn = call},
    {(struct step[]){{ID, "end"}, {0}}, .fn = end},
    {0}
};