токен boost T_CONTLINE не работает

Я думаю, что в идентификаторах токенов повышения есть ошибка. Но я не уверен. Итераторы токенов повышения не могут обнаружить токен T_CONTLINE, который представляет собой '\ \', за которым следует '\n' См.: http://www.boost.org/doc/libs/1_46_1/libs/wave/doc/token_ids.html

Для примера теста у меня есть тестовый файл: testfile.h

  1 #define Funtion(x) X + \
  2                       Y
  3 
  4 #define MYVAR 100+\
  5               200

А вот программа, которая ищет T_CONTLINE

  1 #include <iostream>
  2 #include <fstream>
  3 
  4 #include <boost/wave/cpplexer/cpp_lex_token.hpp>
  5 #include <boost/wave/cpplexer/cpp_lex_iterator.hpp>
  6 
  7 typedef boost::wave::cpplexer::lex_token<> token_type;
  8 typedef boost::wave::cpplexer::lex_iterator<token_type> token_iterator;
  9 typedef token_type::position_type position_type;
 10 
 11 int main()
 12 {
 13   const char* infile = "testfile.h";
 14   std::string instr;
 15   std::ifstream gmstream(infile);
 16   if(!gmstream.is_open()) {
 17       std::cerr << "Could not open file: "<< infile<<"\n";
 18   }
 19   gmstream.unsetf(std::ios::skipws);
 20   instr = std::string(std::istreambuf_iterator<char>(gmstream.rdbuf()),
 21       std::istreambuf_iterator<char>());
 22 
 23   position_type pos(infile);
 24   token_iterator  it = token_iterator(instr.begin(), instr.end(), pos,
 25       boost::wave::language_support(
 26         boost::wave::support_cpp|boost::wave::support_option_long_long));
 27   token_iterator end = token_iterator();
 28 
 29   boost::wave::token_id id = *it;
 30 
 31   while(it!=end) {
 32     if(id == boost::wave::T_CONTLINE) {
 33       std::cout<<"Found Contline";
 34     }
 35     ++it;
 36     id = *it;
 37   }
 38 return 0;
 39 }

Но я не получаю никакого вывода.

Я использую boostT_CONTLINE47_1 и gcc-4.5.

EDIT: На самом деле здесь был опубликован аналогичный отчет об ошибке:

https://svn.boost.org/trac/boost/ticket/5569

См. список изменений: http://www.boost.org/doc/libs/1_47_0/libs/wave/ChangeLog

Сообщается, что эта ошибка решена в последней версии Boost 1.47.0. Поэтому я установил последнюю версию Boost 1.47.0, но проблема остается.


person A. K.    schedule 31.07.2011    source источник


Ответы (1)


Да, этот токен не отображается на уровне итератора, он просто обрабатывается внутри на очень раннем этапе обработки. Это не ошибка, а ожидаемое поведение. Я добавлю примечание к документации.

person hkaiser    schedule 04.08.2011
comment
спасибо... но мне нужно определить T_CONTLINE. Как мне это сделать. Проблема в том, что когда я читаю токены в поток строк, а затем переписываю их в другой файл, все T_CONTLINE теряется и заменяется пробелом... из-за чего форматирование макросов сильно страдает. - person A. K.; 04.08.2011
comment
Я добавил в Wave новый флаг: support_option_emit_contnewlines, который позволяет библиотеке выпускать токены T_CONTLINE. Единственное предостережение заключается в том, что в настоящее время это поддерживается только пользовательским модулем лексера SLex. Вам нужно будет использовать это сейчас. - person hkaiser; 07.08.2011
comment
спасибо, я видел обновление. поскольку сейчас я использую boost_wave, я думаю, что переход на SLex займет некоторое время. Есть ли шанс, что вы также обновите лексер boost_wave. - person A. K.; 10.08.2011