Narzędzia użytkownika

Narzędzia witryny


tokenizer

To jest stara wersja strony!


Biblioteka boost Tokenizer

Biblioteka boost Tokenizer zapewnia elastyczny i łatwy w użyciu mechanizm dzielenia dowolnych łańcuchów znakowych na serię podciągów (tokens), grup znaków o podanych cechach. Biblioteka umożliwia wybór metody podziału łańcucha poprzez parametryzowane funktory TokenizerFunction.

Klasa Tokenizer

Powyższa klasa umożliwia widok na sekwencję znaków jak na kontener zawierający podciągi. Dostęp do podciągów zawartych w takim kontenerze zapewniony jest za pomocą iteratorów zdefiniowanych w bibliotece. Klasa tokenizer jest klasą szablonową pozwalającą tworzyć obiekty dzielące sekwencje znakowe określonego typu według określonego sposobu podziału. Warto zauważyć,że podany łańcuch znakowy nie jest dzielony w czasie inicjalizacj obiektu, lecz na żądanie.

template <
        class TokenizerFunc = char_delimiters_separator<char>, 
        class Iterator = std::string::const_iterator,
        class Type = std::string
  >
  class tokenizer

Parametry szablonu:

  • TokenizerFunc - funktor używany do dzielenia sekwencji
  • Iterator - typ iteratora specyfikującego sekwencję
  • Type - typ sekwencji


Prosty przykład użycia biblioteki:

#include<iostream>
#include<boost/tokenizer.hpp>
#include<string>
 
using namespace std;
using namespace boost;
 
string str = "To jest,  prosty przyklad";
 
int main(){
   //utorzenie domyślnego obiektu klasy tokenizer, w którym ciąg znaków string 
   //dzielony jest na podstawie odstępów i znaków interpunkcyjnych 
   tokenizer<> t(s);
 
   //dostęp do pojedyńczych tokenówjest realizowany przy użyciu iteratorów
   for(tokenizer<>::iterator beg=t.begin(); beg!=t.end();++beg){
       cout << *beg << "\n";
   }
}

Wynikiem działania programu będzie sekwencja:

To
jest
prosty
przyklad

Lista konstruktorów oraz funkcji składowych

//konstuktory
tokenizer(Iterator first, Iterator last,const TokenizerFunc& f = TokenizerFunc()) 
 
template<class Container>
tokenizer(const Container& c,const TokenizerFunc& f = TokenizerFunc())
 
//fukcja zmieniająca iteratory wskazujące na początek i za koniec sekwencji na nowe
void assign(Iterator first, Iterator last)
 
//fukcja zmieniająca iteratory wskazujące na początek i za koniec sekwencji oraz funkce podziału na nowe
void assign(Iterator first, Iterator last, const TokenizerFunc& f)
 
//fukcja zmieniająca kontener przechowujący sekwencję na nowy
template<class Container>
void assign(const Container& c)
 
//fukcja zmieniająca kontener przechowujący sekwencję oraz funkcję podziału na nowe
template<class Container>
void assign(const Container& c, const TokenizerFunc& f)
 
//iterator wskazujący na pierwszy podciąg
iterator begin() const
 
//iterator wskazujący za ostatni podciąg
iterator end() const 
 
/* c - kontener zawierający sekwencję do podziału
*  f - funktor służący do podziału sekwencji
*  first - iteraor wskazujący na początek dzielonej sekwencji
*  last - iteraor wskazujący za dzieloną sekwencję
*/

Klasa Token Iterator

Klasa zapewnia dostęp do podciągów dzielonej sekwencji jak przzy użyciu zeykłego iteratora.

template <
        class TokenizerFunc = char_delimiters_separator<char>, 
        class Iterator = std::string::const_iterator,
        class Type = std::string
>
class token_iterator_generator 

Parametry szablonu:

  • TokenizerFunc - funktor używany do dzielenia sekwencji
  • Iterator - typ iteratora specyfikującego sekwencję
  • Type - typ sekwencji


W celu utorzenia iteratora musimy podać iterator wskazujący na początek dzielonej sekwencji begin, interator wskazujący dokładnie za dzieloną sekwencję end oraz funkcję podziału sekwencji fun.

template<class Type, class Iterator, class TokenizerFunc>
typename token_iterator_generator<TokenizerFunc,Iterator,Type>::type 
make_token_iterator(Iterator begin, Iterator end,const TokenizerFunc& fun)


Przykład użycia orzy wykorzystaniu funktora offset_separator dzielącego łańcuch znakowy na podciągi o określonej długości.

#include<iostream>
#include<boost/token_iterator.hpp>
#include<string>
 
int main(){
   using namespace std;
   using namespace boost;
   string s = "12252001";
   int offsets[] = {2,2,4};
   offset_separator f(offsets, offsets+3);
   typedef token_iterator_generator<offset_separator>::type Iter;
   Iter beg = make_token_iterator<string>(s.begin(),s.end(),f);
   Iter end = make_token_iterator<string>(s.end(),s.end(),f); 
   for(;beg!=end;++beg){
     cout << *beg << "\n";
   }
}

Funktory TokenizerFunction

TokenizerFunction jest funktorem, którego zadaniem jest dzielenie podanej sekwencji znaków dopóki zostanie znaleziony dokładnie jeden podciąg lub osiągnięty koniec sekwencji. Następnie uaktualnia podciąg i informuje o położeniu w sekwencji elementu znajdującgo się dokładnie za za znalezionym podciągiem.

Biblioteka zawiera trzy klasy funktorów TokenizerFunction:

  • char_separator
  • escaped_list_separator
  • offset_separator


Klasa char_separator


Klasa escaped_list_separator


Klasa offset_separator

tokenizer.1208006873.txt.gz · ostatnio zmienione: 2008/04/12 15:27 przez mplacht1