-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathattr.h
More file actions
132 lines (114 loc) · 2.32 KB
/
attr.h
File metadata and controls
132 lines (114 loc) · 2.32 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
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
#ifndef ATTR_H
#define ATTR
#define CHILDRENNUM 4
#define NAMELEN 32
#define TABLESIZE 391
#define SHIFT 4
#define MAXSTRINGLEN 512
typedef enum ValueType {
NOTYPE = 0,
BOOLTYPE = 1,
INTTYPE = 2,
}ValueType;
typedef enum SymType {
FUNCSYM=1,
MAINSYM=2,
IDSYM=3,
}SymType;
typedef struct HashNode {
char name[NAMELEN];
ValueType valuetype;
SymType symtype;
int label;
int offset;
int returnlabel;
struct HashNode *next;
}HashNode;
HashNode *gsymtable[TABLESIZE];
void init_gsymtable();
HashNode *calltable[TABLESIZE];
HashNode *lookup(HashNode **ptr, char *name);
void intsert(HashNode **table, HashNode *hashnode);
int hash(char *str);
typedef enum NodeKind {
CONSTKIND = 1,
IDKIND = 2,
EXPKIND = 3,
PRINTKIND = 4, // stmt
ASSIGNKIND = 5, // stmt
STMTKIND = 6,
VARDECLKIND = 7,
MAINKIND = 8,
FUNCKIND = 9,
PROGRAMKIND = 10,
IFKIND = 11, // stmt
IFELSEKIND = 12, // stmt
WHILEKIND = 13, // stmt
FORKIND = 14, // stmt
PARAMKIND = 15,
ARGSKIND = 16,
CALLKIND = 17,
RETURNKIND = 18, // stmt
}NodeKind;
typedef enum OpKind {
NOTK = 0,
ADDK = 1,
MINUSK = 2,
MULK = 3,
DIVK = 4,
ANDK = 5,
ORK = 6,
XORK = 7,
LTK = 8,
LEK = 9,
EQK = 10,
NEQK = 11,
GEK = 12,
GTK = 13
}OpKind;
typedef struct Token {
char name[NAMELEN];
NodeKind nodekind;
ValueType valuetype;
int value;
}Token;
typedef struct Node {
NodeKind nodekind;
// IDKIND MAINKIND FUNCKIND
char name[NAMELEN];
// CONSTKIND
int value;
// CONSTKIND, IDKIND, EXPKIND, ASSIGNKIND, VARDECLKIND, FUNCKIND
ValueType valuetype;
// EXPKIND
OpKind opkind;
// FUNCKIND and MAINKIND
int label;
int returnlabel;
int param_num;
int decl_num;
//FUNCKIND, MAINKIND
HashNode *symtable[TABLESIZE];
// debug infomation
char info[MAXSTRINGLEN];
struct Node *next;
int childrennum;
struct Node *children[CHILDRENNUM];
}Node;
extern Node *gast;
Node *getnewnode();
Node *gettailnode(Node *node);
void printast(Node *ast);
void build_symtable(Node *ast);
void print_symtable(Node *ast);
void set_idtype(Node *ast);
void set_expidtype(HashNode **symtable, Node *exp);
void set_stmttype(HashNode **symtable, Node *stmt);
void typecheck(Node *ast);
void typecheck_stmt(Node *stmt);
void typecheck_exp(Node *exp);
void print_gsymtable();
void gencode(Node *ast);
int gencode_exp(Node *exp, Node *funcnode);
void gencode_stmt(Node *stmt, Node *funcnode);
#endif