used overloaded function to make code cleaner

This commit is contained in:
Karma Riuk
2025-07-11 22:17:01 +02:00
parent aaec4cefcf
commit e170afc840
2 changed files with 31 additions and 41 deletions

View File

@@ -31,56 +31,31 @@ namespace parser {
); );
register_prefix( register_prefix(
token::type::BANG, {
token::type::BANG,
token::type::MINUS,
},
std::bind(&parser::parse_prefix_expr, this) std::bind(&parser::parse_prefix_expr, this)
); );
register_prefix( register_prefix(
token::type::MINUS, {
std::bind(&parser::parse_prefix_expr, this) token::type::TRUE,
); token::type::FALSE,
},
register_prefix(
token::type::TRUE,
std::bind(&parser::parse_boolean, this)
);
register_prefix(
token::type::FALSE,
std::bind(&parser::parse_boolean, this) std::bind(&parser::parse_boolean, this)
); );
using namespace std::placeholders; using namespace std::placeholders;
register_infix( register_infix(
token::type::PLUS, {token::type::PLUS,
std::bind(&parser::parse_infix_expr, this, _1) token::type::MINUS,
); token::type::ASTERISK,
register_infix( token::type::SLASH,
token::type::MINUS, token::type::EQ,
std::bind(&parser::parse_infix_expr, this, _1) token::type::NEQ,
); token::type::GT,
register_infix( token::type::LT},
token::type::ASTERISK,
std::bind(&parser::parse_infix_expr, this, _1)
);
register_infix(
token::type::SLASH,
std::bind(&parser::parse_infix_expr, this, _1)
);
register_infix(
token::type::EQ,
std::bind(&parser::parse_infix_expr, this, _1)
);
register_infix(
token::type::NEQ,
std::bind(&parser::parse_infix_expr, this, _1)
);
register_infix(
token::type::GT,
std::bind(&parser::parse_infix_expr, this, _1)
);
register_infix(
token::type::LT,
std::bind(&parser::parse_infix_expr, this, _1) std::bind(&parser::parse_infix_expr, this, _1)
); );
} }
@@ -221,10 +196,23 @@ namespace parser {
prefix_parse_fns[type] = fn; prefix_parse_fns[type] = fn;
}; };
void parser::register_prefix(
std::vector<token::type> types, prefix_parse_fn fn
) {
for (auto& type : types)
register_prefix(type, fn);
};
void parser::register_infix(token::type type, infix_parse_fn fn) { void parser::register_infix(token::type type, infix_parse_fn fn) {
infix_parse_fns[type] = fn; infix_parse_fns[type] = fn;
}; };
void
parser::register_infix(std::vector<token::type> types, infix_parse_fn fn) {
for (auto& type : types)
register_infix(type, fn);
};
ast::expression* parser::parse_identifier() { ast::expression* parser::parse_identifier() {
return new ast::identifier(current, current.literal); return new ast::identifier(current, current.literal);
}; };

View File

@@ -45,7 +45,9 @@ namespace parser {
void unkown_prefix_error(token::token); void unkown_prefix_error(token::token);
void register_prefix(token::type, prefix_parse_fn); void register_prefix(token::type, prefix_parse_fn);
void register_prefix(std::vector<token::type>, prefix_parse_fn);
void register_infix(token::type, infix_parse_fn); void register_infix(token::type, infix_parse_fn);
void register_infix(std::vector<token::type>, infix_parse_fn);
ast::expression* parse_identifier(); ast::expression* parse_identifier();
ast::expression* parse_integer(); ast::expression* parse_integer();