void AlignmentGraph::ExtractMinimalRules(const Options &options) { // Determine which nodes are frontier nodes. std::set<Node *> frontierSet; ComputeFrontierSet(m_root, options, frontierSet); // Form the minimal frontier graph fragment rooted at each frontier node. std::vector<Subgraph> fragments; fragments.reserve(frontierSet.size()); for (std::set<Node *>::iterator p(frontierSet.begin()); p != frontierSet.end(); ++p) { Node *root = *p; Subgraph fragment = ComputeMinimalFrontierGraphFragment(root, frontierSet); assert(!fragment.IsTrivial()); // Can it form an SCFG rule? // FIXME Does this exclude non-lexical unary rules? if (root->GetType() == TREE && !root->GetSpan().empty()) { root->AddRule(new Subgraph(fragment)); } } }