00001
00002
00003 #ifndef MIX_TOKENIZER_H_
00004 #define MIX_TOKENIZER_H_
00005
00006
00007 #include "classes.h"
00008 #include "misc.h"
00009 #include "XMLToken.h"
00010
00011 #include <stack>
00012 #include <string>
00013
00014 namespace MiX{
00023 template <class charT,class traitsT>
00024 class Tokenizer{
00025 public:
00026 MiX_Template_Typedef(charT,traitsT);
00027 typedef Tokenizer<charT,traitsT> this_type;
00028 typedef XMLToken<charT,traitsT> token_type;
00029 typedef typename traitsT::xml_traits xml_traits;
00030 typedef typename traitsT::char_traits char_traits;
00031 private:
00032 const charT* data_;
00033 const charT* start_;
00034 const charT* current_;
00040 charT* line_;
00041 long len_;
00042 static const charT tokens_[15];
00043 std::stack<token_type> stack_;
00044 static TokenType isToken(charT);
00045
00046 std::basic_istream<charT, char_traits>* is_;
00047
00048 bool injectStringFromBuffer(const charT* text)
00049 { current_ = start_ = data_ = text; return true; }
00050
00051 bool fillUpBuffer();
00052 public:
00054 Tokenizer() : is_(0),line_(0) { }
00056 ~Tokenizer(){ if(line_) delete line_; }
00058 bool injectString(const charT* text)
00059 { current_ = start_ = data_ = text; return true; }
00061 bool ejectToken(token_type& dest);
00063 void pushToken(const token_type& tok){
00064 stack_.push(tok);
00065 }
00066
00067 bool injectStream(std::basic_istream<charT, char_traits>& is)
00068 { is_ = &is; fillUpBuffer(); }
00069
00070 };
00071
00072 }
00073
00074 #ifndef MIX_TOKENIZER_CPP_
00075 #include "Tokenizer.cpp"
00076 #endif
00077
00078 #endif