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
00033 class Sentence : public std::vector<TreeToken*>
00034 {
00035 public:
00036 Language const* language;
00037
00038 Sentence(Language const* language = 0) :
00039 language(language)
00040 { }
00041
00042 Sentence(Sentence const& other) :
00043 language(other.language) {
00044 FOR_EACH (Sentence, other, tit)
00045 push_back(new TreeToken(**tit));
00046 }
00047
00048 virtual ~Sentence() {
00049 FOR_EACH (std::vector<TreeToken*>, *this, it)
00050 delete *it;
00051 }
00052
00054 void reverse() {
00055 int half = size() / 2;
00056 int j = size() - 1;
00057 for (int i = 0; i < half; i++, j--) {
00058 TreeToken* tmpi = operator[](i);
00059 tmpi->linkHead(size() - tmpi->linkHead() + 1);
00060 TreeToken* tmpj = operator[](j);
00061 tmpj->linkHead(size() - tmpj->linkHead() + 1);
00062 operator[](i) = tmpj;
00063 operator[](j) = tmpi;
00064 }
00065 if (size() % 2) {
00066 TreeToken* tmp = operator[](half+1);
00067 tmp->linkHead(size() - tmp->linkHead() + 1);
00068 }
00069 }
00070
00071 void print(std::ostream& os, Corpus const& corpus);
00072
00073 TreeToken* parent(TreeToken* tok) {
00074 return (tok && tok->linkHead() > 0) ? operator[](tok->linkHead() - 1) : 0;
00075 }
00076
00077 TreeToken* root(TreeToken* tok) {
00078 while (tok->linkHead() > 0)
00079 tok = operator[](tok->linkHead() - 1);
00080 return tok;
00081 }
00082
00083 TreeToken* child(TreeToken* tok, char dir, char POS) {
00084 if (!tok)
00085 return 0;
00086 if (dir == '-') {
00087
00088 FOR_EACH (std::vector<TreeToken*>, tok->left, it) {
00089 std::string const* attr = (*it)->get("POS");
00090 if (attr && (*attr)[0] == POS)
00091 return *it;
00092 }
00093 return 0;
00094 } else {
00095
00096 FOR_EACH (std::vector<TreeToken*>, tok->right, it) {
00097 std::string const* attr = (*it)->get("POS");
00098 if (attr && (*attr)[0] == POS)
00099 return *it;
00100 }
00101 return 0;
00102 }
00103 }
00104
00114 TreeToken* child(TreeToken* tok, int nth) {
00115 if (!tok)
00116 return 0;
00117 if (nth < 0) {
00118 if (nth == INT_MIN)
00119 return tok->left.size() ? tok->left[tok->left.size() - 1] : 0;
00120 nth = -nth;
00121 return (0 < nth && nth <= (int)tok->left.size()) ? tok->left[nth - 1] : 0;
00122 } else {
00123 if (nth == INT_MAX)
00124 return tok->right.size() ? tok->right[tok->right.size() - 1] : 0;
00125 else
00126 return (0 < nth && nth <= (int)tok->right.size()) ? tok->right[nth - 1] : 0;
00127 }
00128 }
00129
00130 TreeToken* leftChild(TreeToken* tok) {
00131 return (tok && tok->left.size()) ? tok->left[0] : 0;
00132 }
00133
00134 TreeToken* rightChild(TreeToken* tok) {
00135 return (tok && tok->right.size()) ? tok->left[tok->left.size()-1] : 0;
00136 }
00137 };
00138
00139 std::ostream& operator <<(std::ostream& os, Sentence const&);
00140
00141 }
00142
00143 #endif // DeSR_Sentence_H