#ifndef ZP_OPTIMIZER_H #define ZP_OPTIMIZER_H #include "Parser.h" #include #include #include namespace zp { // forward declarations enum class Instruction : char; struct Block; struct InstructionBlock; struct UnionBlock; struct Loop; class AstVisitor; struct BlockInstruction; struct UnionBlockInstruction; struct IOInstruction; struct SimpleBlockInstruction; struct LinearLoopInstruction; struct LoopInstruction; class Optimizer; using Index = int; using Cell = uint8_t; // forward declaration class IRVisitor; } 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 visitIOBlock(IOBlock& io) = 0; virtual std::unique_ptr visitUnionBlock(UnionBlock& ub) = 0; }; struct zp::BlockInstruction { virtual ~BlockInstruction(void) = default; virtual void accept(IRVisitor& v) = 0; }; struct zp::UnionBlockInstruction : public BlockInstruction { std::vector> content; virtual void accept(IRVisitor& v); }; struct zp::IOInstruction : public BlockInstruction { /// true on "," (reads) false on "." (writes) bool isRead; inline IOInstruction(bool isRead) : isRead{isRead} {} virtual void accept(IRVisitor& v); }; struct zp::SimpleBlockInstruction : public BlockInstruction { Index pointerMoved; std::map added; virtual void accept(IRVisitor& v); }; struct zp::LinearLoopInstruction : public BlockInstruction { Cell increment; std::map factors; inline LinearLoopInstruction(void) : increment{ 0 } {} virtual void accept(IRVisitor& v); }; struct zp::LoopInstruction : public UnionBlockInstruction { virtual void accept(IRVisitor& v); }; class zp::Optimizer : public AstVisitor { public: std::unique_ptr visitLoop(Loop& loop) override; std::unique_ptr visitInstructionBlock(InstructionBlock& ib) override; std::unique_ptr visitIOBlock(IOBlock& io) override; std::unique_ptr visitUnionBlock(UnionBlock& ub) override; }; #endif /* ZP_OPTIMIZER_H */