summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSlendi <slendi@socopon.com>2023-08-06 19:25:58 +0300
committerSlendi <slendi@socopon.com>2023-08-06 19:25:58 +0300
commitcbfd8e3fe8123ec680ee7c3e62dc47ba1bf0e497 (patch)
tree1e395045574c3cc0956100b0199599c4e2b24ca2
parent86cbf9cb889107c6fd6caea7a4fe791f06ecfc66 (diff)
Add pointers
Signed-off-by: Slendi <slendi@socopon.com>
-rw-r--r--holyparser.hpp38
-rw-r--r--src/holyparser.cpp20
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);