used overloaded function to make code cleaner
This commit is contained in:
@@ -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);
|
||||||
};
|
};
|
||||||
|
@@ -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();
|
||||||
|
Reference in New Issue
Block a user