Bladeren bron

[lexer/token.h] Adding string literals

Vinicius Teshima 1 jaar geleden
bovenliggende
commit
33e3e22c9c
2 gewijzigde bestanden met toevoegingen van 19 en 1 verwijderingen
  1. 17 1
      src/lexer.h
  2. 2 0
      src/token.h

+ 17 - 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);
+struct str lexer_read_str_lit(struct lexer *l);
 enum token_type_enum lexer_lookup_ident(struct str ident);
 void lexer_skip_whitespace(struct lexer *l);
 
@@ -68,7 +69,10 @@ lexer_next_token(struct lexer *l)
 	case '<':  t = token_create(TT_LABRACKET, str_from_cstr("<", 1)); break;
 	case '>':  t = token_create(TT_RABRACKET, str_from_cstr(">", 1)); break;
 	case '\'': t = token_create(TT_SQUOTE,    str_from_cstr("'", 1)); break;
-	case '"':  t = token_create(TT_DQUOTE,    str_from_cstr("\"", 1)); break;
+	case '"':
+		t = token_create(TT_STR_LIT, lexer_read_str_lit(l));
+		return t;
+		break;
 	case '\0': t = token_create(TT_EOF,       STR_EMPTY); break;
 	default: 
 		if ( _lexer_is_letter(l->c) ) {
@@ -94,6 +98,18 @@ lexer_read_ident(struct lexer *l)
 	return str_slice(l->in, pos, l->pos);
 }
 
+struct str
+lexer_read_str_lit(struct lexer *l)
+{
+	size_t pos = l->pos;
+	lexer_read_char(l);
+	while ( l->c != '"' ) {
+		lexer_read_char(l);
+	}
+	lexer_read_char(l);
+	return str_slice(l->in, pos+1, l->pos-1);
+}
+
 enum token_type_enum
 lexer_lookup_ident(struct str ident)
 {

+ 2 - 0
src/token.h

@@ -9,6 +9,7 @@ enum token_type_enum {
 
 	TT_IDENT,
 	TT_INT_LIT,
+	TT_STR_LIT,
 
 	TT_ASSIGN,
 	TT_PLUS,
@@ -87,6 +88,7 @@ token_type_enum_2_cstr(enum token_type_enum tte)
 
 	_TOKEN_CASE(TT_IDENT);
 	_TOKEN_CASE(TT_INT_LIT);
+	_TOKEN_CASE(TT_STR_LIT);
 
 	_TOKEN_CASE(TT_ASSIGN);
 	_TOKEN_CASE(TT_PLUS);