词汇表/标记符和字符集

时间:2010-02-11 10:55:11

标签: c character-encoding tokenize lexical-analysis

构造词法分析器/标记器时依赖函数(在 C 中)是错误的,例如isdigit / isalpha / ...?据我所知,它们依赖于语言环境。我应该选择一个字符集并专注于它并制作一个角色映射我自己从中查找分类吗?然后问题变得能够多个字符集。我是否为每个字符集生成一个词法分析器/标记器,或者我是否尝试编写我编写的那个,这样我唯一要做的就是更改字符映射。什么是常见做法?

4 个答案:

答案 0 :(得分:3)

现在,我将专注于使用纯ASCII字符集首先使词法分析器工作,然后当词法分析器工作时,为不同的字符类型(如UTF-16和语言环境支持)提供映射支持。

不,依赖ctype的函数,例如isdigitisalpha等等,这不是错误的。

实际上,也许在稍后阶段,对于宽字符“wctype.h”有一个相当于ctype的Posix,所以定义一个宏可能符合你的最佳利益,以后......这样你就会能够透明地更改代码以处理不同的区域设置...

#ifdef LEX_WIDECHARS
#include <wctype.h>
#define isdigit  iswdigit
#else
#define isdigit
#endif

在这种情况下,它将被定义为类似的东西......

希望这有帮助, 最好的祝福, 汤姆。

答案 1 :(得分:2)

ctype.h函数对于包含除ASCII之外的任何字符的字符都不是非常有用。无论系统区域设置是什么,默认语言环境都是C(与大多数计算机上的ASCII基本相同)。即使您使用setlocale更改区域设置,系统也可能使用大于8位字符的字符集(例如UTF-8),在这种情况下,您无法从单个字符中分辨出任何有用的内容。

宽字符可以正确处理更多案例,但即使它们也经常失败。

因此,如果您想要可靠地支持非ASCII空间,您必须自己(或者可能使用现有的库)。

注意:ASCII只有字符代码0-127(或32-127),有些调用8位ASCII实际上是其他字符集(通常是CP437,CP1252,ISO-8859-1,通常也是其他字符集)。

答案 2 :(得分:2)

您可能不会在尝试构建本地敏感解析器方面走得太远 - 它会让您发疯。 ASCII适用于大多数解析需求 - 不要对抗它:D

如果您确实想要对抗并使用某些字符分类,那么您应该查看实际使用Unicode的ICU库。

答案 3 :(得分:1)

一般来说,你需要问自己:

  • 你究竟想做什么,解析什么?
  • 您希望支持哪种语言,范围广泛或仅限西欧?
  • 您希望使用什么编码的UTF-8或本地化的8位编码?
  • 你在使用什么操作系统?

让我们开始吧,如果您使用本地化的8位编码使用西方语言,那么可能是的,如果安装和配置了语言环境,您可以继续使用*。

然而:

  • 如果您使用UTF-8,则不能,因为只能覆盖ASCII,因为ASCII之外的所有内容都需要多于一个字节。
  • 如果你想支持东方语言,那么关于解析的所有假设都是错误的,就像中文不使用空格来分隔单词一样。大多数语言甚至没有大写或小写,甚至是基于希伯来语或阿拉伯语的字母。

那么,你到底想做什么?

我建议看一下ICU库,它有各种中断迭代器,或其他像Qt这样提供一些基本边界分析的工具包。

相关问题