2011-01-17 10 views
6

Boost :: spirit :: lex kullanarak bir lexer yazıyorum, ancak bulabildiğim tüm örnekler önce tüm dosyayı RAM'e okuduğunuzu varsayıyor gibi görünüyor. Bütün dizinin RAM'e girmesini gerektirmeyen bir lexer yazmak istiyorum, bu mümkün mü? Yoksa başka bir şey mi kullanmalıyım?Boost :: Spirit :: Lex, tüm dosyayı önce belleğe okumadan bir dosyaya nasıl kullanılır?

Istream_iterator kullanmayı denedim, ancak const char * seçeneğini yineleme türleri olarak kullanmadıkça, bir derleme hatası verir.

örn. Bulabileceğim Bütün örnekler temelde bu yapın:

Ayrıca
lex_functor_type< lex::lexertl::lexer<> > lex_functor; 

// assumes entire file is in memory 
char const* first = str.c_str(); 
char const* last = &first[str.size()]; 

bool r = lex::tokenize(first, last, lex_functor, 
    boost::bind(lex_callback_functor(), _1, ...)); 

, bir şekilde lex jeton satır/sütun numaralarını belirlemek mümkündür?

Teşekkürler!

cevap

6

Ruh Lex, standart ileri yineleyicilerin gereksinimlerine uygun olduğu sürece herhangi bir yineleyici ile çalışır. Bu, lexer'ı (lex::tokenize()'u çağır) herhangi bir uyumlu yineleyici ile besleyebileceğiniz anlamına gelir.

bool tokenize(std::istream& is, ...) 
{ 
    lex_functor_type< lex::lexertl::lexer<> > lex_functor; 

    boost::spirit::istream_iterator first(is); 
    boost::spirit::istream_iterator last; 

    return lex::tokenize(first, last, lex_functor, 
     boost::bind (lex_callback_functor(), _1, ...)); 
} 

ve işe olacaktır: Örneğin, bir std::istream kullanmak istiyorsanız, bir boost::spirit::istream_iterator içine sarabilirdiniz.

Sorunuzun ikinci kısmı için (girişin satır/sütun numarasıyla ilgili olarak): evet lexer'ı kullanarak giriş konumunu izlemek mümkündür. Gerçi önemsiz değil. Satır/sütun bilgilerini saklayan ve bunu önceden tanımlanmış jeton türü yerine kullanan kendi belirteç türünüzü oluşturmanız gerekir. Birçok insan bunu soruyor, ben de devam edip bir örnek oluşturabilirim.

+0

+1, evet, Ruh belgelerindeki yeni örnekler harika olurdu :) – Viet

+1

Bunu gerçekten yaptım. Yükseltme V1.47 böyle bir simge tipine ve nasıl kullanılacağını gösteren yeni bir örneğe sahip olacaktır. – hkaiser

+0

Teşekkürler Harmut! Yeni Ruh ile 1.47 serbest bırakmak için çok sabırsızlanıyoruz! – Viet