From e170afc8404e05eaa85beb87395f2d955c8b5861 Mon Sep 17 00:00:00 2001 From: Karma Riuk Date: Fri, 11 Jul 2025 22:17:01 +0200 Subject: [PATCH] used overloaded function to make code cleaner --- src/parser/parser.cpp | 70 ++++++++++++++++++------------------------- src/parser/parser.hpp | 2 ++ 2 files changed, 31 insertions(+), 41 deletions(-) diff --git a/src/parser/parser.cpp b/src/parser/parser.cpp index d4c0f79..c7466a8 100644 --- a/src/parser/parser.cpp +++ b/src/parser/parser.cpp @@ -31,56 +31,31 @@ namespace parser { ); register_prefix( - token::type::BANG, + { + token::type::BANG, + token::type::MINUS, + }, std::bind(&parser::parse_prefix_expr, this) ); register_prefix( - token::type::MINUS, - std::bind(&parser::parse_prefix_expr, this) - ); - - register_prefix( - token::type::TRUE, - std::bind(&parser::parse_boolean, this) - ); - - register_prefix( - token::type::FALSE, + { + token::type::TRUE, + token::type::FALSE, + }, std::bind(&parser::parse_boolean, this) ); using namespace std::placeholders; register_infix( - token::type::PLUS, - std::bind(&parser::parse_infix_expr, this, _1) - ); - register_infix( - token::type::MINUS, - std::bind(&parser::parse_infix_expr, this, _1) - ); - register_infix( - 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, + {token::type::PLUS, + token::type::MINUS, + token::type::ASTERISK, + token::type::SLASH, + token::type::EQ, + token::type::NEQ, + token::type::GT, + token::type::LT}, std::bind(&parser::parse_infix_expr, this, _1) ); } @@ -221,10 +196,23 @@ namespace parser { prefix_parse_fns[type] = fn; }; + void parser::register_prefix( + std::vector types, prefix_parse_fn fn + ) { + for (auto& type : types) + register_prefix(type, fn); + }; + void parser::register_infix(token::type type, infix_parse_fn fn) { infix_parse_fns[type] = fn; }; + void + parser::register_infix(std::vector types, infix_parse_fn fn) { + for (auto& type : types) + register_infix(type, fn); + }; + ast::expression* parser::parse_identifier() { return new ast::identifier(current, current.literal); }; diff --git a/src/parser/parser.hpp b/src/parser/parser.hpp index 87679d4..7121eb9 100644 --- a/src/parser/parser.hpp +++ b/src/parser/parser.hpp @@ -45,7 +45,9 @@ namespace parser { void unkown_prefix_error(token::token); void register_prefix(token::type, prefix_parse_fn); + void register_prefix(std::vector, prefix_parse_fn); void register_infix(token::type, infix_parse_fn); + void register_infix(std::vector, infix_parse_fn); ast::expression* parse_identifier(); ast::expression* parse_integer();