# 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, 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.