diff options
author | Slendi <slendi@socopon.com> | 2023-08-06 19:25:58 +0300 |
---|---|---|
committer | Slendi <slendi@socopon.com> | 2023-08-06 19:25:58 +0300 |
commit | cbfd8e3fe8123ec680ee7c3e62dc47ba1bf0e497 (patch) | |
tree | 1e395045574c3cc0956100b0199599c4e2b24ca2 | |
parent | 86cbf9cb889107c6fd6caea7a4fe791f06ecfc66 (diff) |
Add pointers
Signed-off-by: Slendi <slendi@socopon.com>
-rw-r--r-- | holyparser.hpp | 38 | ||||
-rw-r--r-- | src/holyparser.cpp | 20 |
2 files changed, 56 insertions, 2 deletions
diff --git a/holyparser.hpp b/holyparser.hpp index a85dd78..d911db9 100644 --- a/holyparser.hpp +++ b/holyparser.hpp @@ -242,6 +242,38 @@ private: std::shared_ptr<ASTNode> const m_value; }; +class HOLYPARSER_PUBLIC FromPointerNode : public ASTNode +{ +public: + FromPointerNode(std::shared_ptr<ASTNode> value) + : m_value(std::move(value)) + { } + + virtual std::string_view node_name() override { return "FromPointerNode"sv; }; + virtual void print(std::string indent = "") override; + + auto value() const { return m_value; } + +private: + std::shared_ptr<ASTNode> const m_value; +}; + +class HOLYPARSER_PUBLIC ToPointerNode : public ASTNode +{ +public: + ToPointerNode(std::shared_ptr<ASTNode> value) + : m_value(std::move(value)) + { } + + virtual std::string_view node_name() override { return "ToPointerNode"sv; }; + virtual void print(std::string indent = "") override; + + auto value() const { return m_value; } + +private: + std::shared_ptr<ASTNode> const m_value; +}; + class HOLYPARSER_PUBLIC BooleanNegationNode : public ASTNode { public: @@ -530,6 +562,12 @@ private: std::string_view m_str; }; +class HOLYPARSER_PUBLIC ClassNode : public ASTNode +{ +public: + ClassNode(std::shared_ptr<DefinitionsNode> definitions); +}; + class HOLYPARSER_PUBLIC HolyParser { public: diff --git a/src/holyparser.cpp b/src/holyparser.cpp index 9741537..fbbc48d 100644 --- a/src/holyparser.cpp +++ b/src/holyparser.cpp @@ -1,4 +1,3 @@ -#include "fmt/core.h" #include <holyparser.hpp> #include <fmt/std.h> @@ -47,6 +46,18 @@ void NegationNode::print(std::string indent) if (m_value != nullptr) m_value->print(indent + INDENT); } +void ToPointerNode::print(std::string indent) +{ + fmt::print("{} {}\n", indent, node_name()); + if (m_value != nullptr) m_value->print(indent + INDENT); +} + +void FromPointerNode::print(std::string indent) +{ + fmt::print("{} {}\n", indent, node_name()); + if (m_value != nullptr) m_value->print(indent + INDENT); +} + void BooleanNegationNode::print(std::string indent) { fmt::print("{} {}\n", indent, node_name()); @@ -388,6 +399,10 @@ std::shared_ptr<ASTNode> const HolyParser::parse_bit_shift_pow() BooleanNegationNode(parse_bit_shift_pow())); else if (accept(TokenType::Subtract)) return std::make_shared<NegationNode>(NegationNode(parse_bit_shift_pow())); + else if (accept(TokenType::Multiply)) + return std::make_shared<FromPointerNode>(FromPointerNode(parse_bit_shift_pow())); + else if (accept(TokenType::BitwiseAnd)) + return std::make_shared<ToPointerNode>(ToPointerNode(parse_bit_shift_pow())); else node = parse_dot_access(); while (m_tok == TokenType::LeftBitShift || m_tok == TokenType::RightBitShift @@ -562,7 +577,8 @@ std::shared_ptr<ASTNode> const HolyParser::parse_type() if (accept(TokenType::Class)) { auto class_name_tok = m_tok; std::string_view class_name = std::get<std::string_view>(class_name_tok.v); - if (expect(TokenType::Identifier)) class_name = std::get<std::string_view>(m_tok.v); + if (m_tok == TokenType::Identifier) class_name = std::get<std::string_view>(m_tok.v); + expect(TokenType::Identifier); expect(TokenType::LBracket); // FIXME: Parse class defs expect(TokenType::RBracket); |