소스 검색

[lexer/token.h] Adding token for == and !=

Vinicius Teshima 1 년 전
부모
커밋
4e63ee8894
2개의 변경된 파일35개의 추가작업 그리고 3개의 파일을 삭제
  1. 29 3
      src/lexer.h
  2. 6 0
      src/token.h

+ 29 - 3
src/lexer.h

@@ -26,6 +26,7 @@ struct lexer_err {
 
 struct lexer lexer_create(struct str in);
 void lexer_read_char(struct lexer *l);
+char lexer_peek_char(struct lexer *l);
 
 struct token lexer_next_token(struct lexer *l, struct lexer_err *err);
 
@@ -70,21 +71,45 @@ lexer_read_char(struct lexer *l)
 	++l->rpos;
 }
 
+char 
+lexer_peek_char(struct lexer *l)
+{
+	if ( l->rpos >= l->in.size ) {
+		return '\0';
+	}
+	return l->in.data[l->rpos];
+}
+
 struct token 
 lexer_next_token(struct lexer *l, struct lexer_err *err)
 {
 #define _LEXER_CUR_CHAR str_slice(l->in, l->pos, l->pos+1)
+#define _LEXER_2_CHAR str_slice(l->in, l->pos, l->pos+2)
 
 	struct token t = TOKEN_ILLEGAL;
 
 	lexer_skip_whitespace(l);
 
 	switch ( l->c ) {
-	case '=':  t = token_create(TT_ASSIGN,    _LEXER_CUR_CHAR); break;
+	case '=':
+		if ( lexer_peek_char(l) == '=' ) {
+			t = token_create(TT_EQ, _LEXER_2_CHAR);
+			lexer_read_char(l);
+			goto aft_swt;
+		}
+		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_BANG,      _LEXER_CUR_CHAR); break;
+	case '!':
+		if ( lexer_peek_char(l) == '=' ) {
+			t = token_create(TT_NOT_EQ, _LEXER_2_CHAR);
+			lexer_read_char(l);
+			goto aft_swt;
+		}
+		t = token_create(TT_BANG,      _LEXER_CUR_CHAR);
+		break;
 	case '/':  t = token_create(TT_SLASH,     _LEXER_CUR_CHAR); break;
 	case ',':  t = token_create(TT_COMMA,     _LEXER_CUR_CHAR); break;
 	case '*':  t = token_create(TT_ASTERISK,  _LEXER_CUR_CHAR); break;
@@ -125,7 +150,7 @@ lexer_next_token(struct lexer *l, struct lexer_err *err)
 		}
 		break;
 	}
-
+aft_swt:
 	lexer_read_char(l);
 
 ret_ok:
@@ -134,6 +159,7 @@ ret_ok:
 ret_invalid:
 	return TOKEN_ILLEGAL;
 
+#undef _LEXER_2_CHAR
 #undef _LEXER_CUR_CHAR
 }
 

+ 6 - 0
src/token.h

@@ -15,6 +15,9 @@ enum token_type_enum {
 	TT_PLUS,
 	TT_BANG,
 	TT_SLASH,
+	
+	TT_EQ,     /* '==' */
+	TT_NOT_EQ, /* '!=' */
 
 	TT_COMMA,
 	TT_SEMICOLON,
@@ -113,6 +116,9 @@ token_type_enum_2_cstr(enum token_type_enum tte)
 	_TOKEN_CASE(TT_BANG);
 	_TOKEN_CASE(TT_SLASH);
 
+	_TOKEN_CASE(TT_EQ);
+	_TOKEN_CASE(TT_NOT_EQ);
+
 	_TOKEN_CASE(TT_COMMA);
 	_TOKEN_CASE(TT_SEMICOLON);
 	_TOKEN_CASE(TT_ASTERISK);