diff --git a/src/include/tokenize.h b/src/include/tokenize.h index 82dc7fe..fad08ba 100644 --- a/src/include/tokenize.h +++ b/src/include/tokenize.h @@ -7,7 +7,7 @@ #include using namespace std; -enum class TokenType { Type, Identifier, Int, Plus, Minus, DoublePlus, DoubleMinus, Star, Slash, Percent, Equal, Semicolon, LParenthese, RParenthese, LCurlyBracket, RCurlyBracket, If, Else }; +enum class TokenType { Type, Identifier, Int, Plus, Minus, DoublePlus, DoubleMinus, DoubleEqual, Star, Slash, Percent, Equal, Semicolon, LParenthese, RParenthese, LCurlyBracket, RCurlyBracket, If, Else }; enum class Type { Int }; using TokenData = variant; diff --git a/src/tokenize.cpp b/src/tokenize.cpp index 6238cfb..537d68f 100644 --- a/src/tokenize.cpp +++ b/src/tokenize.cpp @@ -32,6 +32,9 @@ void _debug_print_token(Token token) { case TokenType::DoubleMinus: cout << "--"; break; + case TokenType::DoubleEqual: + cout << "=="; + break; case TokenType::Star: cout << "*"; break; @@ -53,6 +56,18 @@ void _debug_print_token(Token token) { case TokenType::RParenthese: cout << ")"; break; + case TokenType::LCurlyBracket: + cout << "{"; + break; + case TokenType::RCurlyBracket: + cout << "}"; + break; + case TokenType::If: + cout << "If"; + break; + case TokenType::Else: + cout << "Else"; + break; } } @@ -103,66 +118,91 @@ vector tokenize(vector input, int initial_line) { tokens.emplace_back(token); j += m.str().length(); } - else if (str.length() >= 2 && str[0] == '+' && str[1] == '+') { + else if (str.starts_with("++")) { Token token = { .type = TokenType::DoublePlus, .pos = pos }; tokens.emplace_back(token); j += 2; } - else if (str.length() >= 2 && str[0] == '-' && str[1] == '-') { + else if (str.starts_with("--")) { Token token = { .type = TokenType::DoubleMinus, .pos = pos }; tokens.emplace_back(token); j += 2; } - else if (str[0] == '+') { + else if (str.starts_with("==")) { + Token token = { .type = TokenType::DoubleEqual, .pos = pos }; + tokens.emplace_back(token); + j += 2; + } + else if (str.starts_with("+")) { Token token = { .type = TokenType::Plus, .pos = pos }; tokens.emplace_back(token); j += 1; } - else if (str[0] == '-') { + else if (str.starts_with("-")) { Token token = { .type = TokenType::Minus, .pos = pos }; tokens.emplace_back(token); j += 1; } - else if (str[0] == '*') { + else if (str.starts_with("*")) { Token token = { .type = TokenType::Star, .pos = pos }; tokens.emplace_back(token); j += 1; } - else if (str[0] == '/') { + else if (str.starts_with("/")) { Token token = { .type = TokenType::Slash, .pos = pos }; tokens.emplace_back(token); j += 1; } - else if (str[0] == '%') { + else if (str.starts_with("%")) { Token token = { .type = TokenType::Percent, .pos = pos }; tokens.emplace_back(token); j += 1; } - else if (str[0] == '=') { + else if (str.starts_with("=")) { Token token = { .type = TokenType::Equal, .pos = pos }; tokens.emplace_back(token); j += 1; } - else if (str[0] == ';') { + else if (str.starts_with(";")) { Token token = { .type = TokenType::Semicolon, .pos = pos }; tokens.emplace_back(token); j += 1; } - else if (str[0] == '(') { + else if (str.starts_with("(")) { Token token = { .type = TokenType::LParenthese, .pos = pos }; tokens.emplace_back(token); j += 1; } - else if (str[0] == ')') { + else if (str.starts_with(")")) { Token token = { .type = TokenType::RParenthese, .pos = pos }; tokens.emplace_back(token); j += 1; } - else if (isspace(str[0]) || str[0] == '\0') { + else if (str.starts_with("{")) { + Token token = { .type = TokenType::LCurlyBracket, .pos = pos }; + tokens.emplace_back(token); + j += 1; + } + else if (str.starts_with("}")) { + Token token = { .type = TokenType::RCurlyBracket, .pos = pos }; + tokens.emplace_back(token); + j += 1; + } + else if (str.starts_with("if")) { + Token token = { .type = TokenType::If, .pos = pos }; + tokens.emplace_back(token); + j += 2; + } + else if (str.starts_with("else")) { + Token token = { .type = TokenType::Else, .pos = pos }; + tokens.emplace_back(token); + j += 4; + } + else if (isspace(str[0])) { j += 1; } else { - throw TokenError("Unknown token {}", pos); + throw TokenError("Unknown token", pos); } } }