Использование 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
другие компиляторы имеют аналог) как флаг компиляции. Вы можете использовать тот, который меньше всего мешает вашему существующему коду.