diff --git a/src/language/ASTNode.hpp b/src/language/ASTNode.hpp index 53d20e687ca5da7ffa77db39afd2581e9a404ba9..e8ef09b3af830bbf78f5f218ab0cfa020392f13b 100644 --- a/src/language/ASTNode.hpp +++ b/src/language/ASTNode.hpp @@ -7,64 +7,13 @@ #include <ASTNodeDataType.hpp> #include <ASTNodeDataVariant.hpp> +#include <ExecUntilBreakOrContinue.hpp> +#include <INodeProcessor.hpp> + #include <pegtl/contrib/parse_tree.hpp> using namespace TAO_PEGTL_NAMESPACE; -struct ExecUntilBreakOrContinue -{ - enum class JumpType - { - no_jump, - break_jump, - continue_jump - }; - - private: - JumpType m_jump_type{JumpType::no_jump}; - bool m_exec{true}; - - public: - PUGS_INLINE - bool - exec() const - { - return m_exec; - } - - PUGS_INLINE - JumpType - jumpType() const - { - return m_jump_type; - } - - ExecUntilBreakOrContinue& operator=(const ExecUntilBreakOrContinue&) = delete; - ExecUntilBreakOrContinue& operator=(ExecUntilBreakOrContinue&&) = default; - - ExecUntilBreakOrContinue() = default; - - constexpr ExecUntilBreakOrContinue(const JumpType& jump_type) - : m_jump_type(jump_type), m_exec((jump_type == JumpType::no_jump)) - { - ; - } -}; - -class INodeProcessor -{ - public: - virtual void execute(ExecUntilBreakOrContinue& exec_policy) = 0; - - virtual std::string describe() const = 0; - - INodeProcessor(const INodeProcessor&) = delete; - - INodeProcessor() = default; - - virtual ~INodeProcessor() = default; -}; - class SymbolTable; struct ASTNode : public parse_tree::basic_node<ASTNode> @@ -72,6 +21,9 @@ struct ASTNode : public parse_tree::basic_node<ASTNode> std::shared_ptr<SymbolTable> m_symbol_table; std::unique_ptr<INodeProcessor> m_node_processor; + ASTNodeDataType m_data_type{ASTNodeDataType::undefined_t}; + ASTNodeDataVariant m_value; + PUGS_INLINE void execute(ExecUntilBreakOrContinue& exec_policy) @@ -81,9 +33,6 @@ struct ASTNode : public parse_tree::basic_node<ASTNode> m_node_processor->execute(exec_policy); } } - - ASTNodeDataType m_data_type{ASTNodeDataType::undefined_t}; - ASTNodeDataVariant m_value; }; #endif // AST_NODE_HPP diff --git a/src/language/ExecUntilBreakOrContinue.hpp b/src/language/ExecUntilBreakOrContinue.hpp new file mode 100644 index 0000000000000000000000000000000000000000..2f2d44313bc6767476c6926dee07cbe33b6866f5 --- /dev/null +++ b/src/language/ExecUntilBreakOrContinue.hpp @@ -0,0 +1,44 @@ +#ifndef EXEC_UNTIL_BREAK_OR_CONTINUE_HPP +#define EXEC_UNTIL_BREAK_OR_CONTINUE_HPP + +struct ExecUntilBreakOrContinue +{ + enum class JumpType + { + no_jump, + break_jump, + continue_jump + }; + + private: + JumpType m_jump_type{JumpType::no_jump}; + bool m_exec{true}; + + public: + PUGS_INLINE + bool + exec() const + { + return m_exec; + } + + PUGS_INLINE + JumpType + jumpType() const + { + return m_jump_type; + } + + ExecUntilBreakOrContinue& operator=(const ExecUntilBreakOrContinue&) = delete; + ExecUntilBreakOrContinue& operator=(ExecUntilBreakOrContinue&&) = default; + + ExecUntilBreakOrContinue() = default; + + constexpr ExecUntilBreakOrContinue(const JumpType& jump_type) + : m_jump_type(jump_type), m_exec((jump_type == JumpType::no_jump)) + { + ; + } +}; + +#endif // EXEC_UNTIL_BREAK_OR_CONTINUE_HPP diff --git a/src/language/INodeProcessor.hpp b/src/language/INodeProcessor.hpp new file mode 100644 index 0000000000000000000000000000000000000000..0ae3083f63d30548f553bb9cd5dd71359c47d67a --- /dev/null +++ b/src/language/INodeProcessor.hpp @@ -0,0 +1,19 @@ +#ifndef I_NODE_PROCESSOR_HPP +#define I_NODE_PROCESSOR_HPP + +class ExecUntilBreakOrContinue; + +struct INodeProcessor +{ + virtual void execute(ExecUntilBreakOrContinue& exec_policy) = 0; + + virtual std::string describe() const = 0; + + INodeProcessor(const INodeProcessor&) = delete; + + INodeProcessor() = default; + + virtual ~INodeProcessor() = default; +}; + +#endif // I_NODE_PROCESSOR_HPP