我们在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上运行良好,但只要它碰到这些扩展字符就会停止。
有没有人见过这个,有没有办法解决它?
谢谢,
一民
答案 0 :(得分:3)
是的,我已经看过了。与字节≥128的有符号和无符号类型的比较有关。
两种解决方法:使用unsigned char
作为默认类型,例如 re2c:define:YYCTYPE = "unsigned char";
或-funsigned-char
(如果使用gcc
,则使用其他编译器有相同的)作为编译标志。您可以使用最不干扰现有代码的那个。