Керниган и Ритчи - Язык программирования Си (793773), страница 45
Текст из файла (страница 45)
Если не считать отклонений в названиях нескольких продуктов и отсутствия формальныхопределений лексем и препроцессора, грамматика языка здесь и грамматика в стандарте эквивалентны.Далее примечания (как и это) набираются с отступом от левого края страницы. В основном этипримечания касаются отличий стандарта от версии языка, описанной в первом издании этой книги, иот последующих нововведений в различных компиляторах.А 2. Соглашения о лексикеПрограмма состоит из одной или нескольких единиц трансляции, хранящихся в виде файлов.
Каждая такаяединица проходит несколько фаз трансляции, описанных в А12. Начальные фазы осуществляют лексическиепреобразования нижнего уровня, выполняют директивы, заданные в программе строками, начинающимисясо знака #, обрабатывают макроопределения и производят макрорасширения. По завершении работыпрепроцессора (А12) программа представляется в виде последовательности лексем.А 2.1. Лексемы (tokens)Существуют шесть классов лексем (или токенов): идентификаторы, ключевые слова, константы, строковыелитералы, операторы и прочие разделители.
Пробелы, горизонтальные и вертикальные табуляции, новыестроки, переводы страницы и комментарии (имеющие общее название символы-разделители)рассматриваются компилятором только как разделители лексем и в остальном на результат трансляциивлияния не оказывают. Любой из символов-разделителей годится, чтобы отделить друг от друга соседниеидентификаторы, ключевые слова и константы.Если входной поток уже до некоторого символа разбит на лексемы, то следующей лексемой будет самаядлинная строка, которая может быть лексемой.А 2.2. КомментарийСимволы /* открывают комментарий, а символы */ закрывают его.
Комментарии нельзя вкладывать друг вдруга, их нельзя помещать внутрь строк или текстовых литералов.А 2.3. ИдентификаторыИдентификатор — это последовательность букв и цифр. Первым символом должна быть буква; знакподчеркивания _ считается буквой. Буквы нижнего и верхнего регистров различаются. Идентификаторы могутиметь любую длину; для внутренних идентификаторов значимыми являются первые 31 символ; в некоторыхреализациях принято большее число значимых символов. К внутренним идентификаторам относятся именамакросов и все другие имена, не имеющие внешних связей (А11.2). На идентификаторы с внешними связямимогут накладываться большие ограничения: иногда воспринимаются не более шести первых символов имогут не различаться буквы верхнего и нижнего регистров.А 2.4.
Ключевые словаСледующие идентификаторы зарезервированы в качестве ключевых слов и в другом смысле использоватьсяне могут:autodoubleintstructbreakelselongswitchcaseenumregistertypedefcharexternreturnunionconstfloatshortunsignedcontinueforsignedvoiddefaultgotosizeofvolatiledoifstaticwhileВ некоторых реализациях резервируются также слова fortran и asm.Ключевые слова const, signed и volatile впервые появились в стандарте ANSI; enum и void —новые по отношению к первому изданию книги, но уже использовались; ранее зарезервированноеentry нигде не использовалось и поэтому более не резервируется.А 2.5.
КонстантыСуществует несколько видов констант. Каждая имеет свой тип данных; базовые типы рассматриваются в А4.2.константа:целая-канстантасимвольная-константаконстанта-с-плавающей-точкойконстанта-перечислениеА 2.5.1. Целые константыЦелая константа, состоящая из последовательности цифр, воспринимается как восьмеричная, если онаначинается с 0 (цифры нуль), и как десятичная в противном случае. Восьмеричная константа не содержитцифр 8 и 9. Последовательность цифр, перед которой стоят 0х или 0Х, рассматривается какшестнадцатеричное целое. В шестнадцатеричные цифры включены буквы от а (или А) до f (или F) созначениями от 10 до 15.Целая константа может быть записана с буквой-суффиксом u (или U) для спецификации ее как беззнаковойконстанты.
Она также может быть с буквой-суффиксом l (или L) для указания, что она имеет тип long.Тип целой константы зависит от ее вида, значения и суффикса (о типах см. А4). Если константа — десятичная ине имеет суффикса, то она принимает первый из следующих типов, который годится для представления еезначения: int, long int, unsigned long int. Восьмеричная или шестнадцатеричная константа безсуффикса принимает первый возможный из типов: int, unsigned int, long int, unsigned longint. Если константа имеет суффикс u или U, то она принимает первый возможный из типов: unsigned int,unsigned long int.
Если константа имеет суффикс l или L,то она принимает первый возможный изтипов: long int, unsigned long int. Если константа имеет суффикс ul или UL, то она принимает типunsigned long int.Типы целых констант получили существенное развитие в сравнении с первой редакцией языка, вкоторой большие целые имели просто тип long. Суффиксы U и u введены впервые.А 2.5.2. Символьные константыСимвольная константа — это последовательность из одной или нескольких символов, заключенная водиночные кавычки (например 'х').
Если внутри одиночных кавычек расположен один символ, значениемконстанты является числовое значение этого символа в кодировке, принятой на данной машине. Значениеконстанты с несколькими символами зависит от реализации.Символьная константа не может содержать в себе одиночную кавычку ' или символ новой строки; чтобыизобразить их и некоторые другие символы, могут быть использованы эскейп-последовательности:новая строка (newline, linefeed)NL (LF)\nгоризонтальная табуляция (horisontal tab)HT\tвертикальная табуляция (vertical tab)VT\vвозврат на шаг (backspace)BS\bвозврат каретки (carriage return)CR\rперевод страницы (formfeed)FF\fсигнал звонок (audible alert, bell)BEL\aобратная наклонная черта (backslash)\\\знак вопроса (question mark)?\?одиночная кавычка (single quote)\'двойная кавычка (double quote)\"восьмеричный код (octal number)ooo\oooшестнадцатеричный код (hex number)hh\xhhЭскейп-последовательность \ооо состоит из обратной наклонной черты, за которой следуют одна, две илитри восьмеричные цифры, специфицирующие значение желаемого символа.
Наиболее частым примеромтакой конструкции является \0 (за которой не следует цифра); она специфицирует NULL-символ. Эскейппоследовательность \xhh состоит из обратной наклонной черты с буквой х, за которыми следуютшестнадцатеричные цифры, специфицирующие значение желаемого символа. На количество цифр нетограничений, но результат будет не определен, если значение полученного символа превысит значениесамого "большого" из допустимых символов. Если в данной реализации тип char трактуется как число сознаком, то значение и в восьмеричной, и в шестнадцатеричнои эскейп-последовательности получается спомощью "распространения знака", как если бы выполнялась операция приведения к типу char. Если за \ неследует ни один из перечисленных выше символов, результат не определен.В некоторых реализациях имеется расширенный набор символов, который не может быть охвачен типомchar.
Константа для такого набора пишется с буквой L впереди (например, L'х') и называется расширеннойсимвольной константой. Такая константа имеет тип wchar_t (целочисленный тип, определенный встандартном заголовочном файле <stddef.h>). Как и в случае обычных символьных констант, здесь такжевозможны восьмеричные и шестнадцатеричные эскейп-последовательности; если специфицированноезначение превысит тип wchar_t, результат будет не определен.Некоторые из приведенных эскейп-последовательностей новые (шестнадцатеричные в частности).Новым является и расширенный тип для символов.
Наборам символов, обычно используемым вАмерике и Западной Европе, подходит тип char, а тип wchar_t был добавлен главным образом дляазиатских языков.А 2.5.3. Константы с плавающей точкойКонстанта с плавающей точкой состоит из целой части, десятичной точки, дробной части, е или Е и целого(возможно, со знаком), представляющего порядок, и, возможно, суффикса типа, задаваемого одной из букв:f, F, l или L. И целая, и дробная часть представляют собой последовательность цифр. Либо целая часть, либодробная часть (но не обе вместе) могут отсутствовать; также могут отсутствовать десятичная точка или Е спорядком (но не обе одновременно). Тип определяется суффиксом; F или f определяют тип float, L или l— тип long double; при отсутствии суффикса подразумевается тип double.Суффиксы для констант с плавающей точкой являются нововведением.А 2.5.4.
Константы-перечисленияИдентификаторы, объявленные как элементы перечисления (А8.4), являются константами типа int.А 2.6. Строковые литералыСтроковый литерал, который также называют строковой константой, — это последовательность символов,заключенная в двойные кавычки (например, "..."). Строка имеет тип "массив символов" и память классаstatic (А4), которая инициализируется заданными символами. Представляются ли одинаковые строковыелитералы одной копией или несколькими, зависит от реализации. Поведение программы, пытающейсяизменить строковый литерал, не определено.Написанные рядом строковые литералы объединяются (конкатенируются) в одну строку. После любойконкатенации к строке добавляется NULL-байт (\0), что позволяет программе, просматривающей строку,найти ее конец. Строковые литералы не могут содержать в себе символ новой строки или двойную кавычку; вних нужно использовать те же эскейп-последовательности, что и в символьных константах.Как и в случае с символьными константами, строковый литерал с символами из расширенного набора долженначинаться с буквы L (например L"...").
Строковый литерал из расширенного набора имеет тип "массив изwchar_t". Конкатенация друг с другом обычных и "расширенных" строковых литералов не определена.То, что строковые литералы не обязательно представляются разными копиями, запрет на ихмодификацию, а также конкатенация соседних строковых литералов — нововведения ANSI-стандарта."Расширенные" строковые литералы также объявлены впервые.A 3. Нотация синтаксисаВ нотации синтаксиса, используемой в этом руководстве, синтаксические понятия набираются курсивом, аслова и символы, воспринимаемые буквально, обычным шрифтом. Альтернативные конструкции обычноперечисляются в столбик (каждая альтернатива на отдельной строке); в редких случаях длинные спискинебольших по размеру альтернатив располагаются в одной строке, помеченной словами "один из".Необязательное слово-термин или не термин снабжается индексом "необ.".















