Как стать автором
Обновить

Flex & utf8

Время на прочтение1 мин
Количество просмотров4.6K
«Давным давно, кажется, в прошлую пятницу», мне потребовался лексический анализатор, умеющий работать с юникодными данными.

Построителем лексического анализатора хотелось иметь Flex, и это оказалось целой проблемой.
Сам по себе Flex не умеет работать с юникодными данными т.к. при построении автомата исходит из того, что символы 7 или 8 битные.

Встретился было flex-2.5.4a-unicode-patch, но только для 16-битных символов и конкретной версии со всеми вытекающими.

Меж тем есть простое и вполне работоспособное решение, не требующее лезть немытыми руками в святая святых пересборки инструментов.

Объявляем
%option 8bit
%option c++
...
alpha   [A-Za-z]
U1      [\x80-\xbf]
U2      [\xc2-\xdf]
U3      [\xe0-\xef]
U4      [\xf0-\xf4]
ualpha  {alpha}|{U2}{U1}|{U3}{U1}{U1}|{U4}{U1}{U1}{U1}
uname   ({ualpha}|\_)*
...
и voilà… можно пользоваться.
%%
...
{uname} {
  ...
  yylval.str_ = std::string(yytext);
  return XyzParser::ttName;
}
Теги:
Хабы:
Всего голосов 19: ↑15 и ↓4+11
Комментарии5

Публикации

Истории

Ближайшие события

15 – 16 ноября
IT-конференция Merge Skolkovo
Москва
22 – 24 ноября
Хакатон «AgroCode Hack Genetics'24»
Онлайн
28 ноября
Конференция «TechRec: ITHR CAMPUS»
МоскваОнлайн
25 – 26 апреля
IT-конференция Merge Tatarstan 2025
Казань