2013-04-07 90 views
1

我正在编写一个编译器(用于我自己的编程语言),我想允许用户使用Unicode字母类别中的任何字符来定义标识符(现代语言,如Go已经允许这样的语法)。 我已经阅读了很多关于C++ 11中的字符编码的知识,并且基于我发现的所有信息,使用utf32编码会很好(在词法分析器中迭代速度很快,并且它比在C++中的utf8)。如何测试仅用于字母的u32字符串(使用语言环境)

在C++中有isalpha函数。我如何测试wchar32_t如果它是一个字母(在任何语言中被分类为“字母”的Unicode代码点)?

这有可能吗?

+0

Unicode标准包含有关编程语言中'标识符'应允许使用哪些字符的指导原则。 C++实际上被指定遵循这些guildlines,虽然在实际的实现中支持仍然很不明显。除了标识符和特定文字之外,您不必对字符进行分类,因为您几乎完全指定了每个标记。 – bames53 2013-04-07 01:46:42

+0

我在哪里可以找到这些指导?是否有任何C++函数,用于检查specyfic字符是否可用于编程语言中的“标识符”(根据规范)? – 2013-04-07 02:12:35

+1

这是关于测试有效的* C++标识符字符*或有效的*字母字符*的问题吗? – 2013-04-07 03:58:59

回答

1

使用ICU来迭代字符串并检查是否满足适当的Unicode属性。这里是用C来检查UTF-8命令行参数是否是有效的标识符的一个示例:

#include <stdint.h> 
#include <stdlib.h> 
#include <string.h> 

#include <unicode/uchar.h> 
#include <unicode/utf8.h> 

int main(int argc, char **argv) { 
    if (argc != 2) return EXIT_FAILURE; 
    const char *const str = argv[1]; 
    int32_t off = 0; 
    // U8_NEXT has a bug causing length < 0 to not work for characters in [U+0080, U+07FF] 
    const size_t actual_len = strlen(str); 
    if (actual_len > INT32_MAX) return EXIT_FAILURE; 
    const int32_t len = actual_len; 
    if (!len) return EXIT_FAILURE; 
    UChar32 ch = -1; 
    U8_NEXT(str, off, len, ch); 
    if (ch < 0 || !u_isIDStart(ch)) return EXIT_FAILURE; 
    while (off < len) { 
    U8_NEXT(str, off, len, ch); 
    if (ch < 0 || !u_isIDPart(ch)) return EXIT_FAILURE; 
    } 
} 

注意,这里ICU使用Java的定义,其是从那些UAX #31略有不同。在真正的应用程序中,您可能还想在之前将其规范化为NFC。

+0

谢谢!我会尝试并接受答案。如果您发现在编程语言编译器中使用这种编码有任何缺点,您可否请另外告诉我? (我正在讨论在编译器中使用utf8编码和utf32编码)。 – 2013-04-07 14:48:54

+0

@ danilo2:我没有看到使用UTF-8的缺点。 UTF-32只允许您对各个代码点进行恒定随机访问,但这种情况很少需要。 – Philipp 2013-04-07 20:14:13

0

ICU项目中有isaplha。我想你可以使用它。

相关问题