Add AST visitor

Signed-off-by: CHatingPython <chatingpython@gmail.com>
This commit is contained in:
CHatingPython
2026-05-31 13:12:22 +02:00
committed by CHatingPython
parent 2395ee9977
commit b2e33e1bdd
9 changed files with 114 additions and 11 deletions
+4
View File
@@ -36,6 +36,8 @@ public:
front::token name() const { return m_name; }
public:
void accept(visitor& visitor) const override;
std::ostream& print(std::ostream& os) const override;
protected:
bool equal(const node& rhs) const override;
@@ -65,6 +67,8 @@ public:
const function_body_h& body() const { return m_body; }
public:
void accept(visitor& visitor) const override;
std::ostream& print(std::ostream& os) const override;
protected:
bool equal(const node& rhs) const override;
+8
View File
@@ -36,6 +36,8 @@ public:
handle<std::string_view>&& move_name() { return std::move(m_name); }
public:
expression_node_t expression_type() const override { return expression_node_t::VarRead; }
public:
void accept(visitor& visitor) const override;
std::ostream& print(std::ostream& os) const override;
protected:
@@ -66,6 +68,8 @@ public:
expression_node_h&& move_node() { return std::move(m_node); }
public:
expression_node_t expression_type() const override { return expression_node_t::Unaryop; }
public:
void accept(visitor& visitor) const override;
std::ostream& print(std::ostream& os) const override;
protected:
@@ -105,6 +109,8 @@ public:
expression_node_h&& move_rhs() { return std::move(m_rhs); };
public:
expression_node_t expression_type() const override { return expression_node_t::Binop; }
public:
void accept(visitor& visitor) const override;
std::ostream& print(std::ostream& os) const override;
protected:
@@ -128,6 +134,8 @@ public:
const expression_node_h& rhs() const { return m_rhs; }
public:
expression_node_t expression_type() const override { return expression_node_t::VarAssign; }
public:
void accept(visitor& visitor) const override;
std::ostream& print(std::ostream& os) const override;
protected:
+2 -2
View File
@@ -10,8 +10,8 @@ namespace ast {
class node;
template <typename T, typename Error = std::string>
using node_handle = handle<T*, Error>;
template <typename T>
using node_handle = handle<T*, std::string>;
class literal_node;
using literal_node_h = node_handle<literal_node>;
+4
View File
@@ -33,6 +33,8 @@ public:
const handle<std::string_view>& value() const { return m_value; }
public:
void accept(visitor& visitor) const override;
std::ostream& print(std::ostream& os) const override;
protected:
bool equal(const node& rhs) const override;
@@ -51,6 +53,8 @@ public:
bool operator==(front::integer_token integer) const { return m_value == integer; }
public:
void accept(visitor& visitor) const override;
std::ostream& print(std::ostream& os) const override;
protected:
bool equal(const node& rhs) const override;
+3
View File
@@ -2,6 +2,7 @@
#define FURC_AST_NODE_HPP
#include "furc/ast/fwd.hpp"
#include "furc/ast/visitor.hpp"
namespace furc {
namespace ast {
@@ -39,6 +40,8 @@ public:
bool operator==(const node& rhs) const { return category() == rhs.category() && equal(rhs); }
bool operator!=(const node& rhs) const { return !this->operator==(rhs); }
public:
virtual void accept(visitor& visitor) const = 0;
virtual std::ostream& print(std::ostream& os) const = 0;
friend std::ostream& operator<<(std::ostream& os, const node& node) { return node.print(os); }
+2
View File
@@ -19,6 +19,8 @@ public:
const std::vector<node_handle<declaration_node>>& declarations() const { return m_declarations; }
public:
void accept(visitor& visitor) const override;
std::ostream& print(std::ostream& os) const override;
protected:
bool equal(const node& rhs) const override;
+2
View File
@@ -31,6 +31,8 @@ public:
node_handle<expression_node> value() const { return m_value; }
public:
statement_node_t statement_type() const override { return statement_node_t::Return; }
public:
void accept(visitor& visitor) const override;
std::ostream& print(std::ostream& os) const override;
protected:
+34
View File
@@ -0,0 +1,34 @@
#ifndef FURC_AST_VISITOR_HPP
#define FURC_AST_VISITOR_HPP
#include "furc/ast/fwd.hpp"
namespace furc {
namespace ast {
class visitor {
public:
virtual ~visitor() = default;
visitor(visitor&&) = default;
visitor& operator=(visitor&&) = default;
visitor(const visitor&) = default;
visitor& operator=(const visitor&) = default;
public:
virtual void visit_string_literal_node(const string_literal_node&) {}
virtual void visit_integer_literal_node(const integer_literal_node&) {}
virtual void visit_var_read_expression_node(const var_read_expression_node&) {}
virtual void visit_unaryop_expression_node(const unaryop_expression_node&) {}
virtual void visit_binop_expression_node(const binop_expression_node&) {}
virtual void visit_var_assign_expression_node(const var_assign_expression_node&) {}
virtual void visit_function_declaration_node(const function_declaration_node&) {}
virtual void visit_function_definition_node(const function_definition_node&) {}
virtual void visit_return_statement_node(const return_statement_node&) {}
virtual void visit_error(const node_handle<node>& handle) {}
};
} // namespace ast
} // namespace furc
#endif // FURC_AST_VISITOR_HPP