-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path9cc.h
136 lines (116 loc) · 3.12 KB
/
9cc.h
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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
#include "util.h"
#include <stdbool.h>
#include <stdio.h>
/* typedef, enum, struct */
// Symbol table
typedef struct Type Type;
struct Type {
enum { INT, PTR } ty;
Type *ptr_to;
};
typedef struct SYM_TAB SYM_TAB;
struct SYM_TAB {
// Map children の中の特別な要素として parent を加えることができる
// けどそうしてない。最初にそう書いたから。何か別の理由が生まれるまで
// このままにする。
// --
// Map body の中に children を含めたい場合、 SYM_REC 構造体のメンバ
// に SYM_TAB を加えることとメンバ token の値でそれが予約語/変数名/
// 関数名のいずれかであることを切り替えるようにできるだろう。
// そうしていない理由は上の件と一緒。
SYM_TAB *parent;
Map *children;
int var_cnt;
Map *body;
};
typedef struct {
int token;
Type *ty;
int addr;
} SYM_REC;
// Tokenize
enum token_type {
TK_NUM = 256, // integer
TK_IDENT, // 識別子
TK_EQ, // '=='
TK_NE, // '!='
TK_IF, // "if"
TK_ELSE, // "else"
TK_WHILE, // "while"
TK_BREAK, // "break"
TK_CONTINUE, // "continue"
TK_RETURN, // "return"
TK_INT, // "int"
TK_SIZEOF, // "sizeof"
TK_EOF, // end of file
};
typedef struct {
int ty; // type of token
int val; // ty が TK_NUM の場合のその値
char *name; // ty が TK_IDENT の場合その名前
} Token;
// Abstract Syntax Node
enum node_type {
ND_EQ = 256, // '=='
ND_NE, // '!='
ND_UNARY_MINUS, // unary operator '-'
ND_ADDRESS_OF, // address-of operator '&'
ND_DEREFERENCE, // pointer dereference '*'
ND_NUM, // 整数
ND_IDENT, // 識別子
ND_FUNC_CALL, // function call
ND_COMP_STMT, // compound statement
ND_VAR_DEF, // variable definition
ND_IF, // if statement
ND_WHILE, // while statement
ND_BREAK, // break statement
ND_CONTINUE, // continue statement
ND_RETURN, // return statement
ND_FUNC_DEF, // function definition
ND_SIZEOF, // 'sizeof'
};
typedef struct Node Node;
struct Node {
int ty; // node_type(ND_EQ, ND_NE, ... , ND_FUNC_DEF)
Type *c_ty; // type of c
char *name;
int val;
Node *lhs; // Left Hand Side or unary operators operand.
Node *rhs; // Right Hand Side
Vector *stmts; // compound statements
Node *cond;
Node *then;
Node *els;
Node *body;
// For break/continue
Node *target;
char *label_head;
char *label_tail;
// Function definition
Vector *params;
// Function call
Vector *args;
};
/* Functions */
void init();
Vector *tokenize(char *);
Vector *parse(Vector *);
void sema(Vector *);
void gen_x86(Vector *);
// Node
Node *new_node(int, Node *, Node *);
Node *new_node_num(int);
Node *new_node_id(char *name);
// Symbol
SYM_TAB *append_sym_tab(char *);
void entry_reserved(char *, int);
void entry_var(char *, Type *);
SYM_REC *query_reserved(char *);
SYM_REC *query_var(char *);
// debug.c
void p_tree(Node *);
// symbol_test.c
void run_symbol_test();
void run_pointer_test();
/* Variables */
extern SYM_TAB *sym_tab;