00001 #include "tree_fragment_tokenizer.h"
00002
00003 #include <cctype>
00004
00005 namespace MosesTraining
00006 {
00007 namespace Syntax
00008 {
00009
00010 TreeFragmentToken::TreeFragmentToken(TreeFragmentTokenType t,
00011 StringPiece v, std::size_t p)
00012 : type(t)
00013 , value(v)
00014 , pos(p) {
00015 }
00016
00017 TreeFragmentTokenizer::TreeFragmentTokenizer()
00018 : value_(TreeFragmentToken_EOS, "", -1) {
00019 }
00020
00021 TreeFragmentTokenizer::TreeFragmentTokenizer(const StringPiece &s)
00022 : str_(s)
00023 , value_(TreeFragmentToken_EOS, "", -1)
00024 , iter_(s.begin())
00025 , end_(s.end())
00026 , pos_(0) {
00027 ++(*this);
00028 }
00029
00030 TreeFragmentTokenizer &TreeFragmentTokenizer::operator++() {
00031 while (iter_ != end_ && (*iter_ == ' ' || *iter_ == '\t')) {
00032 ++iter_;
00033 ++pos_;
00034 }
00035
00036 if (iter_ == end_) {
00037 value_ = TreeFragmentToken(TreeFragmentToken_EOS, "", pos_);
00038 return *this;
00039 }
00040
00041 if (*iter_ == '[') {
00042 value_ = TreeFragmentToken(TreeFragmentToken_LSB, "[", pos_);
00043 ++iter_;
00044 ++pos_;
00045 } else if (*iter_ == ']') {
00046 value_ = TreeFragmentToken(TreeFragmentToken_RSB, "]", pos_);
00047 ++iter_;
00048 ++pos_;
00049 } else {
00050 std::size_t start = pos_;
00051 while (true) {
00052 ++iter_;
00053 ++pos_;
00054 if (iter_ == end_ || *iter_ == ' ' || *iter_ == '\t') {
00055 break;
00056 }
00057 if (*iter_ == '[' || *iter_ == ']') {
00058 break;
00059 }
00060 }
00061 StringPiece word = str_.substr(start, pos_-start);
00062 value_ = TreeFragmentToken(TreeFragmentToken_WORD, word, start);
00063 }
00064
00065 return *this;
00066 }
00067
00068 TreeFragmentTokenizer TreeFragmentTokenizer::operator++(int) {
00069 TreeFragmentTokenizer tmp(*this);
00070 ++*this;
00071 return tmp;
00072 }
00073
00074 bool operator==(const TreeFragmentTokenizer &lhs,
00075 const TreeFragmentTokenizer &rhs) {
00076 if (lhs.value_.type == TreeFragmentToken_EOS ||
00077 rhs.value_.type == TreeFragmentToken_EOS) {
00078 return lhs.value_.type == TreeFragmentToken_EOS &&
00079 rhs.value_.type == TreeFragmentToken_EOS;
00080 }
00081 return lhs.iter_ == rhs.iter_;
00082 }
00083
00084 bool operator!=(const TreeFragmentTokenizer &lhs,
00085 const TreeFragmentTokenizer &rhs) {
00086 return !(lhs == rhs);
00087 }
00088
00089 }
00090 }