Parcourir la source

[lexer.h] Using macro to get the current char

Vinicius Teshima il y a 1 an
Parent
commit
8595812f0b
1 fichiers modifiés avec 19 ajouts et 15 suppressions
  1. 19 15
      src/lexer.h

+ 19 - 15
src/lexer.h

@@ -50,30 +50,32 @@ lexer_read_char(struct lexer *l)
 struct token 
 lexer_next_token(struct lexer *l)
 {
+#define _LEXER_CUR_CHAR str_slice(l->in, l->pos, l->pos+1)
+
 	struct token t = TOKEN_ILLEGAL;
 
 	lexer_skip_whitespace(l);
 
 	switch ( l->c ) {
-	case '=':  t = token_create(TT_ASSIGN,    str_from_cstr("=", 1)); break;
-	case ';':  t = token_create(TT_SEMICOLON, str_from_cstr(";", 1)); break;
-	case '(':  t = token_create(TT_LPAREN,    str_from_cstr("(", 1)); break;
-	case ')':  t = token_create(TT_RPAREN,    str_from_cstr(")", 1)); break;
-	case ',':  t = token_create(TT_COMMA,     str_from_cstr(",", 1)); break;
-	case '*':  t = token_create(TT_ASTERISK,  str_from_cstr("*", 1)); break;
-	case '-':  t = token_create(TT_DASH,      str_from_cstr("-", 1)); break;
-	case '.':  t = token_create(TT_DOT,       str_from_cstr(".", 1)); break;
-	case '+':  t = token_create(TT_PLUS,      str_from_cstr("+", 1)); break;
-	case '{':  t = token_create(TT_LBRACE,    str_from_cstr("{", 1)); break;
-	case '}':  t = token_create(TT_RBRACE,    str_from_cstr("}", 1)); break;
-	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_ASSIGN,    _LEXER_CUR_CHAR); break;
+	case ';':  t = token_create(TT_SEMICOLON, _LEXER_CUR_CHAR); break;
+	case '(':  t = token_create(TT_LPAREN,    _LEXER_CUR_CHAR); break;
+	case ')':  t = token_create(TT_RPAREN,    _LEXER_CUR_CHAR); break;
+	case ',':  t = token_create(TT_COMMA,     _LEXER_CUR_CHAR); break;
+	case '*':  t = token_create(TT_ASTERISK,  _LEXER_CUR_CHAR); break;
+	case '-':  t = token_create(TT_DASH,      _LEXER_CUR_CHAR); break;
+	case '.':  t = token_create(TT_DOT,       _LEXER_CUR_CHAR); break;
+	case '+':  t = token_create(TT_PLUS,      _LEXER_CUR_CHAR); break;
+	case '{':  t = token_create(TT_LBRACE,    _LEXER_CUR_CHAR); break;
+	case '}':  t = token_create(TT_RBRACE,    _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_SQUOTE,    _LEXER_CUR_CHAR); 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;
+	case '\0': t = token_create(TT_EOF, STR_EMPTY); break;
 	default: 
 		if ( _lexer_is_letter(l->c) ) {
 			struct str ident = lexer_read_ident(l);
@@ -86,6 +88,8 @@ lexer_next_token(struct lexer *l)
 	lexer_read_char(l);
 
 	return t;
+
+#undef _LEXER_CUR_CHAR
 }
 
 struct str