extended single char tokens
This commit is contained in:
@@ -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 ';':
|
||||||
|
@@ -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, "(") \
|
||||||
|
@@ -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);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
Reference in New Issue
Block a user