00001 #pragma once 00002 00003 #include "util/string_piece.hh" 00004 00005 namespace Moses 00006 { 00007 namespace Syntax 00008 { 00009 namespace F2S 00010 { 00011 00012 enum TreeFragmentTokenType { 00013 TreeFragmentToken_EOS, 00014 TreeFragmentToken_LSB, 00015 TreeFragmentToken_RSB, 00016 TreeFragmentToken_WORD 00017 }; 00018 00019 struct TreeFragmentToken { 00020 public: 00021 TreeFragmentToken(TreeFragmentTokenType, StringPiece, std::size_t); 00022 TreeFragmentTokenType type; 00023 StringPiece value; 00024 std::size_t pos; 00025 }; 00026 00027 // Tokenizes tree fragment strings in Moses format. 00028 // 00029 // For example, the string "[NP [NP [NN a]] [NP]]" is tokenized to the sequence: 00030 // 00031 // 1 LSB "[" 00032 // 2 WORD "NP" 00033 // 3 LSB "[" 00034 // 4 WORD "NP" 00035 // 5 LSB "[" 00036 // 6 WORD "NN" 00037 // 7 WORD "a" 00038 // 8 RSB "]" 00039 // 9 RSB "]" 00040 // 10 LSB "[" 00041 // 11 WORD "NP" 00042 // 12 RSB "]" 00043 // 13 RSB "]" 00044 // 14 EOS undefined 00045 // 00046 class TreeFragmentTokenizer 00047 { 00048 public: 00049 TreeFragmentTokenizer(); 00050 TreeFragmentTokenizer(const StringPiece &); 00051 00052 const TreeFragmentToken &operator*() const { 00053 return value_; 00054 } 00055 const TreeFragmentToken *operator->() const { 00056 return &value_; 00057 } 00058 00059 TreeFragmentTokenizer &operator++(); 00060 TreeFragmentTokenizer operator++(int); 00061 00062 friend bool operator==(const TreeFragmentTokenizer &, 00063 const TreeFragmentTokenizer &); 00064 00065 friend bool operator!=(const TreeFragmentTokenizer &, 00066 const TreeFragmentTokenizer &); 00067 00068 private: 00069 StringPiece str_; 00070 TreeFragmentToken value_; 00071 StringPiece::const_iterator iter_; 00072 StringPiece::const_iterator end_; 00073 std::size_t pos_; 00074 }; 00075 00076 } // namespace F2S 00077 } // namespace Syntax 00078 } // namespace Moses