|
@@ -23,6 +23,7 @@ struct str lexer_read_str_lit(struct lexer *l);
|
|
|
struct str lexer_read_int_lit(struct lexer *l);
|
|
struct str lexer_read_int_lit(struct lexer *l);
|
|
|
|
|
|
|
|
enum token_type_enum lexer_lookup_ident(struct str ident);
|
|
enum token_type_enum lexer_lookup_ident(struct str ident);
|
|
|
|
|
+enum token_type_enum lexer_lookup_pp(struct str ident);
|
|
|
void lexer_skip_whitespace(struct lexer *l);
|
|
void lexer_skip_whitespace(struct lexer *l);
|
|
|
|
|
|
|
|
bool _lexer_is_letter(char c);
|
|
bool _lexer_is_letter(char c);
|
|
@@ -75,6 +76,17 @@ lexer_next_token(struct lexer *l)
|
|
|
case '<': t = token_create(TT_LABRACKET, _LEXER_CUR_CHAR); break;
|
|
case '<': t = token_create(TT_LABRACKET, _LEXER_CUR_CHAR); break;
|
|
|
case '>': t = token_create(TT_RABRACKET, _LEXER_CUR_CHAR); break;
|
|
case '>': t = token_create(TT_RABRACKET, _LEXER_CUR_CHAR); break;
|
|
|
case '\'': t = token_create(TT_SQUOTE, _LEXER_CUR_CHAR); break;
|
|
case '\'': t = token_create(TT_SQUOTE, _LEXER_CUR_CHAR); break;
|
|
|
|
|
+ case '#':
|
|
|
|
|
+ lexer_read_char(l);
|
|
|
|
|
+ if ( _lexer_is_letter(l->c) ) {
|
|
|
|
|
+ struct str ident = lexer_read_ident(l);
|
|
|
|
|
+ t = token_create(lexer_lookup_pp(ident), ident);
|
|
|
|
|
+ return t;
|
|
|
|
|
+ }
|
|
|
|
|
+ if ( _lexer_is_number(l->c) ) {
|
|
|
|
|
+ return token_create(TT_INT_LIT, lexer_read_int_lit(l));
|
|
|
|
|
+ }
|
|
|
|
|
+ break;
|
|
|
case '"':
|
|
case '"':
|
|
|
t = token_create(TT_STR_LIT, lexer_read_str_lit(l));
|
|
t = token_create(TT_STR_LIT, lexer_read_str_lit(l));
|
|
|
return t;
|
|
return t;
|
|
@@ -153,9 +165,6 @@ lexer_lookup_ident(struct str ident)
|
|
|
if ( str_eq_cstr(ident, "int", 3) ) {
|
|
if ( str_eq_cstr(ident, "int", 3) ) {
|
|
|
return TT_TYPE;
|
|
return TT_TYPE;
|
|
|
}
|
|
}
|
|
|
- if ( str_eq_cstr(ident, "include", 7) ) {
|
|
|
|
|
- return TT_INCLUDE;
|
|
|
|
|
- }
|
|
|
|
|
break;
|
|
break;
|
|
|
case 'c':
|
|
case 'c':
|
|
|
if ( str_eq_cstr(ident, "char", 4) ) {
|
|
if ( str_eq_cstr(ident, "char", 4) ) {
|
|
@@ -176,6 +185,42 @@ lexer_lookup_ident(struct str ident)
|
|
|
return TT_IDENT;
|
|
return TT_IDENT;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+enum token_type_enum
|
|
|
|
|
+lexer_lookup_pp(struct str ident)
|
|
|
|
|
+{
|
|
|
|
|
+ if ( ident.size < 2 ) {
|
|
|
|
|
+ return TT_IDENT;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ switch ( ident.size ) {
|
|
|
|
|
+ case 7:
|
|
|
|
|
+ if ( str_eq_cstr(ident, "include", 7) ) {
|
|
|
|
|
+ return TT_PP_INCLUDE;
|
|
|
|
|
+ }
|
|
|
|
|
+ break;
|
|
|
|
|
+ case 6:
|
|
|
|
|
+ if ( str_eq_cstr(ident, "define", 6) ) {
|
|
|
|
|
+ return TT_PP_DEFINE;
|
|
|
|
|
+ }
|
|
|
|
|
+ if ( str_eq_cstr(ident, "ifndef", 6) ) {
|
|
|
|
|
+ return TT_PP_IFNDEF;
|
|
|
|
|
+ }
|
|
|
|
|
+ break;
|
|
|
|
|
+ case 5:
|
|
|
|
|
+ if ( str_eq_cstr(ident, "ifdef", 5) ) {
|
|
|
|
|
+ return TT_PP_IFDEF;
|
|
|
|
|
+ }
|
|
|
|
|
+ break;
|
|
|
|
|
+ case 2:
|
|
|
|
|
+ if ( str_eq_cstr(ident, "if", 2) ) {
|
|
|
|
|
+ return TT_PP_IF;
|
|
|
|
|
+ }
|
|
|
|
|
+ break;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return TT_IDENT;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
void
|
|
void
|
|
|
lexer_skip_whitespace(struct lexer *l)
|
|
lexer_skip_whitespace(struct lexer *l)
|
|
|
{
|
|
{
|