LINUX.ORG.RU

cpp-peglib 1.10.0 и 1.10.1

 , cpp-peglib, , ,


0

2

12-го и 14-го марта, после длительного затишья, состоялись выпуски 1.10.0 и 1.10.1 библиотеки cpp-peglib, реализующей PEG (грамматику, разбирающую выражение).

Библиотека поддерживает синтаксис, подробно описанный Брайаном Фордом на странице 2 документа «Parsing Expression Grammars: A Recognition-Based Syntactic Foundation», со многими дополнительными улучшениями.

В отличие от таких проектов, как PEGTL, Lexy и многих других, cpp-peglib позволяет задать выражение PEG и во время выполнения.

Библиотека написана на языке C++ (стандарт C++17, header-only) и распространяется по лицензии MIT.

Изменения:

  • добавлена возможность обработки данных предикатов;
  • добавлена поддержка грамматик с левой рекурсией;
  • улучшена производительность;
  • исправлена ошибка в порядке параметров оптимизатора AST.

>>> Попробовать онлайн (пример грамматики JSON на скриншоте)

>>> Подробности на GitHub

★★★★★

Проверено: CrX ()
Последнее исправление: CrX (всего исправлений: 2)

Кстати, широко известная в узких кругах cpp-httplib, от этого же автора:

cpp-httplib is an HTTP/HTTPS library for C++. Just copy a single header file, httplib.h, and you’re ready to go.

dataman ★★★★★
() автор топика
Ответ на: комментарий от dataman

Кстати, широко известная в узких кругах cpp-httplib

Under the hood, it uses blocking I/O with a thread pool. It’s not built for handling massive numbers of simultaneous connections.

Для сколь-нибудь серьезной нагрузки не годится. Вот если бы кто-то вырезал кусок nginx, в части парсинга HTTP и HTTP/2 и работой с соединениями, чтоб можно было юзать со своей логикой… Nginx все таки использует асинхронную, неблокирующую, событийно-ориентированную модель обработки запросов.

iron ★★★★★
()
Последнее исправление: iron (всего исправлений: 1)
Ответ на: комментарий от iron

ну так сделай сплит, иишкой замаскируй. и скажи что «это палантир/клод/копилот»(с)

etwrq ★★★★★
()
Последнее исправление: etwrq (всего исправлений: 1)
Ответ на: комментарий от iron

Для сколь-нибудь серьезной нагрузки не годится.

В куче проектов используется вместо curl. В Zeal, например.

dataman ★★★★★
() автор топика
Ответ на: комментарий от dataman

Кстати, широко известная в узких кругах cpp-httplib

Интересно, её в эмбед можно засунуть? Чтобы с LwIP работала.

Beewek ★★★
()
Ответ на: комментарий от Beewek

Интересно, её в эмбед можно засунуть?

Понятия не имею. :)

dataman ★★★★★
() автор топика
Ответ на: комментарий от liksys

Да, есть. Но для проекта на плюсах удобнее было бы плюсовую же либу для http сервера. Саму-то LwIP вряд ли заменю, а сервер - почему бы и нет?

Beewek ★★★
()
Ответ на: комментарий от liksys

Ну фиг знает. Когда вижу в списке параметров функции (void *connection) - сразу хочется выкинуть либу.

ЗЫ. Посмотрел cpp-httplib - тяжеловата для эмбеда. Исключения, std::string, всякие мультимапы/хеши и прочее. Жаль.

Beewek ★★★
()
Ответ на: комментарий от etwrq

а PE это pytohon expressions?

Parsing Expression Grammar же.

dataman ★★★★★
() автор топика
Ответ на: комментарий от iron

Не надо никакие куски вырезать... Напиши сам если нужно. Хотя http/2 весьма неприятный протокол, но реализовать его вполне можно своими силами. И это явно лучше чем копипастить чужие куски кода без понимания.

firkax ★★★★★
()
Ответ на: комментарий от firkax

Да. Никакого контроля типов, никакой подсказки, что там должно быть. И часто бывает несколько уровней вложенности этих void*. Типа, сюда вот надо передать структуру session*, в ней есть void *connection, а у connection есть void *user_data. Но иногда вместо connection может храниться что-то другое, и тогда логика работы меняется. Я не говорю, что везде так, но бывает.

Beewek ★★★
()
Ответ на: комментарий от dataman

Может быть, Вы знаете библиотеку http-client для C++, в которой транспорт и протокол были бы явно выделенными сущностями: транспорт (например, что-то поверх libevent или аналогов) отвечал за доставку в обоих направлениях и прочие коннекты/дисконнекты, а а протокольная часть отвечала бы за разбор и формирование этих данных, работая поверх представленного транспорта?

Обычно все http библиотеки для C++ упирают на простоту использования: «пихайте свои запросы вот в эту дырку и ждите ответа». Однако, такая схема плохо подходит для случаев одновременной обработки десятков тысяч одновременных соединений и десятков Mbs трафика в многопротокольном сервисе.

AlexM ★★★★★
()
Последнее исправление: AlexM (всего исправлений: 1)
Ответ на: комментарий от iron

А в чем проблема написать самому «асинхронную, неблокирующую, событийно-ориентированную модель обработки запросов» ?

Reset ★★★★★
()
Ответ на: комментарий от AlexM

Неужели ничего подходящего не нашлось на:

:)

На первый взгляд подходит https://github.com/chronoxor/CppServer:

Ultra fast and low latency asynchronous socket server & client C++ library with support TCP, SSL, UDP, HTTP, HTTPS, WebSocket protocols and 10K connections problem solution.

Has integration with high-level message protocol based on Fast Binary Encoding

Возможно, что её автор и на ЛОРе есть. :)

dataman ★★★★★
() автор топика
Последнее исправление: dataman (всего исправлений: 1)
Ответ на: комментарий от firkax

Не надо никакие куски вырезать… Напиши сам если нужно.

Дык написал уже. HTTP 1.(0/1) очень прост для парсинга. Но я бы с радостью взял уже готовую реализацию. Заглянул в исходники nginx и был приятно удивлен как там классно реализованы парсеры и работа с событиями/сокетами.

iron ★★★★★
()
Ответ на: комментарий от iron

Намного полезней будет научиться по этим исходникам делать аналогичное, а не тупо их копипастить.

firkax ★★★★★
()

В отличие от таких проектов, как PEGTL, Lexy и многих других, cpp-peglib позволяет задать выражение PEG и во время выполнения.

Есть ли в этом какой-то практический смысл кроме как уменьшение объема потребляемой С++ным компилятором памяти и сокращения времени работы C++ компилятора?

eao197 ★★★★★
()
Ответ на: комментарий от dataman

Он же на скриншоте.

На скриншоте абстрактный конь в сферическом вакууме – какая из этого практическая польза – лично мне не ведомо и если кто-то пояснит, то буду признателен.

Как-то в жизни грамматики описывают ту структуру информации, с которой приходится работать. Например, что-то вроде:

duration = value ( multiplicator )
value = NUMBER
multiplicator = 'd' | 'h' | 'm' | 's' | 'ms' | 'us'

Соответственно из знаний структуры мы затем строим работу с результатом парсинга, т.е. берем число и, если есть, конкретный мультипликатор и строим итоговое значение (скажем, в виде std::chrono::duration).

Т.е. завязка на структуру все равно появляется еще на этапе компиляции. Какая польза от возможности описать грамматику в ран-тайме мне неведомо (за исключением факторов, который были описаны выше).

eao197 ★★★★★
()
Последнее исправление: eao197 (всего исправлений: 1)

Как раз вожусь с Lexy, сабж выглядит гораздо дубовее. Типы стираются, всюду any, динамика, императивщина. Динамическая грамматика при этом - странная фича.

Но хорошо что PEG. Кажется, пора уже вытеснять Хомского.

unsigned ★★★★
()
Ответ на: комментарий от iron

HTTP 1.(0/1) очень прост для парсинга

Вот это (github.com) - «очень прост»? Завидую.

Мне хватило открыть спеку http 1.1, чтобы передумать писать парсер и взять готовый (из того же nginx, в виде http-parser). Иначе до самой задачи я бы дошел еще очень не скоро, а баги собирал бы бесконечно.

unsigned ★★★★
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.