Skip to content

Commit 316d8f8

Browse files
committed
minor
1 parent 437413b commit 316d8f8

2 files changed

Lines changed: 89 additions & 131 deletions

File tree

c-source.c

Lines changed: 39 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -122,8 +122,7 @@ enum {
122122
_TkFieldCount,
123123
};
124124

125-
int* g_token_buffer, // global int array to hold token information
126-
g_token_idx; // global index of current token
125+
int* g_token_buffer; // global int array to hold token information
127126

128127
void check_if_token_keyword(int token_idx) {
129128
char* keywords = "int\0 char\0 void\0 break\0 continue\0"
@@ -172,81 +171,81 @@ int parse_escape_sequence(int letter, int ln) {
172171
return 0;
173172
}
174173

175-
void lex() {
174+
int lex(char* p) {
175+
int token_idx = 0;
176176
int ln = 1;
177-
char *p = g_src;
178177
while (*p) {
179178
if (*p == '#' || (*p == '/' && p[1] == '/')) { // handle '#' and comment '//'
180179
while (*p && *p != '\n') ++p;
181180
} else if (IS_WHITESPACE(*p)) { // handle whitespace
182181
ln += (*p == '\n'); ++p;
183182
} else {
184-
GET_TK_FIELD(g_token_idx, TkFieldLine) = ln;
185-
GET_TK_FIELD(g_token_idx, TkFieldBegin) = (int)p;
183+
GET_TK_FIELD(token_idx, TkFieldLine) = ln;
184+
GET_TK_FIELD(token_idx, TkFieldBegin) = (int)p;
186185

187186
if (IS_LETTER(*p) || *p == '_') { // handle token or keyword
188-
GET_TK_FIELD(g_token_idx, TkFieldKind) = TK_IDENT;
187+
GET_TK_FIELD(token_idx, TkFieldKind) = TK_IDENT;
189188
++p;
190189
while (IS_LETTER(*p) || IS_DIGIT(*p) || *p == '_') {
191190
++p;
192191
}
193-
GET_TK_FIELD(g_token_idx, TkFieldEnd) = (int)p;
194-
check_if_token_keyword(g_token_idx);
195-
g_token_idx += 1;
192+
GET_TK_FIELD(token_idx, TkFieldEnd) = (int)p;
193+
check_if_token_keyword(token_idx);
194+
token_idx += 1;
196195
} else if (*p == '0' && p[1] == 'x') { // handle hex number
197-
GET_TK_FIELD(g_token_idx, TkFieldKind) = TK_INT;
196+
GET_TK_FIELD(token_idx, TkFieldKind) = TK_INT;
198197
int result = 0;
199198
p += 2; while(IS_HEX(*p)) {
200199
result = (result << 4) + ((*p < 'A') ? (*p - '0') : (*p - 55));
201200
++p;
202201
}
203-
GET_TK_FIELD(g_token_idx, TkFieldValue) = result;
204-
GET_TK_FIELD(g_token_idx++, TkFieldEnd) = p;
202+
GET_TK_FIELD(token_idx, TkFieldValue) = result;
203+
GET_TK_FIELD(token_idx++, TkFieldEnd) = p;
205204
} else if (IS_DIGIT(*p)) { // handle decimal number
206-
GET_TK_FIELD(g_token_idx, TkFieldKind) = TK_INT;
205+
GET_TK_FIELD(token_idx, TkFieldKind) = TK_INT;
207206
int result = 0;
208207
while (IS_DIGIT(*p)) { result = result * 10 + (*p - '0'); ++p; }
209-
GET_TK_FIELD(g_token_idx, TkFieldValue) = result;
210-
GET_TK_FIELD(g_token_idx++, TkFieldEnd) = p;
208+
GET_TK_FIELD(token_idx, TkFieldValue) = result;
209+
GET_TK_FIELD(token_idx++, TkFieldEnd) = p;
211210
} else if (*p == '"') { // handle string
212-
GET_TK_FIELD(g_token_idx, TkFieldKind) = TK_STRING;
211+
GET_TK_FIELD(token_idx, TkFieldKind) = TK_STRING;
213212
++p; while (*p != '"') { ++p; };
214-
GET_TK_FIELD(g_token_idx++, TkFieldEnd) = ++p;
213+
GET_TK_FIELD(token_idx++, TkFieldEnd) = ++p;
215214
} else if (*p == '\'') {
216215
// @TODO: handle escape
217-
GET_TK_FIELD(g_token_idx, TkFieldKind) = TK_CHAR;
216+
GET_TK_FIELD(token_idx, TkFieldKind) = TK_CHAR;
218217
int v = *(++p); // skip opening '
219218
if (v == '\\') {
220219
v = parse_escape_sequence(*(++p), ln);
221220
}
222-
GET_TK_FIELD(g_token_idx, TkFieldValue) = v;
223-
GET_TK_FIELD(g_token_idx++, TkFieldEnd) = (p += 2); // skip char and closing '
221+
GET_TK_FIELD(token_idx, TkFieldValue) = v;
222+
GET_TK_FIELD(token_idx++, TkFieldEnd) = (p += 2); // skip char and closing '
224223
} else {
225-
GET_TK_FIELD(g_token_idx, TkFieldKind) = *p;
224+
GET_TK_FIELD(token_idx, TkFieldKind) = *p;
226225

227-
if (IS_PUNCT(p, '=', '=')) { GET_TK_FIELD(g_token_idx, TkFieldKind) = TK_EQ; ++p; }
228-
else if (IS_PUNCT(p, '!', '=')) { GET_TK_FIELD(g_token_idx, TkFieldKind) = TK_NE; ++p; }
229-
else if (IS_PUNCT(p, '&', '&')) { GET_TK_FIELD(g_token_idx, TkFieldKind) = TK_AND; ++p; }
230-
else if (IS_PUNCT(p, '|', '|')) { GET_TK_FIELD(g_token_idx, TkFieldKind) = TK_OR; ++p; }
226+
if (IS_PUNCT(p, '=', '=')) { GET_TK_FIELD(token_idx, TkFieldKind) = TK_EQ; ++p; }
227+
else if (IS_PUNCT(p, '!', '=')) { GET_TK_FIELD(token_idx, TkFieldKind) = TK_NE; ++p; }
228+
else if (IS_PUNCT(p, '&', '&')) { GET_TK_FIELD(token_idx, TkFieldKind) = TK_AND; ++p; }
229+
else if (IS_PUNCT(p, '|', '|')) { GET_TK_FIELD(token_idx, TkFieldKind) = TK_OR; ++p; }
231230
else if (*p == '+') {
232-
if (p[1] == '+') { GET_TK_FIELD(g_token_idx, TkFieldKind) = TK_INC; ++p; }
233-
else if (p[1] == '=') { GET_TK_FIELD(g_token_idx, TkFieldKind) = TK_ADD_ASSIGN; ++p; }
231+
if (p[1] == '+') { GET_TK_FIELD(token_idx, TkFieldKind) = TK_INC; ++p; }
232+
else if (p[1] == '=') { GET_TK_FIELD(token_idx, TkFieldKind) = TK_ADD_ASSIGN; ++p; }
234233
} else if (*p == '-') {
235-
if (p[1] == '-') { GET_TK_FIELD(g_token_idx, TkFieldKind) = TK_DEC; ++p; }
236-
else if (p[1] == '=') { GET_TK_FIELD(g_token_idx, TkFieldKind) = TK_SUB_ASSIGN; ++p; }
234+
if (p[1] == '-') { GET_TK_FIELD(token_idx, TkFieldKind) = TK_DEC; ++p; }
235+
else if (p[1] == '=') { GET_TK_FIELD(token_idx, TkFieldKind) = TK_SUB_ASSIGN; ++p; }
237236
} else if (*p == '>') {
238-
if (p[1] == '=') { GET_TK_FIELD(g_token_idx, TkFieldKind) = TK_GE; ++p; }
239-
else if (p[1] == '>') { GET_TK_FIELD(g_token_idx, TkFieldKind) = TK_RSHIFT; ++p; }
237+
if (p[1] == '=') { GET_TK_FIELD(token_idx, TkFieldKind) = TK_GE; ++p; }
238+
else if (p[1] == '>') { GET_TK_FIELD(token_idx, TkFieldKind) = TK_RSHIFT; ++p; }
240239
} else if (*p == '<') {
241-
if (p[1] == '=') { GET_TK_FIELD(g_token_idx, TkFieldKind) = TK_LE; ++p; }
242-
else if (p[1] == '<') { GET_TK_FIELD(g_token_idx, TkFieldKind) = TK_LSHIFT; ++p; }
240+
if (p[1] == '=') { GET_TK_FIELD(token_idx, TkFieldKind) = TK_LE; ++p; }
241+
else if (p[1] == '<') { GET_TK_FIELD(token_idx, TkFieldKind) = TK_LSHIFT; ++p; }
243242
}
244243

245-
GET_TK_FIELD(g_token_idx++, TkFieldEnd) = ++p;
244+
GET_TK_FIELD(token_idx++, TkFieldEnd) = ++p;
246245
}
247246
}
248247
}
249-
return;
248+
return token_idx;
250249
}
251250

252251
//--------------------------------- CODEGEN ----------------------------------//
@@ -953,10 +952,10 @@ void obj() {
953952
return;
954953
}
955954

956-
void gen(int argc, char** argv) {
955+
void gen(int argc, char** argv, int token_count) {
957956
enter_scope();
958957

959-
while (g_tkIter < g_token_idx) {
958+
while (g_tkIter < token_count) {
960959
obj();
961960
}
962961

@@ -1118,10 +1117,10 @@ int main(int argc, char **argv) {
11181117
g_src[src_len] = 0;
11191118

11201119
// lexing
1121-
lex();
1120+
int token_count = lex(g_src);
11221121

11231122
// code generation
1124-
gen(argc - 1, argv + 1);
1123+
gen(argc - 1, argv + 1, token_count);
11251124

11261125
// run
11271126
g_regs = g_ram + g_reserved - 4 * IMME;

0 commit comments

Comments
 (0)