식별자
식별자 (Identifiers)
식별자는 Rust에서 이름을 붙일 때 사용하는 핵심 토큰이에요. 그 문법과 규칙을 정리해 볼게요.
출처: Rust Reference
본문
식별자의 어휘 문법은 다음과 같아요.
IDENTIFIER_OR_KEYWORD → ( XID_Start | _ ) XID_Continue *
XID_Start → < XID_Start defined by Unicode>
XID_Continue → < XID_Continue defined by Unicode>
RAW_IDENTIFIER → r# IDENTIFIER_OR_KEYWORD
NON_KEYWORD_IDENTIFIER → IDENTIFIER_OR_KEYWORD except a strict or reserved keyword
IDENTIFIER → NON_KEYWORD_IDENTIFIER | RAW_IDENTIFIER
RESERVED_RAW_IDENTIFIER → r# ( _ | crate | self | Self | super ) ! XID_Continue
식별자는 Unicide 버전 17.0에 대한 Unicode 표준 부속서(Unicode Standard Annex) #31의 사양을 따르되, 아래에 설명할 추가 사항이 있어요. 식별자의 몇 가지 예시를 볼게요.
foo_identifierr#trueМосква東京
UAX #31에서 사용하는 프로파일(profile)은 다음과 같아요.
- Start :=
XID_Start에 밑줄 문자(U+005F)를 더한 것 - Continue :=
XID_Continue - Medial := 비어 있음
참고 밑줄로 시작하는 식별자는 보통 의도적으로 사용하지 않는 식별자를 나타낼 때 쓰며, rustc에서 unused 경고를 무시하게 해줘요.
식별자는 아래에서 설명할 raw 식별자의 r# 접두사 없이는 strict 또는 reserved 키워드가 될 수 없어요.
제로 폭 논조이너(ZWNJ, U+200C) 와 제로 폭 조이너(ZWJ, U+200D) 문자는 식별자에 허용되지 않아요.
식별자는 다음 상황에서는 XID_Start와 XID_Continue의 ASCII 부분집합으로 제한돼요.
extern crate선언(AsClause식별자 제외)- 경로(path)에서 참조되는 외부 크레이트 이름
path속성 없이 파일시스템에서 로드되는 모듈 이름no_mangle속성이 붙은 항목- 외부 블록(extern block) 안의 항목 이름
정규화 (Normalization)
식별자는 Unicode 표준 부속서 #15에 정의된 대로 정규화 형식 C(NFC) 로 정규화돼요. 두 식별자는 NFC 형식이 같으면 같은 것으로 간주돼요.
절차 매크로와 선언 매크로는 입력으로 정규화된 식별자를 받아요.
Raw 식별자 (Raw identifiers)
raw 식별자는 일반 식별자와 비슷하지만 r#이 접두사로 붙어요. (참고로 r# 접두사는 실제 식별자의 일부로 포함되지 않아요.)
일반 식별자와 달리 raw 식별자는 위에서 RAW_IDENTIFIER에 대해 나열한 것들을 제외한 어떤 strict 또는 reserved 키워드든 될 수 있어요.
RESERVED_RAW_IDENTIFIER 토큰을 사용하는 것은 오류예요.