Skip to content

Commit ccfd463

Browse files
committedFeb 16, 2023
revised error function
1 parent 1906d1d commit ccfd463

File tree

2 files changed

+13
-6
lines changed

2 files changed

+13
-6
lines changed
 

‎9cc

56 Bytes
Binary file not shown.

‎9cc.c

+13-6
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,19 @@ struct Token {
2424

2525
// 現在着目しているトークン
2626
Token *token;
27+
char *user_input;
2728

2829
// エラーを報告するための関数
2930
// printfと同じ引数を取る
30-
void error(char *fmt, ...) {
31+
void error_at(char *loc, char *fmt, ...) {
3132
va_list ap;
3233
va_start(ap, fmt);
33-
vfprintf(stderr, fmt, ap);
34+
35+
int pos = loc - user_input;
36+
fprintf(stderr, "%s\n", user_input);
37+
fprintf(stderr, "%*s", pos, " ");
38+
fprintf(stderr, "^ ");
39+
fprintf(stderr, fmt, ap);
3440
fprintf(stderr, "\n");
3541
exit(1);
3642
}
@@ -48,15 +54,15 @@ bool consume(char op) {
4854
// それ以外の場合にはエラーを報告する。
4955
void expect(char op) {
5056
if (token->kind != TK_RESERVED || token->str[0] != op)
51-
error("'%c'ではありません", op);
57+
error_at(token->str, "'%c'ではありません", op);
5258
token = token->next;
5359
}
5460

5561
// 次のトークンが数値の場合、トークンを1つ読み進めてその数値を返す。
5662
// それ以外の場合にはエラーを報告する。
5763
int expect_number() {
5864
if (token->kind != TK_NUM)
59-
error("数ではありません");
65+
error_at(token->str, "数ではありません");
6066
int val = token->val;
6167
token = token->next;
6268
return val;
@@ -99,7 +105,7 @@ Token *tokenize(char *p) {
99105
continue;
100106
}
101107

102-
error("トークナイズできません");
108+
error_at(token->str, "トークナイズできません");
103109
}
104110

105111
new_token(TK_EOF, cur, p);
@@ -108,11 +114,12 @@ Token *tokenize(char *p) {
108114

109115
int main(int argc, char **argv) {
110116
if (argc != 2) {
111-
error("引数の個数が正しくありません");
117+
error_at(token->str, "引数の個数が正しくありません");
112118
return 1;
113119
}
114120

115121
// トークナイズする
122+
user_input = argv[1];
116123
token = tokenize(argv[1]);
117124

118125
// アセンブリの前半部分を出力

0 commit comments

Comments
 (0)
Please sign in to comment.