public override bool Match(CFGNode node)
        {
            IsMatched = false;
            Patterns = new List<CostRestrictedStatementPattern>();
            MatchedNodes = new Tenpow.Collections.Generic.Set<CFGNode>();
            if (!PassesFilter(node))
            {
                return false;
            }
            int cost = 0;
            while (true)
            {
                CostRestrictedStatementPattern pattern = new CostRestrictedStatementPattern(CompileInfo);
                pattern.WorkingSet = WorkingSet;
                pattern.Matched += PatternMatched;
                pattern.MaxCost = MaxCost - cost;
                if (pattern.Match(node))
                {
                    cost += pattern.Cost;
                    Patterns.Add(pattern);

                    int topologicalOrder = -1;
                    // TODO: verify that last matched nodes are in topological order
                    foreach (CFGNode n in LastMatchedNodes)
                    {
                        if (CompileInfo.TopologicalOrder[n] > topologicalOrder)
                        {
                            topologicalOrder = CompileInfo.TopologicalOrder[n];
                        }
                    }
                    if (CompileInfo.TopologicalSort.Count == topologicalOrder + 1 || topologicalOrder == -1)
                    {
                        break;
                    }
                    node = CompileInfo.TopologicalSort[topologicalOrder + 1];
                    if (!PassesFilter(node))
                    {
                        break;
                    }
                }
                else
                {
                    break;
                }
            }
            OnMatched(new CFGPatternMatch(MatchedNodes));
            IsMatched = true;
            return true;
        }
 void PatternMatched(object sender, PatternMatchEventArgs<CFGPatternMatch> args)
 {
     MatchedNodes |= (LastMatchedNodes = args.Match.MatchedNodes);
 }