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