簡體   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