extended single char tokens

This commit is contained in:
Karma Riuk
2025-06-30 00:27:30 +02:00
parent dec93f8272
commit 5cc7147909
3 changed files with 102 additions and 1 deletions

View File

@@ -17,6 +17,18 @@ namespace lexer {
return {token::type::ASSIGN, c}; return {token::type::ASSIGN, c};
case '+': case '+':
return {token::type::PLUS, c}; return {token::type::PLUS, c};
case '-':
return {token::type::MINUS, c};
case '!':
return {token::type::BANG, c};
case '*':
return {token::type::ASTERISK, c};
case '/':
return {token::type::SLASH, c};
case '<':
return {token::type::LT, c};
case '>':
return {token::type::GT, c};
case ',': case ',':
return {token::type::COMMA, c}; return {token::type::COMMA, c};
case ';': case ';':

View File

@@ -12,6 +12,12 @@ namespace token {
X(INT, "INT") \ X(INT, "INT") \
X(ASSIGN, "=") \ X(ASSIGN, "=") \
X(PLUS, "+") \ X(PLUS, "+") \
X(MINUS, "-") \
X(BANG, "!") \
X(ASTERISK, "*") \
X(SLASH, "/") \
X(LT, "<") \
X(GT, ">") \
X(COMMA, ",") \ X(COMMA, ",") \
X(SEMICOLON, ";") \ X(SEMICOLON, ";") \
X(LPAREN, "(") \ X(LPAREN, "(") \

View File

@@ -36,7 +36,7 @@ TEST_CASE("Single character token") {
} }
}; };
TEST_CASE("Full tokens") { TEST_CASE("More tokens") {
struct test { struct test {
token::type expectedType; token::type expectedType;
std::string expectedLiteral; std::string expectedLiteral;
@@ -102,3 +102,86 @@ let result = add(five, ten);\
CHECK(tok.literal == t.expectedLiteral); CHECK(tok.literal == t.expectedLiteral);
} }
}; };
TEST_CASE("Even more tokens (simple)") {
struct test {
token::type expectedType;
std::string expectedLiteral;
};
std::istringstream ss("let five = 5;\
let ten = 10;\
let add = fn(x, y) {\
x + y;\
};\
let result = add(five, ten);\
!-/*5;\
5 < 10 > 5;\
");
lexer::lexer l{ss};
test tests[] = {
// clang-format off
{token::type::LET, "let"},
{token::type::IDENTIFIER, "five"},
{token::type::ASSIGN, "="},
{token::type::INT, "5"},
{token::type::SEMICOLON, ";"},
{token::type::LET, "let"},
{token::type::IDENTIFIER, "ten"},
{token::type::ASSIGN, "="},
{token::type::INT, "10"},
{token::type::SEMICOLON, ";"},
{token::type::LET, "let"},
{token::type::IDENTIFIER, "add"},
{token::type::ASSIGN, "="},
{token::type::FUNCTION, "fn"},
{token::type::LPAREN, "("},
{token::type::IDENTIFIER, "x"},
{token::type::COMMA, ","},
{token::type::IDENTIFIER, "y"},
{token::type::RPAREN, ")"},
{token::type::LBRACE, "{"},
{token::type::IDENTIFIER, "x"},
{token::type::PLUS, "+"},
{token::type::IDENTIFIER, "y"},
{token::type::SEMICOLON, ";"},
{token::type::RBRACE, "}"},
{token::type::SEMICOLON, ";"},
{token::type::LET, "let"},
{token::type::IDENTIFIER, "result"},
{token::type::ASSIGN, "="},
{token::type::IDENTIFIER, "add"},
{token::type::LPAREN, "("},
{token::type::IDENTIFIER, "five"},
{token::type::COMMA, ","},
{token::type::IDENTIFIER, "ten"},
{token::type::RPAREN, ")"},
{token::type::SEMICOLON, ";"},
{token::type::BANG, "!"},
{token::type::MINUS, "-"},
{token::type::SLASH, "/"},
{token::type::ASTERISK, "*"},
{token::type::INT, "5"},
{token::type::SEMICOLON, ";"},
{token::type::INT, "5"},
{token::type::LT, "<"},
{token::type::INT, "10"},
{token::type::GT, ">"},
{token::type::INT, "5"},
{token::type::SEMICOLON, ";"},
// clang-format on
};
for (const auto& t : tests) {
token::token tok = l.next_token();
CHECK(tok.type == t.expectedType);
CHECK(tok.literal == t.expectedLiteral);
}
};