2015-10-04 8 views
5

का उपयोग कर मैं निम्नलिखित क्रम त्रुटि संदेशरनटाइम त्रुटि संदेश को बढ़ावा देने :: लहर

terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::wave::cpplexer::lexing_exception> >' 
    what(): boost::wave::lexing_exception 

जब मैं निम्नलिखित कोड को चलाने के लिए कोशिश कर रहा हूँ मिलता है:

#include <vector> 
#include <algorithm> 
#include <boost/wave.hpp> 
#include <boost/wave/cpplexer/cpp_lex_token.hpp> 
#include <boost/wave/cpplexer/cpp_lex_iterator.hpp> 

std::string strip_comments(std::string const& input) 
{ 
    std::string output; 
    typedef boost::wave::cpplexer::lex_token<> token_type; 
    typedef boost::wave::cpplexer::lex_iterator<token_type> lexer_type; 
    typedef token_type::position_type position_type; 

    position_type pos; 

    lexer_type it = lexer_type(input.begin(), input.end(), pos, 
     boost::wave::language_support(
      boost::wave::support_cpp|boost::wave::support_option_long_long)); 
    lexer_type end = lexer_type(); 

    for (;it != end; ++it) 
    { 
     if (*it != boost::wave::T_CCOMMENT 
     && *it != boost::wave::T_CPPCOMMENT) 
     { 
      output += std::string(it->get_value().begin(), it->get_value().end()); 
     } 
    } 
    return output; 
} 

int main() 
{ 
    std::string text="aaa bbb /*cccc*/ ddd // eee"; 
    std::cout<<strip_comments(text)<<std::endl; 
    return 0; 
} 

मैं जीसीसी संकलक का उपयोग करें:

g++ -std=c++11 test.cpp -o test -lboost_wave -lboost_system 

यह कोड // औरद्वारा निर्दिष्ट टेक्स्ट से C++ टिप्पणियों को निकालना है।।

यहाँ gdb घटाता है:

GNU gdb (Ubuntu 7.7.1-0ubuntu5~14.04.2) 7.7.1 
Copyright (C) 2014 Free Software Foundation, Inc. 
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> 
This is free software: you are free to change and redistribute it. 
There is NO WARRANTY, to the extent permitted by law. Type "show copying" 
and "show warranty" for details. 
This GDB was configured as "x86_64-linux-gnu". 
Type "show configuration" for configuration details. 
For bug reporting instructions, please see: 
<http://www.gnu.org/software/gdb/bugs/>. 
Find the GDB manual and other documentation resources online at: 
<http://www.gnu.org/software/gdb/documentation/>. 
For help, type "help". 
Type "apropos word" to search for commands related to "word"... 
Reading symbols from a.out...done. 
[New LWP 10573] 
[Thread debugging using libthread_db enabled] 
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1". 
Core was generated by `./a.out'. 
Program terminated with signal SIGABRT, Aborted. 
#0 0x00007ff38fe96cc9 in __GI_raise ([email protected]=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:56 
56 ../nptl/sysdeps/unix/sysv/linux/raise.c: No such file or directory. 
(gdb) bt 
#0 0x00007ff38fe96cc9 in __GI_raise ([email protected]=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:56 
#1 0x00007ff38fe9a0d8 in __GI_abort() at abort.c:89 
#2 0x00007ff3904cb78d in __gnu_cxx::__verbose_terminate_handler()() from /usr/lib/x86_64-linux-gnu/libstdc++.so.6 
#3 0x00007ff3904c97f6 in ??() from /usr/lib/x86_64-linux-gnu/libstdc++.so.6 
#4 0x00007ff3904c9841 in std::terminate()() from /usr/lib/x86_64-linux-gnu/libstdc++.so.6 
#5 0x00007ff3904c9a58 in __cxa_throw() from /usr/lib/x86_64-linux-gnu/libstdc++.so.6 
#6 0x00007ff390a9e063 in void boost::throw_exception<boost::wave::cpplexer::lexing_exception>(boost::wave::cpplexer::lexing_exception const&) 
    () from /usr/lib/x86_64-linux-gnu/libboost_wave.so.1.54.0 
#7 0x00007ff390aa3a5e in boost::wave::cpplexer::re2clex::lexer<__gnu_cxx::__normal_iterator<char const*, std::string>, boost::wave::util::file_position<boost::wave::util::flex_string<char, std::char_traits<char>, std::allocator<char>, boost::wave::util::CowString<boost::wave::util::AllocatorStringStorage<char, std::allocator<char> >, char*> > >, boost::wave::cpplexer::lex_token<boost::wave::util::file_position<boost::wave::util::flex_string<char, std::char_traits<char>, std::allocator<char>, boost::wave::util::CowString<boost::wave::util::AllocatorStringStorage<char, std::allocator<char> >, char*> > > > >::report_error(boost::wave::cpplexer::re2clex::Scanner const*, int, char const*, ...)() 
    from /usr/lib/x86_64-linux-gnu/libboost_wave.so.1.54.0 
#8 0x00007ff390aaf2f0 in boost::wave::cpplexer::re2clex::scan(boost::wave::cpplexer::re2clex::Scanner*)() 
    from /usr/lib/x86_64-linux-gnu/libboost_wave.so.1.54.0 
#9 0x00007ff390aa4329 in boost::wave::cpplexer::re2clex::lexer<__gnu_cxx::__normal_iterator<char const*, std::string>, boost::wave::util::file_position<boost::wave::util::flex_string<char, std::char_traits<char>, std::allocator<char>, boost::wave::util::CowString<boost::wave::util::AllocatorStringStorage<char, std::allocator<char> >, char*> > >, boost::wave::cpplexer::lex_token<boost::wave::util::file_position<boost::wave::util::flex_string<char, std::char_traits<char>, std::allocator<char>, boost::wave::util::CowString<boost::wave::util::AllocatorStringStorage<char, std::allocator<char> >, char*> > > > >::get(boost::wave::cpplexer::lex_token<boost::wave::util::file_position<boost::wave::util::flex_string<char, std::char_traits<char>, std::allocator<char>, boost::wave::util::CowString<boost::wave::util::AllocatorStringStorage<char, std::allocator<char> >, char*> > > >&)() from /usr/lib/x86_64-linux-gnu/libboost_wave.so.1.54.0 
#10 0x000000000040a3b8 in boost::wave::cpplexer::impl::lex_iterator_functor_shim<boost::wave::cpplexer::lex_token<boost::wave::util::file_position<boost::wave::util::flex_string<char, std::char_traits<char>, std::allocator<char>, boost::wave::util::CowString<boost::wave::util::AllocatorStringStorage<char, std::allocator<char> >, char*> > > > >::get_next<boost::spirit::multi_pass<std::pair<boost::wave::cpplexer::impl::lex_iterator_functor_shim<boost::wave::cpplexer::lex_token<boost::wave::util::file_position<boost::wave::util::flex_string<char, std::char_traits<char>, std::allocator<char>, boost::wave::util::CowString<boost::wave::util::AllocatorStringStorage<char, std::allocator<char> >, char*> > > > >, boost::wave::cpplexer::lex_input_interface<boost::wave::cpplexer::lex_token<boost::wave::util::file_position<boost::wave::util::flex_string<char, std::char_traits<char>, std::allocator<char>, boost::wave::util::CowString<boost::wave::util::AllocatorStringStorage<char, std::allocator<char> >, char*> > > > >*>, boost::spirit::iterator_policies::default_policy<boost::spirit::iterator_policies::ref_counted, boost::spirit::iterator_policies::no_check, boost::spirit::iterator_policies::split_functor_input, boost::spirit::iterator_policies::split_std_deque> > > (mp=..., result=...) 
    at /usr/include/boost/wave/cpplexer/cpp_lex_iterator.hpp:80 
#11 0x0000000000409efb in boost::spirit::iterator_policies::split_functor_input::unique<std::pair<boost::wave::cpplexer::impl::lex_iterator_functor_shim<boost::wave::cpplexer::lex_token<boost::wave::util::file_position<boost::wave::util::flex_string<char, std::char_traits<char>, std::allocator<char>, boost::wave::util::CowString<boost::wave::util::AllocatorStringStorage<char, std::allocator<char> >, char*> > > > >, boost::wave::cpplexer::lex_input_interface<boost::wave::cpplexer::lex_token<boost::wave::util::file_position<boost::wave::util::flex_string<char, std::char_traits<char>, std::allocator<char>, boost::wave::util::CowString<boost::wave::util::AllocatorStringStorage<char, std::allocator<char> >, char*> > > > >*>, true>::advance_input<boost::spirit::multi_pass<std::pair<boost::wave::cpplexer::impl::lex_iterator_functor_shim<boost::wave::cpplexer::lex_token<boost::wave::util::file_position<boost::wave::util::flex_string<char, std::char_traits<char>, std::allocator<char>, boost::wave::util---Type <return> to continue, or q <return> to quit--- 
::CowString<boost::wave::util::AllocatorStringStorage<char, std::allocator<char> >, char*> > > > >, boost::wave::cpplexer::lex_input_interface<boost::wave::cpplexer::lex_token<boost::wave::util::file_position<boost::wave::util::flex_string<char, std::char_traits<char>, std::allocator<char>, boost::wave::util::CowString<boost::wave::util::AllocatorStringStorage<char, std::allocator<char> >, char*> > > > >*>, boost::spirit::iterator_policies::default_policy<boost::spirit::iterator_policies::ref_counted, boost::spirit::iterator_policies::no_check, boost::spirit::iterator_policies::split_functor_input, boost::spirit::iterator_policies::split_std_deque> > > (mp=...) 
    at /usr/include/boost/spirit/home/support/iterators/detail/split_functor_input_policy.hpp:91 
#12 0x000000000040969f in boost::spirit::iterator_policies::multi_pass_unique<std::pair<boost::wave::cpplexer::impl::lex_iterator_functor_shim<boost::wave::cpplexer::lex_token<boost::wave::util::file_position<boost::wave::util::flex_string<char, std::char_traits<char>, std::allocator<char>, boost::wave::util::CowString<boost::wave::util::AllocatorStringStorage<char, std::allocator<char> >, char*> > > > >, boost::wave::cpplexer::lex_input_interface<boost::wave::cpplexer::lex_token<boost::wave::util::file_position<boost::wave::util::flex_string<char, std::char_traits<char>, std::allocator<char>, boost::wave::util::CowString<boost::wave::util::AllocatorStringStorage<char, std::allocator<char> >, char*> > > > >*>, boost::spirit::iterator_policies::ref_counted::unique, boost::spirit::iterator_policies::no_check::unique, boost::spirit::iterator_policies::split_functor_input::unique<std::pair<boost::wave::cpplexer::impl::lex_iterator_functor_shim<boost::wave::cpplexer::lex_token<boost::wave::util::file_position<boost::wave::util::flex_string<char, std::char_traits<char>, std::allocator<char>, boost::wave::util::CowString<boost::wave::util::AllocatorStringStorage<char, std::allocator<char> >, char*> > > > >, boost::wave::cpplexer::lex_input_interface<boost::wave::cpplexer::lex_token<boost::wave::util::file_position<boost::wave::util::flex_string<char, std::char_traits<char>, std::allocator<char>, boost::wave::util::CowString<boost::wave::util::AllocatorStringStorage<char, std::allocator<char> >, char*> > > > >*>, true>, boost::spirit::iterator_policies::split_std_deque::unique<boost::wave::cpplexer::lex_token<boost::wave::util::file_position<boost::wave::util::flex_string<char, std::char_traits<char>, std::allocator<char>, boost::wave::util::CowString<boost::wave::util::AllocatorStringStorage<char, std::allocator<char> >, char*> > > > >, true, true, true>::advance_input<boost::spirit::multi_pass<std::pair<boost::wave::cpplexer::impl::lex_iterator_functor_shim<boost::wave::cpplexer::lex_token<boost::wave::util::file_position<boost::wave::util::flex_string<char, std::char_traits<char>, std::allocator<char>, boost::wave::util::CowString<boost::wave::util::AllocatorStringStorage<char, std::allocator<char> >, char*> > > > >, boost::wave::cpplexer::lex_input_interface<boost::wave::cpplexer::lex_token<boost::wave::util::file_position<boost::wave::util::flex_string<char, std::char_traits<char>, std::allocator<char>, boost::wave::util::CowString<boost::wave::util::AllocatorStringStorage<char, std::allocator<char> >, char*> > > > >*>, boost::spirit::iterator_policies::default_policy<boost::spirit::iterator_policies::ref_counted, boost::spirit::iterator_policies::no_check, boost::spirit::iterator_policies::split_functor_input, boost::spirit::iterator_policies::split_std_deque> > > (mp=...) 
    at /usr/include/boost/spirit/home/support/iterators/detail/combine_policies.hpp:441 
#13 0x0000000000408d7c in boost::spirit::iterator_policies::split_std_deque::unique<boost::wave::cpplexer::lex_token<boost::wave::util::file_position<boost::wave::util::flex_string<char, std::char_traits<char>, std::allocator<char>, boost::wave::util::CowString<boost::wave::util::AllocatorStringStorage<char, std::allocator<char> >, char*> > > > >::increment<boost::spirit::multi_pass<std::pair<boost::wave::cpplexer::impl::lex_iterator_functor_shim<boost::wave::cpplexer::lex_token<boost::wave::util::file_position<boost::wave::util::flex_string<char, std::char_traits<char>, std::allocator<char>, boost::wave::util::CowString<boost::wave::util::AllocatorStringStorage<char, std::allocator<char> >, char*> > > > >, boost::wave::cpplexer::lex_input_interface<boost::wave::cpplexer::lex_token<boost::wave::util::file_position<boost::wave::util::flex_string<char, std::char_traits<char>, std::allocator<char>, boost::wave::util::CowString<boost::wave::util::AllocatorStringStorage<char, std::allocator<char> >, char*> > > > >*>, boost::spirit::iterator_policies::default_policy<boost::spirit::iterator_policies::ref_counted, boost::spirit::iterator_policies::no_check, boost::spirit::iterator_policies::split_functor_input, boost::spirit::iterator_policies::split_std_deque> > > (mp=...) 
    at /usr/include/boost/spirit/home/support/iterators/detail/split_std_deque_policy.hpp:107 
#14 0x0000000000408450 in boost::spirit::multi_pass<std::pair<boost::wave::cpplexer::impl::lex_iterator_functor_shim<boost::wave::cpplexer::lex_token<boost::wave::util::file_position<boost::wave::util::flex_string<char, std::char_traits<char>, std::allocator<char>, boost::wave::util::CowString<boost::wave::util::AllocatorStringStorage<char, std::allocator<char> >, char*> > > > >, boost::wave::cpplexer::lex_input_interface<boost:---Type <return> to continue, or q <return> to quit--- 
:wave::cpplexer::lex_token<boost::wave::util::file_position<boost::wave::util::flex_string<char, std::char_traits<char>, std::allocator<char>, boost::wave::util::CowString<boost::wave::util::AllocatorStringStorage<char, std::allocator<char> >, char*> > > > >*>, boost::spirit::iterator_policies::default_policy<boost::spirit::iterator_policies::ref_counted, boost::spirit::iterator_policies::no_check, boost::spirit::iterator_policies::split_functor_input, boost::spirit::iterator_policies::split_std_deque> >::operator++ (this=0x7fff7d8f66e0) 
    at /usr/include/boost/spirit/home/support/iterators/multi_pass.hpp:119 
#15 0x000000000040680e in strip_comments (input="aaa bbb /*cccc*/ ddd // eee") at test.cpp:23 
#16 0x0000000000406927 in main() at test.cpp:37 

अद्यतन

उसकी टिप्पणी के लिए jpo38 के लिए धन्यवाद। मैं द्वारा

position_type pos(0); 

pos प्रारंभ और पिछले रनटाइम त्रुटि तय की। अब, मैं एक अलग क्रम त्रुटि मिली:

#0 0x0000000000406ff8 in std::char_traits<char>::length (__s=0x0) at /usr/include/c++/4.9/bits/char_traits.h:263 
#1 0x0000000000408504 in boost::wave::util::flex_string<char, std::char_traits<char>, std::allocator<char>, boost::wave::util::CowString<boost::wave::util::AllocatorStringStorage<char, std::allocator<char> >, char*> >::flex_string (this=0x7ffee3d536a0, s=0x0, a=...) 
    at /usr/include/boost/wave/util/flex_string.hpp:1502 
#2 0x000000000040693f in strip_comments (input="aaa bbb /*cccc*/ ddd // eee") at test.cpp:16 
#3 0x0000000000406bf0 in main() at test.cpp:37 

मैं सामान्य अपवाद catched और से यह दिखाने की कोशिश की:

std::cout << "Error occurred: " << ex.what() << std::endl; 

जबकि यह सफल नहीं था।

+0

जब आप ** डिबग ** इस कार्यक्रम - क्या परिणाम आपको मिलते हैं? क्या आप अपने निष्कर्ष हमारे साथ साझा कर सकते हैं, कृपया? – YePhIcK

+0

@YePhIcK, मैंने gdb – barej

उत्तर

1

boost प्यार अपवाद-प्रोग्रामिंग। मतलब अपवादों का उपयोग त्रुटियों और चेतावनियों को बढ़ाने के लिए किया जाता है .... मुझे इससे नफरत है, लेकिन यदि आप उन शानदार सी ++ पुस्तकालयों का उपयोग करते हैं तो आपको इसे स्वीकार करने की आवश्यकता है। ,

std::string strip_comments(std::string const& input) 
{ 
    std::string output; 
    typedef boost::wave::cpplexer::lex_token<> token_type; 
    typedef boost::wave::cpplexer::lex_iterator<token_type> lexer_type; 
    typedef token_type::position_type position_type; 

    boost::wave::util::file_position_type current_position; // for error reporting 

    try 
    { 
     position_type pos; 

     lexer_type it = lexer_type(input.begin(), input.end(), pos, 
      boost::wave::language_support(
      boost::wave::support_cpp|boost::wave::support_option_long_long)); 
    lexer_type end = lexer_type(); 

     for (;it != end; ++it) 
     { 
      current_position = (*it).get_position(); // for error reporting 

      if (*it != boost::wave::T_CCOMMENT 
      && *it != boost::wave::T_CPPCOMMENT) 
      { 
       output += std::string(it->get_value().begin(), it->get_value().end()); 
      } 
     }    
    } 
    catch (boost::wave::cpplexer::lexing_exception const& e) { 
     // some lexing error 
     std::cerr 
      << e.file_name() << "(" << e.line_no() << "): " 
      << e.description() << std::endl; 
    } 
    catch (std::exception const& e) { 
     // use last recognized token to retrieve the error position 
     std::cerr 
      << current_position.get_file() 
      << "(" << current_position.get_line() << "): " 
      << "exception caught: " << e.what() 
      << std::endl; 
    } 
    catch (...) { 
     // use last recognized token to retrieve the error position 
     std::cerr 
      << current_position.get_file() 
      << "(" << current_position.get_line() << "): " 
      << "unexpected exception caught." << std::endl; 
    } 
    return output; 
} 

फिर एक "दुर्घटना" के बजाय, तो आप इस अच्छा ans सुरक्षित संदेश मिलेगा: अपवाद है अगर आप सावधान नहीं है "दुर्घटना" के लिए और पकड़ने के लिए उन्हें नेतृत्व, उस तरह

(1): warning: generic lexer warning: Unterminated 'C++' style comment

आप देख सकते हैं कि अपवाद को पकड़ने नहीं द्वारा, एक साधारण बढ़ावा चेतावनी अपने स्तर ;-)

में एक महत्वपूर्ण दुर्घटना में तब्दील किया गया था मैं लहर पुस्तकालय से परिचित नहीं हूँ, लेकिन के अंत में एक \n जोड़ने आपकी स्ट्रिंग समस्या को हल करती है और फिर कोई त्रुटि रिपोर्ट नहीं की जाती है (वैसे, यह actu था सहयोगी केवल एक चेतावनी):

मुख्य फ़ंक्शन टेक्स्ट स्ट्रिंग को std::string text="aaa bbb /*cccc*/ ddd // eee\n"; में बदलें और प्रोग्राम aaa bbb ddd आउटपुट करेगा।

आप यह \n जोड़ सकते हैं, लेकिन आप लूप के भीतर कोशिश/पकड़ने के लिए कोड को फिर से काम कर सकते हैं और फिर रिपोर्टिंग को चेतावनी देते हैं।

नोट: तथ्य यह है कि बढ़ावा :: लहर एक EOL उम्मीद शायद इस प्रसिद्ध सी ++ चेतावनी से संबंधित है (लेकिन यह वास्तव में सिर्फ एक चेतावनी है): "No newline at end of file" compiler warning

+0

द्वारा जेनरेट किया गया बैकट्रैक बहुत बहुत धन्यवाद।'Pos' के आरंभ के अलावा, समस्या क्या थी? दोनों कोड समान दिखते हैं। – barej

+0

खुशी से मदद मिली (यह मुझे इस 'बूस्ट' लाइब्रेरी को खोजा जो मुझे नहीं पता था ...)। दरअसल, 'pos' को शुरू करने की कोई आवश्यकता नहीं थी, यह डिफ़ॉल्ट है 0. केवल' कोशिश/पकड़ 'गायब था। अगर यह आपकी समस्या को हल करता है तो कृपया वोट दें! – jpo38

+0

मैं सोच रहा हूँ। 'Aaa bbb/* cccc */\ n ddd // eee \ nfffff \ n" 'इनपुट के रूप में, आउटपुट' "aaa bbb \ n ddd fffff \ n" ''aaa bbb \ n ddd \ nfffff \ n "' – barej

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