Эх сурвалжийг харах

[lexer/token.h] Adding tokens for preprocessors

Vinicius Teshima 1 жил өмнө
parent
commit
4318902824
2 өөрчлөгдсөн 60 нэмэгдсэн , 5 устгасан
  1. 48 3
      src/lexer.h
  2. 12 2
      src/token.h

+ 48 - 3
src/lexer.h

@@ -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)
 {
 {

+ 12 - 2
src/token.h

@@ -28,11 +28,16 @@ enum token_type_enum {
 	TT_RABRACKET, /* '>' */
 	TT_RABRACKET, /* '>' */
 
 
 	TT_FUNCION,
 	TT_FUNCION,
-	TT_INCLUDE,
 	TT_RETURN,
 	TT_RETURN,
 	TT_CONST,
 	TT_CONST,
 	TT_TYPE,
 	TT_TYPE,
 
 
+	TT_PP_INCLUDE,
+	TT_PP_DEFINE,
+	TT_PP_IFNDEF,
+	TT_PP_IFDEF,
+	TT_PP_IF,
+
 	TT_SQUOTE,
 	TT_SQUOTE,
 	TT_DQUOTE,
 	TT_DQUOTE,
 
 
@@ -107,10 +112,15 @@ token_type_enum_2_cstr(enum token_type_enum tte)
 	_TOKEN_CASE(TT_RABRACKET);
 	_TOKEN_CASE(TT_RABRACKET);
 
 
 	_TOKEN_CASE(TT_FUNCION);
 	_TOKEN_CASE(TT_FUNCION);
-	_TOKEN_CASE(TT_INCLUDE);
 	_TOKEN_CASE(TT_RETURN);
 	_TOKEN_CASE(TT_RETURN);
 	_TOKEN_CASE(TT_CONST);
 	_TOKEN_CASE(TT_CONST);
 	_TOKEN_CASE(TT_TYPE);
 	_TOKEN_CASE(TT_TYPE);
+	
+	_TOKEN_CASE(TT_PP_INCLUDE);
+	_TOKEN_CASE(TT_PP_DEFINE);
+	_TOKEN_CASE(TT_PP_IFNDEF);
+	_TOKEN_CASE(TT_PP_IFDEF);
+	_TOKEN_CASE(TT_PP_IF);
 
 
 	_TOKEN_CASE(TT_SQUOTE);
 	_TOKEN_CASE(TT_SQUOTE);
 	_TOKEN_CASE(TT_DQUOTE);
 	_TOKEN_CASE(TT_DQUOTE);