5 Lexical conventions [lex]

5.2 Phases of translation [lex.phases]

Приоритет синтаксических правил перевода определяется следующими этапами.12

  1. 1.Физические символы исходного файла сопоставляются, определяемым реализацией способом, с базовым набором исходных символов (вводя символы новой строки для индикаторов конца строки), если это необходимо. Допустимый набор символов физического исходного файла определяется реализацией. Любой символ исходного файла, не входящий в число basic source character set , заменяется символом, обозначающим этот символ. Реализация может использовать любую внутреннюю кодировку при условии, что фактический расширенный символ, встречающийся в исходном файле, и тот же расширенный символ, выраженный в исходном файле как (например, с использованием обозначения), обрабатываются эквивалентно, за исключением случаев, когда эта замена отменяется. ( ) в необработанном строковом литерале.universal-character-nameuniversal-character-name \uXXXX [lex.pptoken]

  2. 2.Каждый экземпляр символа обратной косой черты (\), за которым сразу следует символ новой строки, удаляется, сращивая физические исходные строки для формирования логических исходных строк. Только последняя обратная косая черта на любой физической исходной строке должна иметь право быть частью такого соединения. За исключением соединений, возвращенных в необработанный строковый литерал, если в результате соединения получается последовательность символов, соответствующая синтаксису a universal-character-name, поведение не определено. Исходный файл, который не является пустым и который не заканчивается символом новой строки или который заканчивается символом новой строки, которому непосредственно предшествует символ обратной косой черты до того, как произойдет какое-либо такое объединение, должен обрабатываться, как если бы дополнительный новый- строчный символ был добавлен к файлу.

  3. 3.Исходный файл разбивается на preprocessing tokens последовательности символов пробела (включая комментарии). Исходный файл не должен заканчиваться токеном частичной предварительной обработки или частичным комментарием.13 Каждый комментарий заменяется одним пробелом. Символы новой строки сохраняются. Сохраняется ли каждая непустая последовательность символов пробела, отличная от новой строки, или заменяется одним символом пробела, не определено. Процесс разделения символов исходного файла на токены предварительной обработки зависит от контекста. [ Example: см. обработку < в #include директиве предварительной обработки. ]end example

  4. 4.Выполняются директивы предварительной обработки, расширяются вызовы макросов и выполняются _­Pragma унарные операторные выражения. Если последовательность символов, соответствующая синтаксису a universal-character-name, создается с помощью token concatenation, поведение не определено. #include Предобработки директива вызывает указанный файл заголовок или источник для обработки от фазы 1 до фазы 4, рекурсивен. Затем все директивы предварительной обработки удаляются.

  5. 5.Каждый член исходного набора символов в символьном литерале или строковом литерале, а также каждая escape-последовательность и universal-character-nameв символьном литерале или необработанном строковом литерале преобразуется в соответствующий член набора символов выполнения ([lex.ccon], [lex.string]); если нет соответствующего члена, он преобразуется в определяемый реализацией член, отличный от нулевого (широкого) символа.14

  6. 6.Смежные лексемы строковых литералов объединяются.

  7. 7.Символы пробела, разделяющие токены, больше не имеют значения. Каждый токен предварительной обработки преобразуется в token. Полученные токены синтаксически и семантически анализируются и переводятся как единица перевода. [ Note: Процесс анализа и перевода токенов может иногда приводить к замене одного токена последовательностью других токенов ([temp.names]). ] [ Исходные файлы, единицы перевода и переведенные единицы перевода не обязательно должны храниться в виде файлов, и нет необходимости иметь какое-либо однозначное соответствие между этими объектами и любым внешним представлением. Описание носит только концептуальный характер и не указывает конкретную реализацию. ]end noteNote: end note

  8. 8.Переведенные единицы перевода и единицы создания экземпляров объединяются следующим образом: [ Note: Некоторые или все из них могут быть предоставлены из библиотеки. ] Каждая переведенная единица перевода проверяется, чтобы составить список требуемых экземпляров. [ Это может включать экземпляры, которые были . ] Определения необходимых шаблонов находятся. Это определяется реализация, требуется ли источник перевода единиц , содержащих эти определения должны быть доступны. [ Реализация могла бы закодировать достаточную информацию в переведенной единице перевода, чтобы гарантировать, что источник здесь не требуется. ] Все необходимые экземпляры выполняются для создания . [ Они похожи на переведенные единицы перевода, но не содержат ссылок на неустановленные шаблоны и не содержат определений шаблонов. ] Программа плохо сформирована, если какой-либо экземпляр не удается. end noteNote: explicitly requested end noteNote: end noteinstantiation unitsNote: end note

  9. 9.Все ссылки на внешние сущности разрешены. Компоненты библиотеки связаны для соответствия внешним ссылкам на объекты, не определенные в текущем переводе. Весь такой вывод транслятора собирается в образ программы, который содержит информацию, необходимую для выполнения в среде выполнения.

Реализации должны вести себя так, как если бы происходили эти отдельные фазы, хотя на практике разные фазы могут быть объединены.

Токен частичной предварительной обработки может возникнуть из исходного файла, заканчивающегося первой частью многосимвольного токена, для которого требуется завершающая последовательность символов, например a, в header-name котором отсутствует закрывающее " или >. Частичный комментарий может возникнуть из исходного файла, заканчивающегося незакрытым /* комментарием.

Реализации не требуется преобразовывать все несоответствующие исходные символы в один и тот же символ выполнения.