2015-10-04 16 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; 
} 

を私は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へ

感謝。私はpos

position_type pos(0); 

で初期化し、以前の実行時エラーを修正しました。 は今、私は別のランタイムエラーを得た:

#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愛の例外プログラミング。意味の例外は、エラーや警告を発生させるために使用されます....私はそれが嫌いですが、あなたはそれらの素晴らしい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を追加することもできますが、ループ内で試して捕まえてからレポートしても無視するようにコードを修正することもできます。

注:ブースト::波は(それは単なる警告本当にある)おそらく、このよく知られたC++の警告に関連しているEOLを期待しているという事実:"No newline at end of file" compiler warning

+0

ありがとうございました。'pos'の初期化に加えて、他に何が問題でしたか?両方のコードが似ています。 – barej

+0

助けてくれてうれしく思いました。実際には、 'pos'を初期化する必要はありませんでした。デフォルトは0です。' try/catch'だけが欠けていました。これで問題が解決したら、投票してください! – jpo38

+0

私は不思議です。 "aaa bbb/* cccc */\ n ddd // eee \ nfffff \ n" 'を入力として、出力は' 'aaa bbb \ n dddの代わりに' 'aaa bbb \ n ddd fffff \ nfffff \ n " – barej

関連する問題