如何检测C ++标识符字符串?

时间:2010-08-27 22:11:10

标签: c# .net c++

E.g:

isValidCppIdentifier("_foo") // returns true
isValidCppIdentifier("9bar") // returns false
isValidCppIdentifier("var'") // returns false

我写了一些快速代码,但它失败了: 我的正则表达式是"[a-zA-Z_$][a-zA-Z0-9_$]*" 我只是做regex.IsMatch(inputString)

谢谢..

2 个答案:

答案 0 :(得分:1)

它应该可以使用一些额外的锚定:

"^[a-zA-Z_][a-zA-Z0-9_]*$"

如果您确实需要使用Unicode支持荒谬的标识符,请随意阅读标准的各种版本之一并将所有范围添加到正则表达式中(例如,http://www-d0.fnal.gov/~dladams/cxx_standard.pdf的页面713和714)< / p>

答案 1 :(得分:1)

Matti的答案将在插入到C ++代码之前清理标识符,但不会很好地处理C ++代码作为输入。分开L"wchar_t string"之类的内容会很烦人,其中L不是标识符。还有Unicode。

Clang,Apple的编译器基于模块化哲学,提供了set of tokenizer functions。看起来您需要clang_createTranslationUnitFromSourceFileclang_tokenize

我没有检查它是否处理\Uxxxx或其他任何东西。不能做任何一种保证。上次我使用LLVM是在五年前,这不是最好的经历......但也不是最差的。

另一方面,GCC certainly has it,虽然您必须弄清楚如何使用cpp_lex_direct