|
@@ -18,6 +18,7 @@ void lexer_read_char(struct lexer *l);
|
|
|
|
|
|
|
|
struct token lexer_next_token(struct lexer *l);
|
|
struct token lexer_next_token(struct lexer *l);
|
|
|
struct str lexer_read_ident(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);
|
|
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;
|
|
case '\0': t = token_create(TT_EOF, STR_EMPTY); break;
|
|
|
default:
|
|
default:
|
|
|
if ( _lexer_is_letter(l->c) ) {
|
|
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;
|
|
return t;
|
|
|
}
|
|
}
|
|
|
break;
|
|
break;
|
|
@@ -86,6 +88,41 @@ lexer_read_ident(struct lexer *l)
|
|
|
return str_slice(l->in, pos, l->pos);
|
|
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
|
|
bool
|
|
|
_lexer_is_letter(char c)
|
|
_lexer_is_letter(char c)
|
|
|
{
|
|
{
|