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}
};
|