@@ -69,7 +69,7 @@ static inline int is_str(int c)
69
69
return isalnum (c ) || c == '_' ;
70
70
}
71
71
72
- static TOKEN syntax_error (Lexer * S , char * fmt , ...)
72
+ static Token syntax_error (Lexer * S , char * fmt , ...)
73
73
{
74
74
va_list ap ;
75
75
char msgbuf [256 ];
@@ -119,14 +119,14 @@ static char* fetch_str(Lexer* S, int (*proceed_condition)(int))
119
119
}
120
120
121
121
122
- static int lex_ident (Lexer * S )
122
+ static Token lex_ident (Lexer * S )
123
123
{
124
124
char * str = fetch_str (S , is_str );
125
125
if (!str ) {
126
126
return syntax_error (S , "Fetching str failed." );
127
127
}
128
128
129
- TOKEN ret ;
129
+ TOKENTYPE ret ;
130
130
if (strcmp (str , "echo" ) == 0 ) {
131
131
ret = TK_ECHO ;
132
132
} else if (strcmp (str , "function" ) == 0 ) {
@@ -155,20 +155,20 @@ static int lex_ident(Lexer* S)
155
155
}
156
156
157
157
free (str );
158
- return ret ;
158
+ return create_token ( ret , S -> lineno ) ;
159
159
}
160
160
161
- static TOKEN lex_var (Lexer * S )
161
+ static Token lex_var (Lexer * S )
162
162
{
163
163
assert (is_var_start (S -> lexchar ));
164
164
get_next_char (S ); // Skip $
165
165
char * str = fetch_str (S , is_str );
166
166
state_set_string (S , str );
167
167
168
- return TK_VAR ;
168
+ return create_token ( TK_VAR , S -> lineno ) ;
169
169
}
170
170
171
- static TOKEN lex_str (Lexer * S )
171
+ static Token lex_str (Lexer * S )
172
172
{
173
173
assert (S -> lexchar == '"' );
174
174
int escape = false;
@@ -212,7 +212,7 @@ static TOKEN lex_str(Lexer* S)
212
212
sprintf (errormsg , "Expected \", got %c" , S -> lexchar );
213
213
}
214
214
free (str );
215
- TOKEN ret = syntax_error (S , errormsg );
215
+ Token ret = syntax_error (S , errormsg );
216
216
free (errormsg );
217
217
return ret ;
218
218
}
@@ -221,32 +221,32 @@ static TOKEN lex_str(Lexer* S)
221
221
222
222
get_next_char (S ); // Skip "
223
223
224
- return TK_STRING ;
224
+ return create_token ( TK_STRING , S -> lineno ) ;
225
225
}
226
226
227
- int lex_num (Lexer * S )
227
+ Token lex_num (Lexer * S )
228
228
{
229
229
char * numstr = fetch_str (S , isdigit );
230
230
int64_t n = (int64_t ) strtoll (numstr , NULL , 10 );
231
231
free (numstr );
232
232
state_set_long (S , n );
233
233
234
- return TK_LONG ;
234
+ return create_token ( TK_LONG , S -> lineno ) ;
235
235
}
236
236
237
- #define LEX_TWICE (current , expected , TOKEN ) \
237
+ #define LEX_TWICE (current , expected , TOKENTYPE ) \
238
238
if ((current) == (expected)) { \
239
239
if ((expected) == get_next_char(S)) { \
240
240
get_next_char(S); \
241
- return TOKEN; \
241
+ return create_token(TOKENTYPE, S->lineno); \
242
242
} else \
243
- return ( expected); \
243
+ return create_token(( expected), S->lineno); \
244
244
}
245
245
246
- int get_token (Lexer * S )
246
+ Token get_token (Lexer * S )
247
247
{
248
248
if (S -> lexchar == EOF ) {
249
- return TK_END ;
249
+ return create_token ( TK_END , S -> lineno ) ;
250
250
}
251
251
252
252
if (S -> mode == NONPHP ) {
@@ -270,17 +270,17 @@ int get_token(Lexer* S)
270
270
return get_token (S );
271
271
}
272
272
S -> u .string = html ;
273
- return TK_HTML ;
273
+ return create_token ( TK_HTML , S -> lineno ) ;
274
274
} else if (S -> mode == EMITOPENTAG ) {
275
275
S -> mode = PHP ;
276
- return TK_OPENTAG ;
276
+ return create_token ( TK_OPENTAG , S -> lineno ) ;
277
277
}
278
278
279
279
int c = S -> lexchar ;
280
280
while (is_whitespace (c )) {
281
281
c = get_next_char (S ); // Consume whitespace
282
282
if (c == EOF ) {
283
- return TK_END ;
283
+ return create_token ( TK_END , S -> lineno ) ;
284
284
}
285
285
}
286
286
@@ -310,26 +310,26 @@ int get_token(Lexer* S)
310
310
c = get_next_char (S );
311
311
if (c == '=' ) {
312
312
get_next_char (S );
313
- return TK_LTEQ ;
313
+ return create_token ( TK_LTEQ , S -> lineno ) ;
314
314
} else if (c == '<' ) {
315
315
get_next_char (S );
316
- return TK_SHL ;
316
+ return create_token ( TK_SHL , S -> lineno ) ;
317
317
}
318
318
319
- return '<' ;
319
+ return create_token ( '<' , S -> lineno ) ;
320
320
}
321
321
322
322
if (c == '>' ) {
323
323
c = get_next_char (S );
324
324
if (c == '=' ) {
325
325
get_next_char (S );
326
- return TK_GTEQ ;
326
+ return create_token ( TK_GTEQ , S -> lineno ) ;
327
327
} else if (c == '>' ) {
328
328
get_next_char (S );
329
- return TK_SHR ;
329
+ return create_token ( TK_SHR , S -> lineno ) ;
330
330
}
331
331
332
- return '>' ;
332
+ return create_token ( '>' , S -> lineno ) ;
333
333
}
334
334
335
335
if (c == '/' ) {
@@ -339,12 +339,12 @@ int get_token(Lexer* S)
339
339
S -> lineno ++ ;
340
340
return get_token (S );
341
341
} else {
342
- return '/' ;
342
+ return create_token ( '/' , S -> lineno ) ;
343
343
}
344
344
}
345
345
346
346
get_next_char (S );
347
- return c ;
347
+ return create_token ( c , S -> lineno ) ;
348
348
}
349
349
350
350
Lexer * create_lexer (FILE * file )
@@ -358,6 +358,7 @@ Lexer* create_lexer(FILE *file)
358
358
ret -> lineno = 1 ;
359
359
ret -> mode = NONPHP ;
360
360
ret -> file = file ;
361
+ ret -> token = create_token (0 , 1 );
361
362
get_next_char (ret );
362
363
return ret ;
363
364
}
@@ -421,7 +422,7 @@ char* get_token_name(int tok)
421
422
void print_tokenstream (Lexer * S )
422
423
{
423
424
int tok ;
424
- while ((tok = get_token (S )) != TK_END ) {
425
+ while ((tok = get_token (S ). type ) != TK_END ) {
425
426
char * name = get_token_name (tok );
426
427
if (name ) {
427
428
puts (name );
0 commit comments