識別符號通常由下劃線、數字組成;以及第一個字符不是數字的大寫和小寫字符。在撰寫詞法分析器時,通常會有輔助函式,例如is_digitor is_alnum。如果要實作這樣一個功能來掃描識別符號中使用的字符,它會被稱為什么?顯然,is_identifier這是錯誤的,因為這將是詞法分析器掃描的整個標記,而不是單個字符。我想is_alnum_or_underscore會是準確的,雖然很冗長。對于這種常見的事情,我覺得應該有一個詞來形容它。
uj5u.com熱心網友回復:
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,其中第一個是第二個的子集。
您會在許多語法檔案中看到這一點:
- Python
identifier ::= xid_start xid_continue*- 銹
IDENTIFIER_OR_KEYWORD : XID_Start XID_Continue* | _ XID_Continue- C
identifier: identifier-start identifier identifier-continue
- 迅速
- 呼叫集合識別符號頭和識別符號字符
- 爪哇
- 稱它們為JavaLetter和JavaLetterOrDigit C
- 定義identifier-nondigit和identifier-digit;繼續將是兩個集合的并集。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/484544.html
