2011-01-17 12 views
6

मैं boost :: spirit :: lex का उपयोग कर एक लेक्सर लिखने पर विचार कर रहा हूं, लेकिन मुझे लगता है कि सभी उदाहरणों को लगता है कि आपने पूरी फ़ाइल को पहले रैम में पढ़ा है। मैं एक लेक्सर लिखना चाहता हूं जिसमें रैम में पूरी स्ट्रिंग की आवश्यकता नहीं है, क्या यह संभव है? या मुझे कुछ और उपयोग करने की ज़रूरत है?Boost :: Spirit :: Lex को पूरी फ़ाइल को स्मृति में पहले बिना पढ़े फ़ाइल को लेक्स का उपयोग कैसे करें?

मैंने आईट्रीम_इटरेटर का उपयोग करने की कोशिश की, लेकिन बढ़ावा मुझे एक संकलन त्रुटि देता है जब तक कि मैं कॉन्स्ट char * को इटरेटर प्रकार के रूप में उपयोग नहीं करता।

उदा। सभी उदाहरण मैं पा सकते हैं मूल रूप से ऐसा करते हैं:

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, ...)); 

इसके अलावा, यह किसी भी तरह लेक्स टोकन से लाइन/स्तंभ संख्या निर्धारित करने के लिए संभव है?

धन्यवाद!

उत्तर

6

स्पिरिट लेक्स किसी भी इटरेटर के साथ काम करता है जब तक यह मानक आगे इटरेटर्स की आवश्यकताओं के अनुरूप होता है। इसका मतलब है कि आप किसी भी अनुरूप इटरेटर के साथ लेक्सर (lex::tokenize() का आह्वान) खिला सकते हैं। उदाहरण के लिए, यदि आप एक std::istream उपयोग करना चाहते हैं, तो आप इसे एक boost::spirit::istream_iterator में लपेट कर सकते हैं:

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, ...)); 
} 

और यह काम करेगा।

आपके प्रश्न के दूसरे भाग (इनपुट की रेखा/कॉलम संख्या से संबंधित) के लिए: हाँ लेक्सर का उपयोग करके इनपुट स्थिति को ट्रैक करना संभव है। हालांकि, यह मामूली नहीं है। आपको अपना खुद का टोकन प्रकार बनाना होगा जो लाइन/कॉलम जानकारी संग्रहीत करता है और पूर्वनिर्धारित टोकन प्रकार के बजाय इसका उपयोग करता है। बहुत से लोग इसके लिए पूछ रहे हैं, इसलिए मैं आगे बढ़ सकता हूं और एक उदाहरण बना सकता हूं।

+0

+1, हां, आत्मा प्रलेखन में नए उदाहरण बहुत अच्छे होंगे :) – Viet

+1

मैंने वास्तव में ऐसा किया था। बूस्ट V1.47 में ऐसे टोकन प्रकार और एक नया उदाहरण होगा जो इसका उपयोग कैसे करेगा। – hkaiser

+0

धन्यवाद हर्मुत! नई आत्मा के साथ 1.47 रिलीज को बढ़ावा देने की बहुत उम्मीद है! – Viet

संबंधित मुद्दे

 संबंधित मुद्दे