38 for(
auto it =
graph->begin(); it!=
graph->end(); it++)
40 for(
const CFLEdge* edge : (*it).second->getOutEdges())
50 for(
auto it =
graph->begin(); it!=
graph->end(); it++)
70 if (
grammar->hasProdsFromSingleRHS(Y))
84 if (
grammar->hasProdsFromFirstRHS(Y))
90 CFLNode* k = Z_edge->getDstNode();
102 if(
grammar->hasProdsFromSecondRHS(Y))
108 CFLNode* k = Z_edge->getSrcNode();
135 addEdge(edge->getSrcID(), edge->getDstID(), edge->getEdgeKind());
146 if (
grammar->hasProdsFromSingleRHS(Y))
162 if (
grammar->hasProdsFromFirstRHS(Y))
168 for (
NodeID diffDst: diffDsts)
178 if(
grammar->hasProdsFromSecondRHS(Y))
184 for (
NodeID diffSrc: diffSrcs)
194 for(
auto edge :
graph->getCFLEdges())
206 if (
addEdge(IDMap.first, IDMap.first, X))
224 if (
grammar->hasProdsFromSingleRHS(Y))
240 if (
grammar->hasProdsFromFirstRHS(Y))
252 for (
NodeID diffDst: diffDsts)
263 if(
grammar->hasProdsFromSecondRHS(Y))
275 for (
NodeID diffSrc: diffSrcs)
286 for(
auto edge :
graph->getCFLEdges())
292 for (
auto it =
graph->begin(); it !=
graph->end(); ++it)
304 if (
addEdge(IDMap.first, IDMap.first, X))
319 for (
auto& iter:
indMap[src])
337 meld_h(x, newVNode, vChild);
343 auto it =
indMap.find(dst);
346 return (it->second.find(src) != it->second.end());
352 auto resIns =
indMap[dst].insert(std::make_pair(src, newNode));
354 return resIns.first->second;
363 for (
auto iter:
indMap[src])
379 meld_h(x, newVNode, vChild);
GEdgeKind getEdgeKind() const
const CFLEdge::CFLEdgeSetTy & getOutEdgeWithTy(GrammarBase::Symbol s)
const CFLEdge::CFLEdgeSetTy & getInEdgeWithTy(GrammarBase::Symbol s)
virtual void solve()
Start solving.
static double numOfChecks
virtual void processCFLEdge(const CFLEdge *Y_edge)
Process CFLEdge.
virtual void initialize()
Initialize worklist.
CFGrammar::Production Production
virtual bool pushIntoWorklist(const CFLEdge *item)
virtual bool isWorklistEmpty()
const CFLEdge * popFromWorklist()
Worklist operations.
NodeType * getSrcNode() const
NodeType * getDstNode() const
TreeNode * getNode_h(NodeID src, NodeID dst)
Get the node dst in tree(src).
void insertEdge_h(TreeNode *u, TreeNode *v)
add v into desc(x) as a child of u
virtual void initialize()
Initialize worklist.
void meld(NodeID x, TreeNode *uNode, TreeNode *vNode)
void meld_h(NodeID x, TreeNode *uNode, TreeNode *vNode)
bool hasInd_h(NodeID src, NodeID dst)
void addArc_h(NodeID src, NodeID dst)
void addArc(NodeID src, NodeID dst)
TreeNode * addInd_h(NodeID src, NodeID dst)
Add a node dst to tree(src).
Map< NodeID, std::unordered_map< NodeID, TreeNode * > > indMap
virtual void processCFLEdge(const CFLEdge *Y_edge)
Process CFLEdge.
bool hasEdge(const NodeID src, const NodeID dst, const Label ty)
find src -> find src[ty] -> find dst in set
virtual void processCFLEdge(const CFLEdge *Y_edge)
Process CFLEdge.
NodeBS addEdges(const NodeID src, const NodeBS &dstData, const Label ty)
add edges and return the set of added edges (dst) for src
bool addEdge(const NodeID src, const NodeID dst, const Label ty)
virtual void initialize()
Initialize worklist.
virtual void buildCFLData()
Init CFLData.
NodeID getId() const
Get ID.
std::unordered_set< TreeNode * > children