Использование re2c с ISO-8859-x

У нас есть некоторый текст в ISO-8859-15, который мы хотим маркировать. (ISO-8859-15 - это ISO-8859-1 со знаком евро и другими общими акцентированными символами, более подробную информацию см. В ISO-8859-15).

Я пытаюсь заставить синтаксический анализатор распознавать все символы. Родное символьное представление текстовых редакторов, которые я использую, - UTF-8, поэтому, чтобы избежать скрытых проблем преобразования, я ограничиваю все re2c код для ASCII, например

LATIN_CAPITAL_LETTER_A_WITH_GRAVE      = "\xc0" ;
LATIN_CAPITAL_LETTER_A_WITH_ACUTE      = "\xc1" ;
LATIN_CAPITAL_LETTER_A_WITH_CIRCUMFLEX = "\xc2" ;
LATIN_CAPITAL_LETTER_A_WITH_TILDE      = "\xc3" ;
...

Затем:

UPPER    = [A-Z] | LATIN_CAPITAL_LETTER_A_WITH_GRAVE
                 | LATIN_CAPITAL_LETTER_A_WITH_CIRCUMFLEX
                 | LATIN_CAPITAL_LETTER_AE
                 | LATIN_CAPITAL_LETTER_C_WITH_CEDILLA
                 | ...

WORD     = UPPER LOWER* | LOWER+ ;

Он без проблем компилируется и отлично работает на ASCII, но останавливается всякий раз, когда сталкивается с этими расширенными символами.

Кто-нибудь видел это, и есть ли способ это исправить?

Спасибо,

Yimin

1 ответ

Решение

Да, я видел это Имеет отношение к сравнению типов со знаком и без знака для байтов ≥ 128.

Два способа исправить: использовать unsigned char как тип по умолчанию, например re2c:define:YYCTYPE = "unsigned char";, или же -funsigned-char (при использовании gccдругие компиляторы имеют аналог) как флаг компиляции. Вы можете использовать тот, который меньше всего мешает вашему существующему коду.

Другие вопросы по тегам