Как сделать флекс (лексический сканер) для чтения символов UTF-8? - PullRequest
3 голосов
/ 28 мая 2009

Кажется, что flex не поддерживает ввод UTF-8. Всякий раз, когда сканер обнаруживает не-ASCII-символ, он прекращает сканирование, как если бы это был EOF.

Есть ли способ заставить flex съесть мои символы UTF-8? Я не хочу, чтобы он действительно совпадал с символами UTF-8, просто ешьте их, когда используете '.' шаблон.

Есть предложения?

EDIT

Наиболее простым решением будет:

ЛЮБОЙ [\ x00- \ xff]

и используйте «ЛЮБОЙ» вместо «.» в моих правилах.

Ответы [ 2 ]

6 голосов
/ 28 мая 2009

Я сам изучал это и читал список рассылки Flex, чтобы узнать, думал ли кто-нибудь об этом. Заставить Flex читать юникод - дело сложное ...

Можно выполнить кодировку UTF-8, и большинство других кодировок (16-е) приведут к большим таблицам, управляющим автоматами.

На данный момент распространенным методом является:

Я просто написал шаблоны, соответствующие одному UTF-8. персонажи. Они выглядят примерно так следующее, но вы можете перечитайте спецификацию UTF-8 потому что я написал это так давно.
Вам, конечно, нужно будет объединить это, так как вы хотите строки Unicode, не только отдельные символы.

UB [\200-\277] %% 
[\300-\337]{UB}                   { do something } 
[\340-\357]{UB}{2}                { do something } 
[\360-\367]{UB}{3}                { do something } 
[\370-\373]{UB}{4}                { do something } 
[\374-\375]{UB}{5}                { do something }

Взято из списка рассылки.

Я могу взглянуть на создание правильного патча для поддержки UTF-8 после более подробного изучения. Вышеуказанное решение кажется невозможным для больших файлов .l. И действительно ужасно! Вы можете использовать диапазоны, подобные, чтобы создать '.' подставить правило, соответствующее всем символам ASCII и UTF-8, но все равно довольно уродливо.

надеюсь, это поможет!

1 голос
/ 30 июня 2009

написание класса символов негатетов также может помочь:

[\ n \ t] return WHITESPACE; [^ \ n \ t] retrun NON_WHITESPACE

...