From aaec4cefcf278d8292466f31e93fcd29e1131141 Mon Sep 17 00:00:00 2001 From: Karma Riuk Date: Fri, 11 Jul 2025 21:00:11 +0200 Subject: [PATCH] added prefix parsing for boolean literals --- src/parser/parser.cpp | 19 +++++++++++++++++++ src/parser/parser.hpp | 1 + test/parser/utils.cpp | 2 +- 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/parser/parser.cpp b/src/parser/parser.cpp index 06fd6a9..d4c0f79 100644 --- a/src/parser/parser.cpp +++ b/src/parser/parser.cpp @@ -1,6 +1,7 @@ #include "parser.hpp" #include "ast/errors/error.hpp" +#include "ast/expressions/boolean.hpp" #include "ast/expressions/identifier.hpp" #include "ast/expressions/infix.hpp" #include "ast/expressions/integer.hpp" @@ -39,6 +40,16 @@ namespace parser { std::bind(&parser::parse_prefix_expr, this) ); + register_prefix( + token::type::TRUE, + std::bind(&parser::parse_boolean, this) + ); + + register_prefix( + token::type::FALSE, + std::bind(&parser::parse_boolean, this) + ); + using namespace std::placeholders; register_infix( token::type::PLUS, @@ -223,6 +234,14 @@ namespace parser { return new ast::integer_literal(current, std::stoi(current.literal)); }; + ast::expression* parser::parse_boolean() { + // TRACE_FUNCTION; + return new ast::boolean_literal( + current, + current.type == token::type::TRUE + ); + }; + ast::expression* parser::parse_prefix_expr() { // TRACE_FUNCTION; ast::prefix_expr* ret = new ast::prefix_expr(current, current.literal); diff --git a/src/parser/parser.hpp b/src/parser/parser.hpp index 33d2a99..87679d4 100644 --- a/src/parser/parser.hpp +++ b/src/parser/parser.hpp @@ -49,6 +49,7 @@ namespace parser { ast::expression* parse_identifier(); ast::expression* parse_integer(); + ast::expression* parse_boolean(); ast::expression* parse_prefix_expr(); ast::expression* parse_infix_expr(ast::expression*); diff --git a/test/parser/utils.cpp b/test/parser/utils.cpp index b02f745..7cad464 100644 --- a/test/parser/utils.cpp +++ b/test/parser/utils.cpp @@ -58,7 +58,7 @@ void test_boolean_literal(ast::expression* expr, bool value) { REQUIRE(bool_lit->value == value); std::ostringstream oss; - oss << value; + oss << (value ? "true" : "false"); REQUIRE(bool_lit->token_literal() == oss.str()); }