implemented infix operator parsing

This commit is contained in:
Karma Riuk
2025-07-11 10:30:37 +02:00
parent 6e471a91d5
commit a7f5950a55
7 changed files with 155 additions and 6 deletions

View File

@@ -0,0 +1,51 @@
#include "parser/parser.hpp"
#include <doctest.h>
TEST_SUITE("Precedence") {
TEST_CASE("Raw precedence") {
CHECK(parser::precedence::LOWEST < parser::precedence::EQUALS);
CHECK(parser::precedence::LOWEST < parser::precedence::LESS_GREATER);
CHECK(parser::precedence::LOWEST < parser::precedence::SUM);
CHECK(parser::precedence::LOWEST < parser::precedence::PRODUCT);
CHECK(parser::precedence::LOWEST < parser::precedence::PREFIX);
CHECK(parser::precedence::LOWEST < parser::precedence::CALL);
CHECK(parser::precedence::EQUALS < parser::precedence::LESS_GREATER);
CHECK(parser::precedence::EQUALS < parser::precedence::SUM);
CHECK(parser::precedence::EQUALS < parser::precedence::PRODUCT);
CHECK(parser::precedence::EQUALS < parser::precedence::PREFIX);
CHECK(parser::precedence::EQUALS < parser::precedence::CALL);
CHECK(parser::precedence::LESS_GREATER < parser::precedence::SUM);
CHECK(parser::precedence::LESS_GREATER < parser::precedence::PRODUCT);
CHECK(parser::precedence::LESS_GREATER < parser::precedence::PREFIX);
CHECK(parser::precedence::LESS_GREATER < parser::precedence::CALL);
CHECK(parser::precedence::SUM < parser::precedence::PRODUCT);
CHECK(parser::precedence::SUM < parser::precedence::PREFIX);
CHECK(parser::precedence::SUM < parser::precedence::CALL);
CHECK(parser::precedence::PRODUCT < parser::precedence::PREFIX);
CHECK(parser::precedence::PRODUCT < parser::precedence::CALL);
CHECK(parser::precedence::PREFIX < parser::precedence::CALL);
}
TEST_CASE("Operator precedence") {
auto& prec = parser::precedence_for;
CHECK(prec(token::type::EQ) == prec(token::type::NEQ));
CHECK(prec(token::type::LT) == prec(token::type::GT));
CHECK(prec(token::type::PLUS) == prec(token::type::MINUS));
CHECK(prec(token::type::ASTERISK) == prec(token::type::SLASH));
CHECK(prec(token::type::EQ) < prec(token::type::LT));
CHECK(prec(token::type::EQ) < prec(token::type::PLUS));
CHECK(prec(token::type::EQ) < prec(token::type::ASTERISK));
CHECK(prec(token::type::LT) < prec(token::type::PLUS));
CHECK(prec(token::type::LT) < prec(token::type::ASTERISK));
CHECK(prec(token::type::PLUS) < prec(token::type::ASTERISK));
}
}