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
|
#include "stmt.h"
#include "call.h"
#include "fn.h"
#include "parse.h"
#include "prv.h"
#include "display.h"
#include "exit.h"
#include "set.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;
}
}
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);
}
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[] =
{
{(const struct step[]){
{ID, "display"}, {ANY, NULL, 1}, {ID, "etc"}, {0}}, .fn = display},
{(const struct step[])
{{ID, "display"}, {ANY, NULL, 1}, {0}}, .fn = display},
{(const struct step[]){{ID, "exit"}, {0}}, .fn = s_exit},
{(const struct step[]){{ID, "set"}, {0}}, .fn = set},
{(const struct step[]){{ID, "call"}, {0}}, .fn = call},
{0}
};
|