![](/img/trans.png)
[英]MATLAB - The input character is not valid in MATLAB statements or expressions
[英]What is a valid character in an identifier called?
標識符通常由下划線、數字組成; 以及第一個字符不是數字的大寫和小寫字符。 在編寫詞法分析器時,通常會使用諸如is_digit
或is_alnum
類的輔助函數。 如果要實現這樣一個功能來掃描標識符中使用的字符,它會被稱為什么? 顯然, is_identifier
是錯誤的,因為這將是詞法分析器掃描的整個標記,而不是單個字符。 我想is_alnum_or_underscore
會是准確的,雖然很冗長。 對於這種常見的事情,我覺得應該有一個詞來形容它。
Unicode Annex 31( Unicode Identifier and Pattern Syntax , UAX31 )定義了一個定義標識符詞匯語法的框架,這可能與我們將要達到的標准術語一樣接近。 UAX31 被 Python 和 Rust 使用(通過引用),並且已被批准用於 C++23。 所以我想它是相當主流的。
UAX31 定義了三組標識符字符,稱為Start 、 Continue和Medial 。 所有開始字符也是繼續字符; 沒有中間字符是繼續字符。
這導致了簡單的正則表達式( UAX31-D1 Default Identifier Syntax ):
<Identifier> := <Start> <Continue>* (<Medial> <Continue>+)*
聲稱符合 UAX31 的編程語言不需要接受每個集合的確切成員資格,但它必須明確說明所謂的“配置文件”中的偏差。 (還有其他7個要求,與本題無關,想掉下很深的兔子洞請看文檔。)
這可以進一步簡化,因為 UAX31 和(據我所知)任何主要語言的配置文件都沒有在Medial中放置任何字符。 因此,您可以順其自然,只定義兩個類別: identifier-start和identifier-continue ,其中第一個是第二個的子集。
您會在許多語法文檔中看到這一點:
所以這就是我的建議。 但是還有很多其他的可能性:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.