The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

Выпуск генератора лексических анализаторов re2c 1.2

02.08.2019 15:39

Состоялся релиз re2c, свободного генератора лексических анализаторов для языков C и C++. Напомним, что re2c был написан в 1993 году Питером Бамбулисом как экспериментальный генератор очень быстрых лексических анализаторов, отличающийся от других генераторов скоростью сгенерированного кода и необычно гибким пользовательским интерфейсом, который позволяет легко и эффективно встраивать анализаторы в существующую кодовую базу. С тех пор проект развивается сообществом и продолжает оставаться площадкой для экспериментов и исследований в области формальных грамматик и конечных автоматов.

Подготовка релиза заняла почти целый год. Большинство времени, как всегда, ушло на разработку теоретической базы и написание статьи "Efficient POSIX Submatch Extraction on NFA". Алгоритмы, описанные в статье, реализованы в экспериментальной библиотеке libre2c (сборка библиотеки и тестов производительности выключена по умолчанию и включается configure-опцией "--enable-libs"). Библиотека задумана не как конкурент уже существующим проектам, таким как RE2, а как исследовательская площадка для разработки новых алгоритмов (которые потом могут использоваться в re2c или в других проектах). Также это удобно с точки зрения тестирования, измерения производительности и создания биндингов к другим языкам.

Основные новшества в версии re2c 1.2:

  • Добавлен новый упрощённый способ проверки конца входных данных ("EOF rule"). Для этого добавлена конфигурация "re2c:eof", позволяющая выбрать терминальный символ, и специальное правило "$", которое срабатывает если лексер успешно достиг конца входных данных. Исторически re2c предоставляет на выбор несколько способов проверки на конец входных данных, варьирующихся по ограниченности, эффективности и простоте применения. Новый способ призван упростить написание кода, при этом оставаясь эффективным и широко применимым. Старые способы по-прежнему работают и могут быть предпочтительными в отдельных случаях.
  • Добавлена возможность включения внешних файлов с помощью директивы "/*!include:re2c "file.re" */", где "file.re" - это имя включаемого файла. Re2c ищет файлы в директории включающего файла, а также в списке путей заданных с помощью опции "-I". Включённые файлы могут включать другие файлы. Re2c предоставляет "стандартные" файлы в директории "include/" проекта - предполагается, что там будут накапливаться полезные определения регулярных выражений, что-то в духе стандартной библиотеки. Пока что по просьбам трудящихся добавлен один файл с определениями категорий Unicode.
  • Добавлена возможность генерировать заголовочные файлы с произвольным содержанием при помощи опций "-t --type-header" (или соответствующих конфигураций) и новых директив "/*!header:re2c:on*/" и "/*!header:re2c:off*/". Это может быть полезно в случаях, когда re2c должен сгенерировать определения переменных, структур и макросов, использующихся в других единицах трансляции.
  • Re2c теперь понимает UTF8-литералы и классы символов в регулярных выражениях. По умолчанию, re2c парсит выражения вроде "∀x ∃y" как последовательность 1-байтных ASCII-символов "e2 88 80 78 20 e2 88 83 79" (hex-коды), и пользователям приходится экранировать Unicode-символы вручную: "\\u2200x \\u2203y". Это очень неудобно и неожиданно для многих пользователей (о чём свидетельствуют постоянные баг репорты). Поэтому теперь re2c предоставляет опцию "--input-encoding {ascii | utf8}", которая позволяет изменить поведение и распарсить "∀x ∃y" как "2200 78 20 2203 79".
  • Re2c теперь позволяет использовать обычные re2c-блоки в режиме "-r --reuse". Это удобно, если входной файл содержит много блоков, и только часть из них нуждается в повторном использовании.
  • Появилась возможность задавать формат предупреждений и сообщений об ошибках с помощью новой опции "--location-format {gnu | msvc}". GNU-формат отображается как "filename:line:column:", а MSVC-формат - как "filename(line,column)". Эта возможность может пригодиться любителям IDE. Также была добавлена опция "--verbose", которая выводит краткое победоносное сообщение в случае успеха.
  • Доработан режим "совместимости" с flex - исправлены некоторые ошибки разбора и неправильный приоритет операторов в редких случаях. Исторически опция "-F --flex-suppor" позволяет писать код вперемешку в стиле flex и в стиле re2c, что немного затрудняет синтаксический разбор. Режим совместимости с flex редко используется в новом коде, но re2c продолжает поддерживать его для обратной совместимости.
  • Оператор вычитания символьных классов "/" теперь применяется до разворачивания кодировки, что позволяет применять его в большем числе случаев, если используется кодировка с переменной длиной символа (например UTF8).
  • Выходной файл теперь создаётся атомарно: re2c сначала создаёт временный файл и пишет в него результат, а потом переименовывает временный файл в выходной одной операцией.
  • Документация была дописана и переписана; в частности, были добавлены новые главы про http://re2c.org/manual/manual.html#buffer-refilling заполнение буфера и про способы проверки на конец входных данных. Новая документация собрана в виде исчерпывающего одностраничного руководства с примерами (одни и те же исходники отрисовываются в manpage и в онлайн-документацию). Были предприняты слабые попытки улучшить читаемость сайта на телефонах.
  • С точки зрения разработчиков, re2c обзавёлся более полноценной подсистемой отладки. Отладочный код теперь отключён в релизных сборках и может быть включен с помощью configure-опции "--enable-debug".


  1. Главная ссылка к новости (http://re2c.org/releases/relea...)
Автор новости: skvadrik
Лицензия: CC BY 3.0
Короткая ссылка: https://opennet.ru/51209-re2c
Ключевые слова: re2c, lex
При перепечатке указание ссылки на opennet.ru обязательно


Обсуждение (13) Ajax | 1 уровень | Линейный | +/- | Раскрыть всё | RSS
  • 1.1, Аноним (1), 19:30, 02/08/2019 [ответить] [﹢﹢﹢] [ · · · ]  
  • –2 +/
    > Предупреждение: Вероятная угроза безопасности
    > Firefox обнаружил вероятную угрозу безопасности и не стал открывать re2c.org. Если вы посетите этот сайт, нападавшие могут попытаться похитить вашу информацию, такую как пароли, адреса электронной почты или данные банковских карт.
    > Сертификат действителен только для следующих доменов: *.github.com, github.com, *.github.io, github.io
    > Код ошибки: SSL_ERROR_BAD_CERT_DOMAIN
     
     
  • 2.2, имя (?), 19:35, 02/08/2019 [^] [^^] [^^^] [ответить]  
  • +3 +/
    Поздравляю, у тебя стоит аддон «HTTPS вездее, чем в списках EFF»
     
  • 2.4, Аноним84701 (ok), 19:58, 02/08/2019 [^] [^^] [^^^] [ответить]  
  • +5 +/
    > нападавшие могут попытаться похитить вашу информацию, такую как пароли, адреса электронной почты или данные банковских карт.

    Просто не вводите там пароли, явки, адреса или данные банковских карт!
    Даже если найдете куда (а то лично я полей для ввода чего-либо вообще не замечаю).
    Ваш Кэп

     

  • 1.3, Аноним (3), 19:41, 02/08/2019 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Крутая штука
     
  • 1.5, Аноним (5), 20:08, 02/08/2019 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Использую flex и bison, доволен. Но эту штуку тоже можно пощупать.
     
     
  • 2.6, neAnonim (?), 20:21, 02/08/2019 [^] [^^] [^^^] [ответить]  
  • +/
    Потому что они в dragon book описаны или есть объективные причины.
    Есть еще lex из openbsd
    https://github.com/openbsd/src/blob/master/bin/csh/lex.c
    Lemon из sqlite
    И другие представители (wiki). + сабж

    Я только начинаю изучать эту тему. Можете написать почему flex + bison

     
     
  • 3.7, Аноним (5), 20:41, 02/08/2019 [^] [^^] [^^^] [ответить]  
  • +/
    Выбирал не так долго, синтаксис показался весьма удобным. В cmake поддержка этой связки тоже оказалась из коробки.
     
  • 2.13, barmaglot (??), 14:44, 05/08/2019 [^] [^^] [^^^] [ответить]  
  • +/
    Я тоже использовал bison и flex, до тех пор пока с этой штукой не познакомился. Разница огромна.  Парсер JSON на bison с лексером flex, до двух раз медленнее, чем на r2c.

    Только гибкости у этой штуки маловато, но вот это исправление с EOF,  - НАКОНЕЦ!!! Столько извращений приходилось делать, и доп проверок что-бы за границы буфера не выходить.

     

  • 1.8, Аноним (8), 22:43, 02/08/2019 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    Юзаю CoCo/R для питона. На порядки быстрее, чем parglare - ближайшая альтернатива, более мощная, но тормозящая адски. Не говоря уже об остальных (согласно бенчмаркам автора его либа быстрее).
     
     
  • 2.10, Michael Shigorin (ok), 12:25, 03/08/2019 [^] [^^] [^^^] [ответить]  
  • –5 +/
    > Юзаю CoCo/R для питона. На порядки быстрее, чем parglare

    Надо же, хоть что-то конструктивного. :)

    (этот же "провиндовый" персонаж спамил в соседних новостях деструктивно)

     
     
  • 3.11, neAnonim (?), 16:08, 03/08/2019 [^] [^^] [^^^] [ответить]  
  • +/
    У нас динамические ip. Если специально не заплачено за статический. С чего вы взяли что персонаж тот же?
     
     
  • 4.12, Michael Shigorin (ok), 16:15, 03/08/2019 [^] [^^] [^^^] [ответить]  
  • –4 +/
    > У нас динамические ip. Если специально не заплачено
    > за статический. С чего вы взяли что персонаж тот же?

    IP тот же, временной промежуток небольшой, поведение характерное.  Это не гарантия, но с большой вероятностью таки тот же.

     

  • 1.15, Amurzet (ok), 13:09, 06/08/2019 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Занимался разработкой NetFlow коллектора, в разборе конфигов, а также языка фильтров для потока (типа offline файрвола) эти вещи (синтаксические/семантические анализаторы) были незаменимыми.

    Для интересующихся рекомендую посмотреть на lemon (часть проекта SQLite).
    т.е. lemon+re2c более современная связка чем lex(flex)/yacc(bison).

    Например, reentrance (при многопоточности) поддерживается в классических утилитах очень коряво.

     

     Добавить комментарий
    Имя:
    E-Mail:
    Текст:



    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2024 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру