Ver código fonte

[lexer.h] Adding function lexer_lookup_ident

Vinicius Teshima 1 ano atrás
pai
commit
0fc27694ae
1 arquivos alterados com 38 adições e 1 exclusões
  1. 38 1
      src/lexer.h

+ 38 - 1
src/lexer.h

@@ -18,6 +18,7 @@ void lexer_read_char(struct lexer *l);
 
 struct token lexer_next_token(struct lexer *l);
 struct str lexer_read_ident(struct lexer *l);
+enum token_type_enum lexer_lookup_ident(struct str ident);
 
 bool _lexer_is_letter(char c);
 
@@ -65,7 +66,8 @@ lexer_next_token(struct lexer *l)
 	case '\0': t = token_create(TT_EOF,       STR_EMPTY); break;
 	default: 
 		if ( _lexer_is_letter(l->c) ) {
-			t = token_create(TT_IDENT, lexer_read_ident(l));
+			struct str ident = lexer_read_ident(l);
+			t = token_create(lexer_lookup_ident(ident), ident);
 			return t;
 		}
 		break;
@@ -86,6 +88,41 @@ lexer_read_ident(struct lexer *l)
 	return str_slice(l->in, pos, l->pos);
 }
 
+enum token_type_enum
+lexer_lookup_ident(struct str ident)
+{
+	if ( ident.size < 3 ) {
+		return TT_IDENT;
+	}
+
+	switch ( ident.data[0] ) {
+	case 'i':
+		if ( str_eq_cstr(ident, "int", 3) ) {
+			return TT_TYPE;
+		}
+		if ( str_eq_cstr(ident, "include", 7) ) {
+			return TT_INCLUDE;
+		}
+		break;
+	case 'c':
+		if ( str_eq_cstr(ident, "char", 4) ) {
+			return TT_TYPE;
+		}
+		if ( str_eq_cstr(ident, "const", 5) ) {
+			return TT_CONST;
+		}
+		break;
+	case 'r':
+		if ( str_eq_cstr(ident, "return", 6) ) {
+			return TT_RETURN;
+		}
+		break;
+	}
+
+
+	return TT_IDENT;
+}
+
 bool
 _lexer_is_letter(char c)
 {