00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef DeSR_Sentence_H
00025 #define DeSR_Sentence_H
00026
00027 #include "Token.h"
00028
00029 namespace Tanl {
00030
00031 class Corpus;
00032
00036 class Sentence : public std::vector<TreeToken*>
00037 {
00038 public:
00039 Language const* language;
00040
00041 Sentence(Language const* language = 0) :
00042 language(language)
00043 { }
00044
00045 Sentence(Sentence const& other) :
00046 language(other.language) {
00047 FOR_EACH (Sentence, other, tit)
00048 push_back(new TreeToken(**tit));
00049 }
00050
00051 virtual ~Sentence() {
00052 FOR_EACH (std::vector<TreeToken*>, *this, it)
00053 delete *it;
00054 }
00055
00056 bool operator ==(const Sentence& other) {
00057 if (size() != other.size())
00058 return false;
00059 for (size_t i = 0; i < size(); i++)
00060 if (*(*this)[i] != *other[i])
00061 return false;
00062 return true;
00063 }
00064 bool operator !=(const Sentence& other) { return !(*this == other); }
00065
00067 void reverse() {
00068 int i = 0;
00069 int j = size() - 1;
00070 for (; i < j; i++, j--) {
00071 TreeToken* tmpi = operator[](i);
00072 tmpi->id = j + 1;
00073 int head = tmpi->linkHead();
00074 if (head)
00075 tmpi->linkHead(size() - head + 1);
00076 TreeToken* tmpj = operator[](j);
00077 tmpj->id = i + 1;
00078 head = tmpj->linkHead();
00079 if (head)
00080 tmpj->linkHead(size() - head + 1);
00081 operator[](i) = tmpj;
00082 operator[](j) = tmpi;
00083 }
00084 if (i == j) {
00085 TreeToken* tmpi = operator[](i);
00086 int head = tmpi->linkHead();
00087 if (head)
00088 tmpi->linkHead(size() - head + 1);
00089 }
00090 }
00091
00092 std::ostream& print(std::ostream& os, Corpus const& corpus);
00093
00094 TreeToken* parent(TreeToken* tok) {
00095 return (tok && tok->linkHead() > 0) ? operator[](tok->linkHead() - 1) : 0;
00096 }
00097
00098 TreeToken* root(TreeToken* tok) {
00099 while (tok->linkHead() > 0)
00100 tok = operator[](tok->linkHead() - 1);
00101 return tok;
00102 }
00103
00104 TreeToken* child(TreeToken* tok, char dir, char POS) {
00105 if (!tok)
00106 return 0;
00107 if (dir == '-') {
00108
00109 FOR_EACH (std::vector<TreeToken*>, tok->left, it) {
00110 std::string const* attr = (*it)->get("POS");
00111 if (attr && (*attr)[0] == POS)
00112 return *it;
00113 }
00114 return 0;
00115 } else {
00116
00117 FOR_EACH (std::vector<TreeToken*>, tok->right, it) {
00118 std::string const* attr = (*it)->get("POS");
00119 if (attr && (*attr)[0] == POS)
00120 return *it;
00121 }
00122 return 0;
00123 }
00124 }
00125
00135 TreeToken* child(TreeToken* tok, int nth) {
00136 if (!tok)
00137 return 0;
00138 if (nth < 0) {
00139 if (nth == INT_MIN)
00140 return tok->left.size() ? tok->left[tok->left.size() - 1] : 0;
00141 nth = -nth;
00142 return (0 < nth && nth <= (int)tok->left.size()) ? tok->left[nth - 1] : 0;
00143 } else {
00144 if (nth == INT_MAX)
00145 return tok->right.size() ? tok->right[tok->right.size() - 1] : 0;
00146 else
00147 return (0 < nth && nth <= (int)tok->right.size()) ? tok->right[nth - 1] : 0;
00148 }
00149 }
00150
00151 TreeToken* leftChild(TreeToken* tok) {
00152 return (tok && tok->left.size()) ? tok->left[0] : 0;
00153 }
00154
00155 TreeToken* rightChild(TreeToken* tok) {
00156 return (tok && tok->right.size()) ? tok->left[tok->left.size()-1] : 0;
00157 }
00158 };
00159
00160 std::ostream& operator <<(std::ostream& os, Sentence const&);
00161
00162 }
00163
00164 #endif // DeSR_Sentence_H