Flex & utf8

от автора

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

Построителем лексического анализатора хотелось иметь 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; } 

ссылка на оригинал статьи http://habrahabr.ru/post/192556/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *