2013-04-07 81 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。我想你可以使用它。

相關問題