У пятніцу 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

Дадаць каментар