2015-10-04 14 views
5

時,我得到以下運行時錯誤消息運行時錯誤信息使用boost ::波

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; 
} 

我用gcc編譯:

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 

我擦肩而過,一般例外,並試圖通過展示它:

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

雖然沒有成功。

+0

當你** **調試這個程序 - 什麼你會得到結果嗎?你能和我們分享你的發現嗎? – YePhIcK

+0

@YePhIcK,我把由gdb生成的回溯 – barej

回答

1

boost愛異常編程。意義異常用於引發錯誤和警告......我討厭這種情況,但如果您使用這些奇妙的C++庫,則需要接受它。異常導致「崩潰」,如果你不小心,把他們捉住,像:

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到年底你的字符串修復了這個問題,然後再沒有報告錯誤(順便說一句,它是實際的盟友只是一個警告):

更改主要功能的文本字符串爲:std::string text="aaa bbb /*cccc*/ ddd // eee\n";和程序將輸出aaa bbb ddd

您可以添加此\n,但您也可以重新設置代碼以在循環中嘗試/捕獲,然後報告但忽略警告。

注意:升壓::波需要一個EOL可能與這個衆所周知的C++警告(但它實際上只是一個警告)的事實:"No newline at end of file" compiler warning

+0

非常感謝。除了「pos」的初始化之外,還有什麼問題?兩個代碼看起來相似。 – barej

+0

對此感到滿意(它使我發現了這個'boost圖書館我不知道......)。實際上,沒有必要初始化'pos',它的默認值是0.只有'try/catch'丟失。如果這能解決你的問題,請投票! – jpo38

+0

我在想。對於''aaa bbb/* cccc */\ n ddd // eee \ nfffff \ n「'作爲輸入,輸出爲'」aaa bbb \ n ddd fffff \ n「'而不是'」aaa bbb \ n ddd \ nfffff \ n「' – barej