# Identifiers

> Lexer:
> IDENTIFIER_OR_KEYWORD :
> [`a`-`z` `A`-`Z`] [`a`-`z` `A`-`Z` `0`-`9` `_`]\*
> | `_` [`a`-`z` `A`-`Z` `0`-`9` `_`]+

> RAW_IDENTIFIER : `r#` IDENTIFIER_OR_KEYWORD Except `crate`, `extern`, `self`, `super`, `Self`

> NON_KEYWORD_IDENTIFIER : IDENTIFIER_OR_KEYWORD Except a strict or reserved keyword

> IDENTIFIER :
> NON_KEYWORD_IDENTIFIER | RAW_IDENTIFIER

An identifier is any nonempty ASCII string of the following form:

Either

- The first character is a letter.
- The remaining characters are alphanumeric or `_`.

Or

- The first character is `_`.
- The identifier is more than one character. `_` alone is not an identifier.
- The remaining characters are alphanumeric or `_`.

A raw identifier is like a normal identifier, but prefixed by `r#`. (Note that the `r#` prefix is not included as part of the actual identifier.) Unlike a normal identifier, a raw identifier may be any strict or reserved keyword except the ones listed above for `RAW_IDENTIFIER`.