00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #pragma once
00021 #ifndef EXTRACT_GHKM_PARSE_TREE_H_
00022 #define EXTRACT_GHKM_PARSE_TREE_H_
00023
00024 #include <string>
00025 #include <vector>
00026
00027 namespace Moses
00028 {
00029 namespace GHKM
00030 {
00031
00032 class ParseTree
00033 {
00034 public:
00035 ParseTree(const std::string &label)
00036 : m_label(label)
00037 , m_parent(0)
00038 , m_pcfgScore(0.0) {}
00039
00040 ~ParseTree();
00041
00042 const std::string &GetLabel() const {
00043 return m_label;
00044 }
00045 const std::vector<ParseTree*> &GetChildren() const {
00046 return m_children;
00047 }
00048 const ParseTree *GetParent() const {
00049 return m_parent;
00050 }
00051 float GetPcfgScore() const {
00052 return m_pcfgScore;
00053 }
00054
00055 void SetParent(ParseTree *);
00056 void SetChildren(const std::vector<ParseTree*> &);
00057 void SetPcfgScore(float score) {
00058 m_pcfgScore = score;
00059 }
00060
00061 void AddChild(ParseTree *);
00062
00063 bool IsLeaf() const;
00064
00065 template<typename OutputIterator>
00066 void GetLeaves(OutputIterator);
00067
00068 private:
00069
00070 ParseTree(const ParseTree &);
00071 ParseTree &operator=(const ParseTree &);
00072
00073 std::string m_label;
00074 std::vector<ParseTree*> m_children;
00075 ParseTree *m_parent;
00076 float m_pcfgScore;
00077 };
00078
00079 template<typename OutputIterator>
00080 void ParseTree::GetLeaves(OutputIterator result)
00081 {
00082 if (IsLeaf()) {
00083 *result++ = this;
00084 } else {
00085 std::vector<ParseTree *>::const_iterator p = m_children.begin();
00086 std::vector<ParseTree *>::const_iterator end = m_children.end();
00087 while (p != end) {
00088 ParseTree &child = **p++;
00089 child.GetLeaves(result);
00090 }
00091 }
00092 }
00093
00094 }
00095 }
00096
00097 #endif