繁体   English   中英

标识符中的有效字符是什么?

[英]What is a valid character in an identifier called?

标识符通常由下划线、数字组成; 以及第一个字符不是数字的大写和小写字符。 在编写词法分析器时,通常会使用诸如is_digitis_alnum类的辅助函数。 如果要实现这样一个功能来扫描标识符中使用的字符,它会被称为什么? 显然, is_identifier是错误的,因为这将是词法分析器扫描的整个标记,而不是单个字符。 我想is_alnum_or_underscore会是准确的,虽然很冗长。 对于这种常见的事情,我觉得应该有一个词来形容它。

Unicode Annex 31( Unicode Identifier and Pattern SyntaxUAX31 )定义了一个定义标识符词汇语法的框架,这可能与我们将要达到的标准术语一样接近。 UAX31 被 Python 和 Rust 使用(通过引用),并且已被批准用于 C++23。 所以我想它是相当主流的。

UAX31 定义了三组标识符字符,称为StartContinueMedial 所有开始字符也是继续字符; 没有中间字符是继续字符。

这导致了简单的正则表达式( UAX31-D1 Default Identifier Syntax ):

<Identifier> := <Start> <Continue>* (<Medial> <Continue>+)*

声称符合 UAX31 的编程语言不需要接受每个集合的确切成员资格,但它必须明确说明所谓的“配置文件”中的偏差。 (还有其他7个要求,与本题无关,想掉下很深的兔子洞请看文档。)

这可以进一步简化,因为 UAX31 和(据我所知)任何主要语言的配置文件都没有在Medial中放置任何字符。 因此,您可以顺其自然,只定义两个类别: identifier-startidentifier-continue ,其中第一个是第二个的子集。

您会在许多语法文档中看到这一点:

Python
 identifier ::= xid_start xid_continue*
IDENTIFIER_OR_KEYWORD : XID_Start XID_Continue* | _ XID_Continue+
C++
 identifier: identifier-start identifier identifier-continue
所以这就是我的建议。 但是还有很多其他的可能性:
迅速
调用集合标识符头标识符字符
爪哇
称它们为JavaLetterJavaLetterOrDigit
C
定义identifier-nondigitidentifier-digit 继续将是两个集合的并集。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM