Обновление Boost :: Spirit ParsererC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Обновление Boost :: Spirit Parserer

Сообщение Anonymous »

В прошлом я сделал Boost :: Spirit анализатор, чтобы прочитать журнал, где только один тип строки содержал полезную информацию, в то время как остальное можно было отбросить. 1; 250,9; A0127FC384DF400115406C800011806C031A0000; и информация для сохранения находится после равного символу (=) и состоят в «»; » Отдельные данные, стоящие за ID (UINT); Position (Double); Telegram (HexChars); (кстати, дата отбрасывается).
Для нового формата журнала теперь можно было бы включить одну или несколько строк данных после равного символа, как в 2025-06-06 09: 33: 36,163154]-0,06-06 09: 33: 36, 1; 250,9; A0127FC3844DF400115406C800011806C031A0000; 2; 253,9; A0027FC384DF40010C8092A041FF83FFF; 3; 449.9; A1027FC38F361210BF080007DF; P> CODES> /> Я должен обновить следующий код, чтобы соблюдать этот новый запрос на несколько данных на линию, но я не могу сделать это после того, как попробовал несколько комбинаций и синтаксического анализатора: < /p>

Код: Выделить всё

#include 
#include 

namespace structs {
struct Message
{
unsigned id;
double position;
std::string hex;
};

using Messages = std::vector;
}

namespace qi = boost::spirit::qi;

namespace parser {
class log
{
using It = boost::spirit::istream_iterator;

public:
log()
{
using namespace qi;
using namespace structs;
using boost::phoenix::push_back;

tcl = (omit[raw[*~char_('>')]] >> '>'
>> "insert ="
>> uint_ >> ';' >> double_ >> ';' >> lexeme[raw[+xdigit]] >> ';')[fill(_1, _2, _3, _val)];

ignore = *~char_("\r\n");

start = skip(blank)[(tcl[push_back(_val, _1)] | ignore) % eol];
}

structs::Messages read(const std::string& file)
{
structs::Messages messages;

std::stringstream in{ file };
//std::ifstream in(ss, std::ios_base::in);
in >> std::noskipws;//No white space skipping

auto ok = qi::parse(boost::spirit::istream_iterator{ in }, boost::spirit::istream_iterator{}, start, messages);
return ok ? messages : structs::Messages{};
}

private:
struct deferred_fill
{
void operator() (unsigned id, double position, boost::iterator_range const& tlg, structs::Message& message) const
{
message.id       = id;
message.position = position;
message.hex.assign(tlg.begin(), tlg.end());
}
};

qi::rule   ignore;
qi::rule start;
qi::rule tcl;
boost::phoenix::function fill;
};

}

auto file1{
R"([2025-06-06 09:33:30.002155] - 0.000 s => begins to load XML file
[2025-06-06 09:33:30.250151] - 0.000 s => Received -> id: 1
[2025-06-06 09:33:30.253154] - 0.000 s => End initial Mnemonics
[2025-06-06 09:33:36.163154] - 0.020 s => insert = 1;250.9;A0127FC384DF400115406C800011806C031A0000;
[2025-06-06 09:33:36.164151] - 0.020 s => Received -> id: 2
[2025-06-06 09:35:05.444160] - 89.360 s => insert = 7;1655.9;A0027FC384E240010C8092A041FF83FFF;
[2025-06-06 09:33:36.164151] - 0.020 s => Received -> element_id: 1 connection_id:  command: free
[2025-06-06 09:35:54.648162] - 138.560 s => insert = 9;2258.9;A002054384E3C0010C8092A041;
[2025-06-06 09:36:07.028155] - 150.940 s => Received -> Value: 1)" };

auto file2{
R"([2025-06-06 09:33:30.002155] - 0.000 s => begins to load XML file
[2025-06-06 09:33:30.250151] - 0.000 s => Received -> id: 1
[2025-06-06 09:33:30.253154] - 0.000 s => End initial Mnemonics
[2025-06-06 09:33:36.163154] - 0.020 s => insert = 1;250.9;A0127FC384DF400115406C800011806C031A0000;2;253.9;A0027FC384DF40010C8092A041FF83FFF;3;449.9;A1027FC38F361210BF080007DF;
[2025-06-06 09:33:36.164151] - 0.020 s => Received -> id: 2
[2025-06-06 09:35:05.444160] - 89.360 s => insert = 7;1655.9;A0027FC384E240010C8092A041FF83FFF;
[2025-06-06 09:33:36.164151] - 0.020 s => Received -> element_id: 1 connection_id:  command: free
[2025-06-06 09:35:54.648162] - 138.560 s => insert = 9;2258.9;A002054384E3C0010C8092A041;10;2261.9;A0127FC384E3C00115412C80008B1007F4;
[2025-06-06 09:36:07.028155] - 150.940 s => Received -> Value: 1)" };

int main()
{
parser::log log;
auto messages1 = log.read(file1);
if (messages1.size() != 3) return 1;// Error parsing!!!

auto messages2 = log.read(file2);
if (messages2.size() != 6) return 1;// Error parsing!!!

return 0;
}
Код должен соответствовать C ++ 17 (не дальше, пожалуйста) и избегать ошибок анализа под старым (File1 String) и новыми форматами журнала File2).
>

Подробнее здесь: https://stackoverflow.com/questions/796 ... rit-parser
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Boost Spirit x3 путаница в разборе фраз
    Гость » » в форуме C++
    0 Ответы
    27 Просмотры
    Последнее сообщение Гость
  • Boost :: Spirit :: Qi Compiler Error при попытке интегрировать анализатор Skip
    Anonymous » » в форуме C++
    0 Ответы
    6 Просмотры
    Последнее сообщение Anonymous
  • Boost :: Spirit :: Qi Compiler Error при попытке интегрировать анализатор Skip
    Anonymous » » в форуме C++
    0 Ответы
    7 Просмотры
    Последнее сообщение Anonymous
  • Как я могу использовать полиморфные атрибуты с Boost :: Spirit :: Qi Parsers?
    Anonymous » » в форуме C++
    0 Ответы
    7 Просмотры
    Последнее сообщение Anonymous
  • Как проанализировать логическое выражение в Boost :: Spirit
    Anonymous » » в форуме C++
    0 Ответы
    11 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C++»