-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtokenize.c
More file actions
82 lines (79 loc) · 1.87 KB
/
tokenize.c
File metadata and controls
82 lines (79 loc) · 1.87 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
#include "smc.h"
// 新しいtokenを作る
Token *new_token(TokenKind kind, Token *cur, char *str){
Token *tok = calloc(1, sizeof(Token));
tok->kind = kind;
tok->str = str;
cur->next = tok;
return tok;
}
// スペースを飛ばして式をtoken化して線形リストに格納する
void *tokenize(void){
char *p = user_input;
Token head = {};
Token *cur = &head;
while (*p){
if (isspace(*p)){
p++;
continue;
}else if ( strncmp(p,"<=",2) == 0|| strncmp(p,">=",2) == 0|| strncmp(p,"==",2) == 0|| strncmp(p,"!=",2) == 0){
cur = new_token(TK_RESERVED, cur, p);
cur->len = 2;
p += 2;
continue;
}else if (ispunct(*p)){
if(*p == '{' || *p == '}'){
cur = new_token(TK_CONTROL, cur, p);
}else{
cur = new_token(TK_RESERVED, cur, p);
}
cur->len = 1;
p++;
continue;
}else if (strncmp(p, "return", 6) == 0 && isspace(p[6])){
cur = new_token(TK_CONTROL, cur, p);
cur->len = 6;
p += 6;
continue;
}else if(strncmp(p, "if", 2) == 0){
cur = new_token(TK_CONTROL, cur, p);
cur->len = 2;
p += 2;
continue;
}else if(strncmp(p, "else", 4) == 0){
cur = new_token(TK_CONTROL, cur, p);
cur->len = 4;
p += 4;
continue;
}else if(strncmp(p, "while", 5) == 0){
cur = new_token(TK_CONTROL, cur, p);
cur->len = 5;
p += 5;
continue;
}else if(strncmp(p, "for", 3) == 0){
cur = new_token(TK_CONTROL, cur, p);
cur->len = 3;
p += 3;
continue;
}else if(strncmp(p, "int", 3) == 0){
cur = new_token(TK_CONTROL, cur, p);
cur->len = 3;
p += 3;
}else if (isalpha(*p)){
int len = 0;
do{
len++;
p++;
} while (isalpha(*p) || isdigit(*p) || *p == '_');
cur = new_token(TK_IDENT, cur, p - len);
cur->len = len;
continue;
}else if (isdigit(*p)){
cur = new_token(TK_NUM, cur, p);
cur->val = strtol(p, &p, 10);
continue;
}
}
new_token(TK_EOF, cur, p);
token = head.next;
}