#ifndef ZP_OPTIMIZER_H #define ZP_OPTIMIZER_H #include "Parser.h" namespace zp { // forward declarations enum class Instruction : char; struct Block; struct InstructionBlock; struct UnionBlock; struct Loop; class AstVisitor; struct BlockInstruction; class Optimizer; } class zp::AstVisitor { public: std::unique_ptr visit(Block& block); virtual std::unique_ptr visitLoop(Loop& loop) = 0; virtual std::unique_ptr visitInstructionBlock(InstructionBlock& ib) = 0; virtual std::unique_ptr visitUnionBlock(UnionBlock& ub) = 0; }; struct zp::BlockInstruction { }; class zp::Optimizer : public AstVisitor { public: std::unique_ptr visitLoop(Loop& loop) override; std::unique_ptr visitInstructionBlock(InstructionBlock& ib) override; std::unique_ptr visitUnionBlock(UnionBlock& ub) override; }; #endif /* ZP_OPTIMIZER_H */