Ч А С Т Ь 1. СТАНДАРТ TURBO PASCAL. ГЛАВА 1. ЛЕКСЕМЫ И КОНСТАНТЫ. Л е к с е м а м и называются минимальные значимые единицы текста в программе, написанной на Паскале. Они представлены такими категориями как специальные символы, идентификаторы, метки, числа и строковые константы. Программа, написанная на Паскале, состоит из лексем и разделителей, где разделитель представляет собой пробел или комментарий. Две соседних лексемы, если они представляют собой зарезервированное слово, идентификатор, метку или число, должны быть отделены друг от друга одним или несколькими разделителями. Примечание: Разделители не могут быть частью лексем, за исключением строковых констант. Специальные символы и зарезервированные слова Turbo Pascal использует следующие подмножества набора символов кода ASCII: - Буквы английского алфавита от A до Z и от a до z; - Цифры - арабские от 0 до 9; - Шестнадцатиричные цифры - арабские цифры от 0 до 9, буквы от A до F и от a до f. - Пробелы - символ пробела (ASCII32) и все управляющие символы кода ASCII (ASCII от 0 до 31), включая символ конца строки или символ возврата каретки (ASCII13). Далее следует д и а г р а м м а с и н т а к с и с а для букв, цифр и шестнадцатиричных цифр. Для прочтения этой диаграммы нужно следовать за стрелками. Часто встречаются альтернативные пути; все пути, начинающиеся слева и заканчивающиеся стрелкой справа, допустимы. Путь проходит через рамки, содержащие названия элементов, используемых для создания части синтаксиса. Имена в прямоугольниках должны быть заменены действительными конструкциями. В квадратах заключены названия действительных термов, используемых в программе - зарезервированных слов, операторов и знаков пунктуации. буква ───────┬──────────────┬──────────────┬──────────────┐ │ │ │ │ ∙ ∙ ∙ ∙ ┌───┐ ┌───┐ ┌───┐ ┌───┐ │ A │ ... │ Z │ │ a │ ... │ z │ └─┬─┘ └─┬─┘ └─┬─┘ └─┬─┘ │ │ │ │ └──────────────┴──────────────┴──────────────┴─────Ў цифра ───────┬───────────┐ │ │ ∙ ∙ ┌───┐ ┌───┐ │ 0 │ ... │ 9 │ └─┬─┘ └─┬─┘ │ │ └───────────┴───────Ў шестнадцатиричная цифра ┌───────────┐ ─────────Ў│ цифра │─────────────────────────┐ │ └───────────┘ │ │ │ └───┬─────────┬─────────┬─────────┐ │ │ │ │ │ │ ∙ ∙ ∙ ∙ │ ┌───┐ ┌───┐ ┌───┐ ┌───┐ │ │ A │ .. │ F │ │ a │ ... │ f │ │ └─┬─┘ └─┬─┘ └─┬─┘ └─┬─┘ │ │ │ │ │ │ └─────────┴─────────┴─────────┴─────────┴───Ў Cпециальные символы и зарезервированные слова представляют собой символы, имеющие одно или несколько фиксированных значений. Специальными символами являются следующие символы: + - * / = < > [ ] . , ( ) : ; ^ @ { } $ # Следующие пары символов также представляют собой специальные символы: <= >= := .. (* *) (. .) Некоторые специальные символы являются также операторами. Левая квадратная скобка ([) эквивалентна паре символов, состоящей из левой круглой скобки и точки ( (. ). Аналогично правая квадратная скобка (]) эквивалентна паре символов, состоящей из точки и правой круглой скобки ( .) ). Следующие слова являются зарезервированными в Турбо-Паскале: Таблица 1.1. Зарезервированные слова Turbo Pascal. ─────────────────────────────────────────────────────────────────── and else inline procedure type asm end interface program unit array external interrupt record until begin file label repeat uses case for mod set var const forward nil shl while constructor function not shr with destructor goto object string xor div if of then do implementation or to downto in packed ─────────────────────────────────────────────────────────────────── Для Turbo Pascal безразличен регистр клавиатуры, поэтому Вы можете использовать в своей программе как строчные, так и прописные буквы. В следующей таблице приведены стандартные директивы Turbo Pascal. В отличие от зарезервированных слов, они могут быть переопределены пользователем, хотя это и нежелательно. Таблица 1.2. Стандартные директивы Turbo Pascal. ─────────────────────────────────────────────────────────────────── absolute external forward near assembler far interrupt private virtual ─────────────────────────────────────────────────────────────────── Заметим, что private зарезервировано только внутри объектов. Идентификаторы Идентификаторы выступают в качестве имен констант, типов, переменных, процедур, функций, модулей, программ и полей в записях. Идентификатор может иметь любую длину, однако значимыми являются только первые 63 символа. Идентификатор должен начинаться с буквы или символа подчеркивания и не должен содержать пробелов. После первого символа допускаются буквы, цифры и знак подчеркивания (ASCII $5F). Как и зарезервированные слова, идентификаторы безразличны к регистру клавиатуры. Когда имеется несколько экземпляров одного и того же идентификатора, для указания нужного вам экземпляра необходимо уточнить этот идентификатор с помощью идентификатора модуля, чтобы выбрать указанный экземпляр (модули описываются в главе 3 Руководства пользователя и главе 9 настоящего руководства). Например, для уточнения идентификатора Ident с помощью идентификатора UnitName следует написать UnitName.Ident. Такой комбинированный идентификатор называется уточненным идентификатором. ┌───────────┐ Идентификатор ──┬───Ў│ буква │─────────────────────────┬─Ў │ └───────────┘ ° ° │ │ ┌─────────────┐ │ │ │ └─Ў│ символ ├─┘ │ ┌─────────────┐ │ │подчеркивания│ ├───┤ буква │ў──┤ └─────────────┘ │ └─────────────┘ │ │ │ │ ┌─────────────┐ │ ├───┤ цифра │ў──┤ │ └─────────────┘ │ │ │ │ ┌─────────────┐ │ └───┤ символ │ў──┘ │подчеркивания│ └─────────────┘ ┌───┐ символ подчеркивания─────Ў│ _ │─────Ў └───┘ идентификатор программы ┌─────────────┐ идентификатор модуля ─────Ў│идентификатор│────Ў идентификатор поля └─────────────┘ ┌───────────────┐ уточненный ─┬──────────────────────────┤ идентификатор ├───Ў идентификатор │ ° └───────────────┘ │ ┌───────────┐ ┌───┐ │ └Ў│идентифика-├──Ў│ . ├─┘ │ тор │ └───┘ │ модуля │ └───────────┘ Приведем несколько примеров идентификаторов: Writeln Exit RealString System.MemAvail Dos.Exec Crt.Window Метки Меткой является последовательность цифр в диапазоне от 0 до 9999. Начальные нули не являются значащими. Метки используются с операторами перехода (GoTo). ┌──────────────────────┐ Метка ───────┬────────Ў│ последовательность ├──────────Ў │ │ цифр │ ° │ └──────────────────────┘ │ │ │ │ ┌─────────────┐ │ └───────────Ў│идентификатор├────────────┘ └─────────────┘ Как расширение стандартного Паскаля, Turbo Pascal позволяет использовать идентификаторы функции в качестве меток. Числа Для чисел, представляющих собой константы целого и вещественного типа, используется обычная десятичная запись. Целая константа в шестнадцатиричном формате имеет в качестве префикса знак доллара ($). Техническое обозначение (Е или е с экспонентой) в вещественных типах читается как "десять в степени". Например: 7е-2 "7 умноженное на 10 в степени -2"; 12.25е+6 12.25е+6 "12.25 умноженное на 10 в степени +6; Ниже приведены синтаксические диаграммы для записи чисел. ┌─────────────────┐ последовательность ────────Ў│шестнадцатиричная├───────┬──Ў шестнадцатиричных ° │ цифра │ │ цифр │ └─────────────────┘ │ └───────────────────────────────┘ ┌─────────────────┐ последовательность ────────Ў│ ├───────┬───Ў цифр ° │ цифра │ │ │ └─────────────────┘ │ └───────────────────────────────┘ ┌──────────────────┐ целые без знака ────┬────Ў│последовательность├───────────Ў │ │ цифр │ ° │ └──────────────────┘ │ │ │ │ ┌───┐ ┌──────────────┴───┐ └────Ў│ $ │────Ў│последовательность│ └───┘ │шестнадцатиричных │ │ цифр │ └──────────────────┘ ┌───┐ знак ─┬───Ў│ + ├───────Ў │ └───┘ ° │ ┌───┐ │ └───Ў│ - ├───┘ └───┘ вещественное без знака │ ┌──────────┐ ┌───┐ ┌──────────┐ └──Ў│Последова-├─┬─Ў│ . ├─Ў│последова-├──┬──────────────────Ў │тельность │ │ └───┘ │тельность │ │ ° │ цифр │ │ │ цифр │ │ │ └──────────┘ │ └──────────┘ │ │ │ ∙ ┌──────────┐ │ └─────────────────────────Ў│масштабный├─┘ │ множитель│ └──────────┘ масштабный множитель │ ┌───┐ ┌──────────────┐ └───────┬─Ў│ Е ├─────┬───────────────Ў│последователь-├──Ў │ └───┘ ° │ ° │ность цифр │ │ ┌───┐ │ │ ┌────┐ │ └──────────────┘ └─Ў│ е ├─┘ └─Ў│знак├──┘ └───┘ └────┘ число без знака │ ┌───────────────┐ └───────────┬─Ў│целое без знака├────────Ў │ └───────────────┘ ° │ ┌────────────┐ │ └─Ў│вещественное├───────┘ │без знака │ └────────────┘ число со знаком │ ┌───────────────┐ └────────┬────────────────Ў│число без знака├────Ў │ ° └───────────────┘ │ ┌────┐ │ └─Ў│знак├─────┘ └────┘ Числа с десятичными точками или экспонентами представляют собой константы вещественного типа, остальные константы представляют собой константы целочисленного типа; они должны находиться в диапазоне от -2147483648 до 2147483647. Шестнадцатиричные числа обозначают константы целочисленного типа; они должны находиться в диапазоне от $00000000 до $FFFFFFFF. Результирующий знак значения определяется шестнадцатиричной записью. Строки символов Строка символов представляет собой последовательность, содержащую нуль и более символов из расширенного набора символов кода ASCII (приложение В), записанную в одной строке программы и заключенную в одиночные кавычки (апострофы).Строка символов, ничего не содержащая между апострофами, называется пустой строкой. Два последовательных апострофа в строке символов обозначают один символ - апостроф. Атрибут длины строки символов содержит действительное количество символов между апострафами. В качестве расширения стандартного Паскаля Turbo Pascal разрешает вставлять в строку символов управляющие символы. Символ # с целой константой без знака в диапазоне от 0 до 255 обозначает соответствующий этому значению символ в коде ASCII. Между символом # и целой константой не должно быть никаких разделителей. Аналогично, если несколько управляющих символов входят в строку символов, то между ними не должно быть разделителей. ┌───┐ ┌───┐ строка ──────Ў│ ' ├──────────────┬────Ў│ ' ├────Ў символов └───┘ ° ┌──────┐ │ └───┘ └──┤символ│ў─┘ │строки│ └──────┘ ┌──────────────────────┐ │ │ символ строки ───┬──Ў│любой символ, кроме ' ├──────Ў │ │ или CR │ ° │ └──────────────────────┘ │ │ ┌───┐ ┌───┐ │ └───────Ў│ ' ├──────Ў│ ' ├─────┘ └───┘ └───┘ Примечание: CR - символ возврата каретки. Строка символов нулевой длины (пустая строка) совметима только для строковым типом. Строка символов с длиной, равной 1, совместима с любым символьным и строковым типом. Строка символов с длиной N, где N больше или равно 2, совместима с любым строковым типом и с упакованным массивом из N символов. Приведем несколько примеров строк символов: 'TURBO' 'You''ll see' '''' ';' ' ' #13#10 'Line 1'#13'Line 2' #7#7'Wake up!'#7#7 Объявление констант Объявление констант содержит идентификатор, который является обозначением константы внутри блока, содержащего объявление. Идентификатор константы не может быть включен в свое собственное объявление. объявление константы │ ┌─────────────┐ ┌───┐ ┌─────────┐ ┌───┐ └─────Ў│идентификатор├───Ў│ = ├──Ў│константа├───Ў│ ; ├─┬─Ў ° └─────────────┘ └───┘ └─────────┘ └───┘ │ └────────────────────────────────────────────────────┘ ┌─────────┐ константа ────Ў│выражение├───Ў └─────────┘ В качестве расширения стандартного Паскаля Turbo Pascal разрешает использовать константные выражения. Константное выражение - это выражение, которое может быть вычислено компилятором фактически без выполнения программы. Приведем примеры константных выражений: 100 'А' 256 -1 (2.5 + 1)/(2.5 - 1) 'Turbo' + ' ' + 'Pascal' Chr(32) Ord('Z') - Ord('A') + 1 Простейшим случаем константного выражения является простая константа, такая как 100 или 'А'; в то время как стандартный Паскаль допускает только простую константу, Turbo Pascal допускает константные выражения. Так как компилятор вычисляет константное выражение за время компиляции, то в константных выражениях не разрешены следующие конструкции: - ссылки на переменные и типированные константы (за исключением константных адресных выражений, как описано в главе 5). - вызовы функций (кроме перечисленных ниже) - адресный оператор (@) (за исключением константных адресных выоражений, как тписано в главе 5) За исключением этих ограничений, константные выражения подчиняются точно таким же синтаксическим правилам, что и обычные выражения (описанные в главе 6 "Выражения"). В константных выражениях разрешаются стандартные функции: Abs Chr Нi Length Lo Odd Ord Pred Ptr Round SizeOf Succ Swap Trunc Приведем несколько примеров использования константных выражений в объявлении констант: const Min = 0; Max = 100; Center = (Max - Min) div 2; Beta = Chr(225); NumChars = Ord('Z') - Ord('A') + 1; Message = 'Out of memory'; ErrStr = 'Error:' + message + '.'; ErrPos = 80 - Lenth(ErrorStr) div 2; ErrAttr = Blink + Red * 16 + White; Ln10 = 2.302585092994045684; Ln10R = 1/Ln10; Numeric = ['0' .. '9']; Alpha = ['A' .. 'Z', 'a' .. 'z'] AlphaNum = Alpha + Numeric; Комментарии Следующие конструкции представляют собой комментарии и игнорируются компилятором: {Any text not containing right brace} (* Any text not containing star/right parenthesis*) Коментарий, содержащий знак доллара ($) сразу после открывающейся скобки { или (* - является директивой компилятора. За символом $ следует мнемоника команды компилятора. Общее описание директив компилятора дано в главе 21. Строки программы В Turbo Pascal строки программы имеют максимальную длину в 126 символов.