-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathnodegen.c
More file actions
65 lines (60 loc) · 1.51 KB
/
nodegen.c
File metadata and controls
65 lines (60 loc) · 1.51 KB
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
#include "smc.h"
// 抽象構造木の演算子の部分を作る
Node *new_node(NodeKind kind, Node *lhs, Node *rhs){
Node *node = calloc(1, sizeof(Node));
node->kind = kind;
node->lhs = lhs;
node->rhs = rhs;
return node;
}
Node *new_node_ident(void){
Node *node = calloc(1, sizeof(Node));
node->kind = ND_LVAR;
LVar *lvar = find_lvar(token);
if (lvar){
node->offset = lvar->offset;
}else{
error_at(token->str, "宣言されていない変数が使われました");
}
token = token->next;
return node;
}
Node *new_node_identdef(void){
Node *node = calloc(1, sizeof(Node));
node->kind = ND_LVARDEF;
LVar *lvar = calloc(1, sizeof(LVar));
lvar->type = calloc(1, sizeof(Type));
Type *temp = lvar->type;
while (consume("*")){
temp->ty = PTR;
temp->ptr_to = calloc(1, sizeof(Type));
temp = temp->ptr_to;
fprintf(stderr, "*がconsumeされました\n");
}
temp->ty = INT;
lvar->prev = locals;
locals->next = lvar;
lvar->next = NULL;
lvar->name = token->str;
lvar->len = token->len;
lvar->offset = locals->offset + 8;
node->offset = lvar->offset;
locals = lvar;
token = token->next;
return node;
}
Node *new_node_func(void){
Node *node = calloc(1, sizeof(Node));
node->kind = ND_FUNCDEF;
node->funcname = calloc((token->len + 1), sizeof(char));
strncpy(node->funcname, token->str, token->len);
token = token->next;
return node;
}
// 抽象構造木の数字の部分を作る
Node *new_node_num(int val){
Node *node = calloc(1, sizeof(Node));
node->kind = ND_NUM;
node->val = val;
return node;
}