Line data Source code
1 : #ifndef DAG_HPP 2 : #define DAG_HPP 3 : 4 : #include <vector> 5 : #include <utility> 6 : #include "common/exprtype.hpp" 7 : #include "common/tables.hpp" 8 : #include "common/poliz.hpp" 9 : 10 : struct DAGRow { 11 : type_t type; 12 : IdentTable * ident; 13 : op_t opcode; 14 : DAGRow * lvar; 15 : DAGRow * rvar; 16 : DAGRow * prev; 17 : bool assigned; 18 : 19 : static std::vector<DAGRow *> created; 20 : 21 0 : DAGRow(): type(_NONE_), ident(nullptr), opcode((op_t) NONE), lvar(nullptr), 22 0 : rvar(nullptr), prev(nullptr), assigned(false) { 23 0 : created.push_back(this); 24 0 : }; 25 : void decompose(POLIZ & p, std::vector<DAGRow *> * asd); 26 : bool isLast(void) const; 27 : type_t updateType(std::vector<type_t> * typeOnStack = nullptr); 28 : 29 : friend bool operator==(DAGRow & a, DAGRow & b); 30 : DAGRow & operator=(const DAGRow & dr); 31 : DAGRow(const DAGRow & dr); 32 : 33 : }; 34 : 35 : /* 36 : * #N OP #1OP #2OP VAR 37 : */ 38 : class DirectedAcyclicGraph { 39 : std::vector<DAGRow *> rows; 40 : POLIZ stashed; 41 : bool verbose; 42 : public: 43 58 : explicit DirectedAcyclicGraph(bool v): verbose(v) {}; 44 : void make(POLIZ p); 45 : POLIZ decompose(std::vector<type_t> * typeOnStack); 46 : void updateTypes(void); 47 : 48 : void commonSubExpr(IdentTable * IT); 49 : 50 : void stash(POLIZ & p); 51 : 52 : std::pair<std::pair<DAGRow *, DAGRow *>, int> findCopies( 53 : DAGRow * left, DAGRow * right, int a, int b); 54 : 55 : ~DirectedAcyclicGraph(); 56 : }; 57 : 58 : #endif