-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.c
76 lines (61 loc) · 1.76 KB
/
main.c
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
#include "rvcc.h"
// 目标文件的路径
static char *OptO;
// 输入文件的路径
static char *InputPath;
// 输出程序的使用说明
static void usage(int Status) {
fprintf(stderr, "rvcc [ -o <path> ] <file>\n");
exit(Status);
}
// 解析传入程序的参数
static void parseArgs(int Argc, char **Argv) {
// 遍历所有传入程序的参数
for (int I = 1; I < Argc; I++) {
// 如果存在help,则直接显示用法说明
if (!strcmp(Argv[I], "--help")) usage(0);
// 解析-o XXX的参数
if (!strcmp(Argv[I], "-o")) {
// 不存在目标文件则报错
if (!Argv[++I]) usage(1);
// 目标文件的路径
OptO = Argv[I];
continue;
}
// 解析-oXXX的参数
if (!strncmp(Argv[I], "-o", 2)) {
// 目标文件的路径
OptO = Argv[I] + 2;
continue;
}
// 解析为-的参数
if (Argv[I][0] == '-' && Argv[I][1] != '\0')
error("unknown argument: %s", Argv[I]);
// 其他情况则匹配为输入文件
InputPath = Argv[I];
}
// 不存在输入文件时报错
if (!InputPath) error("no input files");
}
// 打开需要写入的文件
static FILE *openFile(char *Path) {
if (!Path || strcmp(Path, "-") == 0) return stdout;
// 以写入模式打开文件
FILE *Out = fopen(Path, "w");
if (!Out) error("cannot open output file: %s: %s", Path, strerror(errno));
return Out;
}
int main(int Argc, char **Argv) {
// 解析传入程序的参数
parseArgs(Argc, Argv);
// 解析文件,生成终结符流
Token *Tok = tokenizeFile(InputPath);
// 解析终结符流
Obj *Prog = parse(Tok);
// 生成代码
FILE *Out = openFile(OptO);
// .file 文件编号 文件名
fprintf(Out, ".file 1 \"%s\"\n", InputPath);
codegen(Prog, Out);
return 0;
}