-
Notifications
You must be signed in to change notification settings - Fork 0
/
rvcc.h
117 lines (102 loc) · 2.47 KB
/
rvcc.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
// 使用POSIX.1标准
// 使用了strndup函数
#define _POSIX_C_SOURCE 200809L
#include <assert.h>
#include <ctype.h>
#include <stdarg.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/**
* @brief 为终结符设置种类
*/
typedef enum TokenKind {
TK_IDENT, // 标识符
TK_PUNCT, // 符号
TK_KEYWORD, // 关键字
TK_NUM, // 整数
TK_EOF, // 文件结束
} TokenKind;
/**
* @brief 终结符结构体
*/
typedef struct Token Token;
struct Token {
TokenKind kind; // Token种类
Token *next; // 下一个Token
int val; // Token的值
char *loc; // Token的字符串位置
int len; // Token的长度
};
void error(char *fmt, ...);
void error_at(char *loc, char *fmt, ...);
void errorTok(Token *tok, char *fmt, ...);
bool equal(Token *tok, char *str);
Token *skip(Token *tok, char *str);
Token *tokenize(char *str);
/* 生成AST(抽象语法树)*/
typedef struct Obj Obj;
typedef struct Node Node;
// AST的节点种类
typedef enum NodeKind {
ND_ADD, // `+`
ND_SUB, // `-`
ND_MUL, // `*`
ND_DIV, // `/`
ND_NEG, // `-` nagetive
ND_EQ, // `==`
ND_NE, // `!=`
ND_LT, // `<`
ND_LE, // `<=`
ND_ASSIGN, // `=`
ND_IF, // `if`
ND_FOR, // `for`
ND_BLOCK, // { ... },代码块
ND_VAR, // 局部变量
ND_EXPR_STMT, // 表达式语句
ND_NUM, // 整数
ND_RETURN, // return
} NodeKind;
// AST的节点结构体
struct Node {
NodeKind kind; // 节点种类
Node *next; // 下一个节点, 用于表达式语句
Token *tok; // 节点对应的终结符
Node *lhs; // 左子节点
Node *rhs; // 右子节点
// `if`, `for`
Node *cond; // 条件表达式
Node *then; // then
Node *els; // else
Node *init; // for的初始化
Node *inc; // for的增量
Node *body; // 代码块
Obj *var; // 存储ND_VAR种类的变量
int val; // 存储ND_NUM种类的值
};
// 本地变量
struct Obj {
Obj *next; // 指向下一对象
char *name; // 变量名
int offset; // fp的偏移量
};
// 函数
typedef struct Function Function;
struct Function {
Node *body; // 函数体
Obj *locals; // 本地变量
int stack_size; // 栈大小
};
/**
* @brief 语法解析
* @param tok
* @return Node*
*/
Function *parse(Token *tok);
/* 语义分析与代码生成 */
/**
* @brief 代码生成函数
* @param node
*/
void codegen(Function *prog);