- PVSM.RU - https://www.pvsm.ru -
«Давным давно, кажется в прошлую пятницу», мне потребовался лексический анализатор, умеющий работать с юникодными данными.
Построителем лексического анализатора хотелось иметь Flex [1], и это оказалось целой проблемой.
Сам по себе Flex не умеет работать с юникодными данными т.к. при построении автомата исходит из того, что символы 7 или 8 битные.
Встретился было flex-2.5.4a-unicode-patch [2], но только для 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;
}
Автор: zzeng
Источник [3]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/programmirovanie/42566
Ссылки в тексте:
[1] Flex: http://flex.sourceforge.net/
[2] flex-2.5.4a-unicode-patch: http://xqilla.sourceforge.net/FlexandBison
[3] Источник: http://habrahabr.ru/post/192556/
Нажмите здесь для печати.