aboutsummaryrefslogtreecommitdiff
path: root/src/parser/ast.h
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);