blob: 4604e1ac8c0846a417b3ee48385d0481243b4766 (
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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
|
#pragma once
#include <stddef.h>
#include <stdbool.h>
#include "lexer/lexer.h"
struct ConstDecl
{
struct Token name;
struct Token value;
};
struct DataDecl
{
struct Token name;
struct Token value;
};
struct Param
{
struct Token name;
struct Token reg;
};
enum StatementKind
{
STATEMENT_ASSIGN,
STATEMENT_LABEL,
STATEMENT_GOTO,
STATEMENT_SYSCALL,
};
struct AssignStatement
{
bool target_deref;
struct Token target;
struct Token op;
struct Token value;
};
struct LabelStatement
{
struct Token name;
};
struct GotoStatement
{
struct Token label;
};
struct Statement
{
enum StatementKind kind;
union
{
struct AssignStatement assign;
struct LabelStatement label;
struct GotoStatement jump;
};
};
struct ProcDecl
{
struct Token name;
struct Param* params;
size_t param_count;
size_t param_capacity;
struct Statement* body;
size_t body_count;
size_t body_capacity;
};
struct Program
{
struct ConstDecl* consts;
size_t const_count;
size_t const_capacity;
struct DataDecl* data_decls;
size_t data_count;
size_t data_capacity;
struct ProcDecl* procs;
size_t proc_count;
size_t proc_capacity;
};
struct Program create_program(void);
void free_program(struct Program* program);
void add_const(struct Program* program, struct ConstDecl decl);
void add_data(struct Program* program, struct DataDecl decl);
struct ProcDecl create_proc(void);
void add_param(struct ProcDecl* proc, struct Param param);
void add_statement(struct ProcDecl* proc, struct Statement statement);
void add_proc(struct Program* program, struct ProcDecl decl);
|