From 0baf896c3af3b472977f75a536f39f3e6e65b0a7 Mon Sep 17 00:00:00 2001 From: CHatingPython Date: Wed, 24 Jun 2026 15:27:29 +0200 Subject: [PATCH 1/3] feat: introduce int32 keyword Refs: #15 --- furc/include/furc/front/token.hpp | 4 ++++ furc/src/front/lexer.cpp | 1 + 2 files changed, 5 insertions(+) diff --git a/furc/include/furc/front/token.hpp b/furc/include/furc/front/token.hpp index e7c1058..386e6c4 100644 --- a/furc/include/furc/front/token.hpp +++ b/furc/include/furc/front/token.hpp @@ -146,6 +146,8 @@ enum class keyword_token { If, /**< `if` */ Else, /**< `else` */ While, /**< `while` */ + + Int32, /**< `int32` */ }; static inline std::ostream& operator<<(std::ostream& os, keyword_token keyword) { @@ -156,6 +158,7 @@ static inline std::ostream& operator<<(std::ostream& os, keyword_token keyword) case keyword_token::If: return os << "if"; case keyword_token::Else: return os << "else"; case keyword_token::While: return os << "while"; + case keyword_token::Int32: return os << "int32"; } return os; } @@ -168,6 +171,7 @@ static inline std::string operator+(const std::string& str, keyword_token keywor case keyword_token::If: return str + "if"; case keyword_token::Else: return str + "else"; case keyword_token::While: return str + "while"; + case keyword_token::Int32: return str + "int32"; } return str; } diff --git a/furc/src/front/lexer.cpp b/furc/src/front/lexer.cpp index 374b106..70007c0 100644 --- a/furc/src/front/lexer.cpp +++ b/furc/src/front/lexer.cpp @@ -100,6 +100,7 @@ token_r lexer::next_token() { { "if", keyword_token::If }, { "else", keyword_token::Else }, { "while", keyword_token::While }, + { "int32", keyword_token::Int32 }, }; if (auto it = s_keywords.find(value); it != s_keywords.end()) return { location, it->second }; From b5dcd6690a6a079a48f8071a9669edb0dc81785c Mon Sep 17 00:00:00 2001 From: CHatingPython Date: Wed, 24 Jun 2026 15:30:28 +0200 Subject: [PATCH 2/3] feat: introduce AST type class Refs: #15 --- furc/include/furc/ast/declaration.hpp | 15 +++++++++++++++ furc/include/furc/ast/fwd.hpp | 4 ++++ 2 files changed, 19 insertions(+) diff --git a/furc/include/furc/ast/declaration.hpp b/furc/include/furc/ast/declaration.hpp index 2de5134..12d45f2 100644 --- a/furc/include/furc/ast/declaration.hpp +++ b/furc/include/furc/ast/declaration.hpp @@ -5,10 +5,25 @@ #include "furc/ast/statement.hpp" #include +#include namespace furc { namespace ast { +/** + * @brief Type class for AST declarations. + */ +class type { +public: + template >> + type(NameFwd&& name) + : m_name(std::forward(name)) {} +public: + const std::string& name() const { return m_name; } +private: + std::string m_name; +}; + /** * @brief Declaration node type. */ diff --git a/furc/include/furc/ast/fwd.hpp b/furc/include/furc/ast/fwd.hpp index cb0d694..7844c17 100644 --- a/furc/include/furc/ast/fwd.hpp +++ b/furc/include/furc/ast/fwd.hpp @@ -71,6 +71,10 @@ using expression_node_p = node_p; /**< Alias for a shared point using expression_node_r = node_r; /**< Alias for expression_node result */ +class type; + +using type_r = furlang::result; /**< Alias for AST type result */ + class declaration_node; using declaration_node_p = node_p; /**< Alias for a shared pointer to declaration_node. */ From 70b7b6a2f44469e9f9aa1a41ad9e3fb6002e0103 Mon Sep 17 00:00:00 2001 From: CHatingPython Date: Wed, 24 Jun 2026 15:30:45 +0200 Subject: [PATCH 3/3] feat: introduce parse type function Refs: #15 --- furc/include/furc/front/parser.hpp | 3 +++ furc/src/front/parser.cpp | 8 ++++++++ 2 files changed, 11 insertions(+) diff --git a/furc/include/furc/front/parser.hpp b/furc/include/furc/front/parser.hpp index d9218df..3e760fe 100644 --- a/furc/include/furc/front/parser.hpp +++ b/furc/include/furc/front/parser.hpp @@ -1,6 +1,7 @@ #ifndef FURC_FRONT_PARSER_HPP #define FURC_FRONT_PARSER_HPP +#include "furc/ast/declaration.hpp" #include "furc/ast/fwd.hpp" #include "furc/front/lexer.hpp" #include "furlang/arena.hpp" @@ -56,6 +57,8 @@ public: */ ast::program_node_r parse() &; private: + ast::type_r parse_type(); + ast::declaration_node_r parse_declaration(); ast::statement_node_r parse_statement(); ast::expression_node_r parse_expression(std::uint32_t precedence = 16); diff --git a/furc/src/front/parser.cpp b/furc/src/front/parser.cpp index b2828b8..a2c18b2 100644 --- a/furc/src/front/parser.cpp +++ b/furc/src/front/parser.cpp @@ -6,6 +6,7 @@ #include "furc/ast/literal.hpp" // IWYU pragma: keep #include "furc/ast/program.hpp" // IWYU pragma: keep #include "furc/ast/statement.hpp" // IWYU pragma: keep +#include "furc/front/token.hpp" #include #include @@ -46,6 +47,13 @@ ast::program_node_r parser::parse() & { return program != nullptr ? std::move(program) : ast::program_node_r(ast::error{ location{ m_filename } }); } +ast::type_r parser::parse_type() { + auto token = eat_token(token_t::Keyword); + if (token.has_error() || token.value()->keyword != keyword_token::Int32) + return ast::type_r(ast::error{ token.error().location }); + return ast::type("" + token.value()->keyword); +} + ast::declaration_node_r parser::parse_declaration() { const auto& first = peek_token(); switch (first->type) {