Как сделать flex (лексический сканер) для чтения введенных символов UTF-8?

StackOverflow https://stackoverflow.com/questions/921648

Вопрос

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

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

Есть какие-нибудь предложения?

Редактировать

Самым простым решением было бы:

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

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

Это было полезно?

Решение

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

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

Распространенным методом до сих пор является:

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

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, но все равно довольно уродливые.

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

Другие советы

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

[ ] возвращает ПРОБЕЛ;[^ ] повторно выполнить NON_WHITESPACE

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top