string CDecoder::GenTree(const vector<CDepNode> &nodes, const int &root) { string tree; int kid; for (kid = int(nodes[root].leftMods.size()) - 1; kid >= 0; --kid) { tree += "(" + GenTree(nodes, nodes[root].leftMods[kid]) + ") "; } tree += m_vToken[root].word + "/" + m_vToken[root].POS; for (kid = 0; kid < int(nodes[root].rightMods.size()); ++kid) { tree += " (" + GenTree(nodes, nodes[root].rightMods[kid]) + ")"; } return tree; }
/* * Generates random connected undirected graphs. Unfortunately this current * implementation does not generate the graphs with a uniform distribution. * * Apparently a good reference is Tinhofer G., , * C. Hanser, Verlag, M\"{u}nchen 1980. */ Vertices * GenGraph(int nVertex, int nEdge) { Vertices * graph; assert(nEdge + 1 >= nVertex); assert(nEdge <= nVertex * (nVertex - 1) / 2); generatedEdges = 0; graph = GenTree(nVertex); graph = AddEdges(graph, nVertex, nEdge - nVertex + 1); return(graph); }
//由动作序列生成分析结果 void CDecoder::GetResult(const CState &state, string &result) { int root = state.stack.back().id; const vector<CDepPair> &edges = state.edges; vector<CDepNode> depNodes(m_vToken.size()); size_t i; for (i = 0; i < edges.size(); ++i) { int head = edges[i].head; int mod = edges[i].modifier; if (mod < head) { depNodes[head].leftMods.push_back(mod); } else { depNodes[head].rightMods.push_back(mod); } } result = "(" + GenTree(depNodes, root) + ")"; }