5 Lexical conventions [lex]

5.4 Preprocessing tokens [lex.pptoken]

preprocessing-token:
	header-name
	identifier
	pp-number
	character-literal
	user-defined-character-literal
	string-literal
	user-defined-string-literal
	preprocessing-op-or-punc
	each non-white-space character that cannot be one of the above

Каждый токен предварительной обработки, преобразованный в a, token должен иметь лексическую форму ключевого слова, идентификатора, литерала, оператора или пунктуатора.

Токен предварительной обработки - это минимальный лексический элемент языка на этапах преобразования с 3 по 6. Категории токена предварительной обработки: имена заголовков, идентификаторы, числа предварительной обработки, символьные литералы (включая определяемые пользователем символьные литералы), строковые литералы (включая пользовательские литералы). определенные строковые литералы), операторы предварительной обработки и знаки препинания, а также отдельные символы без пробелов, которые лексически не соответствуют другим категориям токенов предварительной обработки. Если символ ' или " соответствует последней категории, поведение не определено. Токены предварительной обработки могут быть разделены пробелом; он состоит из commentsсимволов или пробелов (пробел, горизонтальная табуляция, новая строка, вертикальная табуляция и перевод страницы), или и того, и другого. Как описано в пункте [cpp], в определенных обстоятельствах во время фазы трансляции 4 пробелы (или их отсутствие) служат чем-то большим, чем разделение токенов предварительной обработки. Пробел может появляться в токене предварительной обработки только как часть имени заголовка или между кавычками в символьном литерале или строковом литерале.

Если входной поток был проанализирован на токены предварительной обработки до заданного символа:

  • Если следующий символ начинает последовательность символов, которая может быть префиксом и начальной двойной кавычкой необработанного строкового литерала, например R", следующий токен предварительной обработки должен быть необработанным строковым литералом. Между начальным и конечным символами двойных кавычек необработанной строки любые преобразования, выполненные на этапах 1 и 2 ( universal-character-names и сращивание строк), отменяются; это обращение применяется до того d-char, как r-charбудут идентифицированы какие- либо ограничивающие скобки, или. Необработанный строковый литерал определяется как кратчайшая последовательность символов, соответствующая шаблону необработанной строки.

    encoding-prefixopt R raw-string
    
  • В противном случае, если следующие три символа <​::​ и последующий символ не является ни : ни >, то < рассматривается как предварительная обработкой маркера самого по себе , а не в качестве первого символа альтернативных маркеров <:.

  • В противном случае следующий токен предварительной обработки - это самая длинная последовательность символов, которая может составлять токен предварительной обработки, даже если это приведет к сбою дальнейшего лексического анализа, за исключением того, что a header-nameформируется только внутри a #include directive.

[Example:

#define R "x"
const char* s = R"y";           // ill-formed raw string, not "x" "y"

end example]

[ Example: Фрагмент программы 0xe+foo анализируются как предварительная обработкой числа лексем (тот , который не является допустимым с плавающим или целым числом буквальных маркеров), даже несмотря на то синтаксическим анализ в виде три Препроцессирования маркеров 0xe, +и foo может произвести корректное выражение (например, если foo были определены макро как 1). Точно так же фрагмент программы 1E1 анализируется как номер предварительной обработки (тот, который является допустимым плавающим литеральным токеном), независимо от того, E является ли это именем макроса. ] end example

[ Example: Фрагмент программы x+++++y анализируется как x ++ ++ + y, который, если x и y имеет целочисленные типы, нарушает ограничение на операторы приращения, даже если синтаксический анализ x ++ + ++ y может дать правильное выражение. ] end example