00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #pragma once
00021 #ifndef PCFG_SYNTAX_TREE_H_
00022 #define PCFG_SYNTAX_TREE_H_
00023
00024 #include <cassert>
00025 #include <vector>
00026
00027 namespace Moses
00028 {
00029 namespace PCFG
00030 {
00031
00032
00033 template<typename T, typename DerivedType>
00034 class SyntaxTreeBase
00035 {
00036 public:
00037
00038 SyntaxTreeBase(const T &label)
00039 : label_(label)
00040 , children_()
00041 , parent_(0) {}
00042
00043 SyntaxTreeBase(const T &label, const std::vector<DerivedType *> &children)
00044 : label_(label)
00045 , children_(children)
00046 , parent_(0) {}
00047
00048
00049 virtual ~SyntaxTreeBase();
00050
00051 const T &label() const {
00052 return label_;
00053 }
00054 const DerivedType *parent() const {
00055 return parent_;
00056 }
00057 DerivedType *parent() {
00058 return parent_;
00059 }
00060 const std::vector<DerivedType *> &children() const {
00061 return children_;
00062 }
00063 std::vector<DerivedType *> &children() {
00064 return children_;
00065 }
00066
00067 void set_label(const T &label) {
00068 label_ = label;
00069 }
00070 void set_parent(DerivedType *parent) {
00071 parent_ = parent;
00072 }
00073 void set_children(const std::vector<DerivedType *> &c) {
00074 children_ = c;
00075 }
00076
00077 bool IsLeaf() const {
00078 return children_.empty();
00079 }
00080
00081 bool IsPreterminal() const {
00082 return children_.size() == 1 && children_[0]->IsLeaf();
00083 }
00084
00085 void AddChild(DerivedType *child) {
00086 children_.push_back(child);
00087 }
00088
00089 private:
00090 T label_;
00091 std::vector<DerivedType *> children_;
00092 DerivedType *parent_;
00093 };
00094
00095 template<typename T>
00096 class SyntaxTree : public SyntaxTreeBase<T, SyntaxTree<T> >
00097 {
00098 public:
00099 typedef SyntaxTreeBase<T, SyntaxTree<T> > BaseType;
00100 SyntaxTree(const T &label) : BaseType(label) {}
00101 SyntaxTree(const T &label, const std::vector<SyntaxTree *> &children)
00102 : BaseType(label, children) {}
00103 };
00104
00105 template<typename T, typename DerivedType>
00106 SyntaxTreeBase<T, DerivedType>::~SyntaxTreeBase()
00107 {
00108 for (std::size_t i = 0; i < children_.size(); ++i) {
00109 delete children_[i];
00110 }
00111 }
00112
00113 }
00114 }
00115
00116 #endif