@@ -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
128127void 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