Может ли Бизон разобрать символы UTF-8? - PullRequest
8 голосов
/ 01 июня 2009

Я пытаюсь сделать парсер Bison для обработки символов UTF-8. Я не хочу, чтобы синтаксический анализатор фактически интерпретировал значения символов Unicode, но я хочу, чтобы он анализировал строку UTF-8 как последовательность байтов.

Сейчас Bison генерирует следующий код, который проблематичен:

  if (yychar <= YYEOF)
    {
      yychar = yytoken = YYEOF;
      YYDPRINTF ((stderr, "Now at end of input.\n"));
    }

Проблема в том, что многие байты строки UTF-8 будут иметь отрицательное значение, а Bison интерпретирует отрицательные значения как EOF и останавливается.

Есть ли способ обойти это?

Ответы [ 3 ]

8 голосов
/ 01 июня 2009

bison да, flex нет. Однажды, когда мне понадобился парсер бизонов для работы с файлами в кодировке UTF-8, я написал собственную функцию yylex.

edit : Чтобы помочь, я использовал множество операций Unicode, доступных в glib (есть тип gunicode и некоторые функции манипулирования файлами / строками, которые я нашел полезными) .

4 голосов
/ 01 июня 2009

flex здесь проблема, вы можете взглянуть на zlex.

0 голосов
/ 20 июля 2013

Это вопрос 4 года назад, но я сталкиваюсь с теми же проблемами, и я хотел бы поделиться своими идеями.

Проблема в том, что в UTF-8 вы не знаете, сколько байтов нужно прочитать. Как предложено выше, вы можете использовать свой собственный лексер, и он должен либо читать целые строки, либо каждый раз читать 4 байта. Затем извлеките из него символ UTF-8 и прочитайте дополнительные байты, чтобы завершить снова до 4 байтов.

...