-
Notifications
You must be signed in to change notification settings - Fork 0
/
50cc.h
133 lines (118 loc) · 1.92 KB
/
50cc.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
#include <ctype.h>
#include <stdarg.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// tokenize
typedef enum {
TK_RESERVED,
TK_NUM,
TK_IDENT,
TK_RETURN,
TK_IF,
TK_ELSE,
TK_WHILE,
TK_FOR,
TK_TYPE,
TK_EOF
} TokenKind;
typedef struct Token Token;
struct Token {
TokenKind kind;
Token *next;
int val;
char *str;
int len;
};
extern Token *token;
extern char *user_input;
void error(char *fmt, ...);
void error_at(char *loc, char *fmt, ...);
bool consume(char *op);
Token *consume_ident();
bool consume_return();
bool consume_if();
bool consume_else();
bool consume_while();
bool consume_for();
bool consume_type();
void expect(char *op);
int expect_number();
bool at_eof();
bool startswith(char *p, char *q);
Token *new_token(TokenKind kind, Token *cur, char *str, int len);
Token *tokenize();
typedef struct Type Type;
struct Type {
enum { INT, PTR } ty;
struct Type *ptr_to;
};
typedef enum {
ND_ADD,
ND_SUB,
ND_MUL,
ND_DIV,
ND_NUM,
ND_EQ,
ND_NE,
ND_LT,
ND_LE,
ND_ASSIGN,
ND_LVAR,
ND_RETURN,
ND_IF,
ND_ELSE,
ND_WHILE,
ND_FOR,
ND_FOR_LEFT,
ND_FOR_RIGHT,
ND_BLOCK,
ND_FUNC_CALL,
ND_FUNC_DEF,
ND_ADDR,
ND_DEREF
} NodeKind;
typedef struct Node Node;
struct Node {
NodeKind kind;
Node *lhs;
Node *rhs;
Node *els;
Node **block;
char *funcname;
Node **args;
int len;
int val;
int offset;
Type *type;
};
extern Node *code[];
void program();
Node *func();
Node *stmt();
Node *assign();
Node *expr();
Node *equality();
Node *relational();
Node *add();
Node *mul();
Node *unary();
Node *primary();
Node *define_variable();
Node *variable();
Node *new_node(NodeKind kind, Node *lhs, Node *rhs);
Node *new_node_num(int val);
// gen
void gen_lval(Node *node);
void gen(Node *node);
typedef struct LVar LVar;
struct LVar {
LVar *next;
char *name;
int len;
int offset;
Type *type;
};
extern LVar *locals[];
extern int cur_func;