У пятніцу 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 спачатку стварае часовы файл
і піша ў яго вынік, а потым пераназывае часовы файл у выходны
адной аперацыяй.
З пункту гледжання распрацоўшчыкаў, re2c абзавёўся больш паўнавартаснай падсістэмай.
адладкі. Адладкавы код зараз адключаны ў рэлізных зборках і
можа быць уключаны з дапамогай configure-опцыі -enable-debug.
Гэты рэліз заняў доўгі час - амаль цэлы год.
Большасць часу, як заўсёды, пайшло на распрацоўку тэарэтычнай базы і напісанне
артыкулы "Efficient POSIX Submatch Extraction on NFA".
Алгарытмы, апісаныя ў артыкуле, рэалізаваны ў эксперыментальнай бібліятэцы libre2c
(зборка бібліятэкі і бенчмаркаў выключана па змаўчанні і ўключаецца configure-опцыяй
-enable-libs). Бібліятэка задумана не як канкурэнт ужо існуючым.
праектам накшталт RE2, а як даследчая пляцоўка для распрацоўкі новых
алгарытмаў (якія потым могуць выкарыстоўвацца ў re2c ці ў іншых праектах).
Таксама гэта зручна з пункту гледжання тэсціравання, бенчмаркаў і стварэння біндзінгаў да іншых моў.
Дзякуй ад распрацоўшчыкаў re2c усім, хто дапамог гэтаму рэлізу адбыцца,
і ў цэлым супольнасці за ідэі, баг рэпарты, патчы, баявы дух і г.д. ;]