У п'ятницю 2 серпня вийшов реліз re2c — вільного генератора лексичних аналізаторів для мов C і C++. Нагадаємо, що re2c був написаний в 1993 році Пітером Бамбулісом як експериментальний генератор дуже швидких лексичних аналізаторів, що відрізняється від інших генераторів швидкістю згенерованого коду і незвичайно гнучким інтерфейсом користувача, який дозволяє легко і ефективно встроювати аналізатори в існуючу кодову базу. З того часу проект розвивається співтовариством і продовжує залишатися майданчиком для експериментів та досліджень у галузі формальних граматик та кінцевих автоматів.

Основні нововведення у версії 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 ,
    яка дозволяє змінити поведінку та розпарсувати "∀x ∃y" як
    2200 78 20 2203 79.

  • Re2c тепер дозволяє використовувати звичайні re2c-блоки як -r —reuse.
    Це зручно, якщо вхідний файл містить багато блоків, і лише частина їх
    потребує повторного використання.

  • З'явилася можливість задавати формат попереджень та повідомлень про помилки
    за допомогою нової опції -location-format . Формат GNU відображається
    як filename:line:column:, а MSVC-формат - як filename(line,column).
    Ця можливість може стати в нагоді любителям IDE.
    Також була додана опція verbose, яка виводить коротке переможне повідомлення у разі успіху.

  • Було доопрацьовано режим «сумісності» з flex — виправлено деякі помилки розбору та
    неправильний пріоритет операторів у поодиноких випадках.
    Історично опція -F-flex-support дозволяє писати код
    впереміш у стилі flex і в стилі re2c, що трохи ускладнює синтаксичний розбір.
    Режим сумісності з flex рідко використовується в новому коді,
    але re2c продовжує підтримувати його зворотної сумісності.

  • Оператор віднімання символьних класів / тепер застосовується
    до розгортання кодування, що дозволяє застосовувати його у більшій кількості випадків,
    якщо використовується кодування зі змінною довжиною символу (наприклад, UTF8).

  • Вихідний файл тепер створюється атомарно: re2c спочатку створює тимчасовий файл
    і пише в нього результат, а потім перейменовує тимчасовий файл у вихідний
    однією операцією.

  • Документація була дописана та переписана; зокрема, були додані нові
    глави про заповнення буфера
    и про способи перевірки на кінець вхідних даних.
    Нова документація зібрана у вигляді
    вичерпного односторінкового мануалу
    з прикладами (одні й самі вихідники малюються в manpage і в онлайн-документацію).
    Були зроблені слабкі спроби покращити читання сайту на телефонах.

  • З погляду розробників, re2c обзавівся більш повноцінною підсистемою
    налагодження. Налагоджувальний код тепер відключений у релізних збірках та
    може бути включений за допомогою опції configure-enable-debug.

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

Дякую від розробників re2c всім, хто допоміг цьому релізу відбутися,
і загалом спільноті за ідеї, баг-репорти, патчі, бойовий дух і т.д. ;]

Джерело: linux.org.ru

Додати коментар або відгук