Т. Пратт, М. Зелковиц - Языки программирования - разработка и реализация (4-е издание_ 2002) (1160801), страница 176
Текст из файла (страница 176)
Единственными допустимыми операциями для символьных строк являются операции отношения (=, <, > и т. и.), применяемые к строкам одинаковой длины. Результат определяется в соответствии с упорядочением символов в перечислении, реализующем тип с!таг (см, обсуждение ранее символьного типа данных), Допускается присваивапие значения переменной, представляющей символьную строку, но это значение должно быть символьной строкой той же длины. Символьные строки могут быть выведены в текстовые файлы, но читаются они посимвольно в обычную переменную или массив типа с!тат.
Записи. Базовый тип данных запись достаточно подробно описан в разделе 6.1.6. Множества. Рааса! предоставляет ограниченную форму типа данных ннонест во. Объект данных этого типа состоит из множества компонентов, каждый их которых принадлежит некоторому базовому типу данных, который ограничен перечислением и поддиапазоном целых чисел, содержащим количество значений, ограниченное некоторым максиллальным числом.
Это число обычно определяется при реализации языка и соответствует количеству бит в одном или нескольких словах памяти компьютера, для которого предназначена данная реализация. Тогда множество может быть реализовано в виде последовательности булевых значений (единичных битов), в которой каждый бит соответствует определенному элементу базового множества. Если бит равен ] (истина), то этот элемент входит в множество, в противном случае элемент в множество не входит.
Синтаксис для объявления объекта данных типа ннонество следующий; ннв типа = вев от базовый тип 640 Приложение, Обзоры языков (базовый тип был описан ранее). Затем переменная типа иножество может принимать значения, соответствующие любому подмножеству значений базового типа, включая пустое множество (записывается как [)). Литеральная константа, представляющая множество, может быть записана и следующем виде: [иа1ое...на1ое) где на1це — либо единичное значение, либо подмножество значений из базового множества. Для множеств предусмотрены следующие операции: объединение (синтаксически обозначается как н), пересечение (обозначается через *) и разность (-).
Также для множеств определены операции отношения =, <>, <- и >=, причем две последние обозначают проверку вхождения одного множества в другое (например, запись Я <= В означает: является ли Я полмножеством В?). Чтобы проверить, является ли конкретное значение элементом множества, используется операция )п. Например, 5орп ~п 5 означает: входит ли значение 5орй в множество, являющееся текущим значением переменной 5? Файлы и ввод-вывод. Последовательные файлы — это единственная файловая структура, предусмотренная в Равсай Для объявления файла используется синтаксис 111е от тип конпонентов где тип коипонетов может быль любым типом, за исключением файлов и указателей.
Таким образом, помимо объектов ванных элементарных типов компонентами файла могут быть массивы, записи и другие объекты данных структурированных типов. Первая строка программы должна иметь слелуюший синтаксис ргодгав иня програнни 1список файлов) где список файлов — ато список имен файлов из некоторой внешней для программы среды. Эти файлы должны быть локально объявлены в основной программе. Другие локальные файлы могут быть объявлены в программе или в подпрограммах так же, как и переменные любого лругого типа. Эти локальные файлы можно использовать в качестве временных файлов, куда в одной части программы записывается информация, которая затем считывается в другой ее части.
Локальные файлы исчезают при выходе из программы или подпрограммы, в которой онн были объявлены, как и любой другой локально определенный объект в Равсай При объявлении файла сто имя используется как имя буферной переменной, ссылка на которую выглядит как иия файла?. Эта буферная переменная не объявляется явным образом, но в программе можно на нее ссылаться и использовать в операторах присваивания. Например, если переменная г объявлена как Е: Гт1е ат 1птерег то внутри той программы, тле содержится это объявление, операторы присваивания р') = 2ик = рфбудутвполнекорректными. Ьуфернаяпеременная — этообъект данных, прелставляютцпй локальную временную область памяти лля одно~ о компонента файла.
Две предопределенные процедуры ое1 и рц) используются лля перемещения лапных из файла в буферную переменную (ое~) н нз буферной переменной в файл (рой). П.В. Рааса! 641 Определяемые пользователем типы данных В Рааса! новый тип данных создается с помощью объявления: Суре иня типа определение типа Определения типов в Рааса! используются только во время компиляции. Компилятор вносит информацию, полученную из определений типов, в свою таблицу символов, а затем использует ее для осуществления статической проверки типов в ссылках на переменные и для компоновки записей активаций подпрограмм. Во время выполнения программы определения типов отсутствуют.
В некоторых случаях считается, что две переменные относятся к одному типу данных, если в их объявлениях указано одно и то же имя типа. В других случаях считается, что переменные относятся к одному типу, если типы, фигурирующие в их объявлениях, имеют одну и ту же структуру, Так, для определения того, относятся ли две переменные к одному и тому же типу, в Разса! используется объединение двух понятий эквивалентности типов — эквивалентность имени и эквивалентность струкп)уры.
Эквивалентность имени используется в основном для определения того, совпадают ли типы формальных и фактических параметров при вызове подпрограммы; в большинстве других ситуаций используется структурная эквивалентность. П.8.2. Управление последовательностью действий Выражения В Рааса! испол) чуются четыре уровня старшинства операций для вычисления выражений. Их иерархия в порядке убывания приоритетов выглядит так: поС *, !, Мч, воо. апб +. †, ог <» ья « , =, > . 1П 3 В пределах одного уровня иерархии члены вьгражения вычисляются слева направо. Обратите внимание на то, что по сравнению с обычным вычислением выражений этот способ выглядит несколько противоестественно. Обычно приоритет операции апс) ниже, чем приоритет арифметических операций.
Например, следующий фрагмент: чаг А,В:Ьоо1вап; 11 А апб В Га!зе СПеп ... будет интернрстирован компилятором Рааса! как 1Г (А апб В)=уа1зе Шеп ... хотя, вероятно, имелось в виду следующее; 11 А апб [В-Га1ве) Феп ... Это ие опечатка.' здесь, судя по всему, авторы выделили три ми;рации сра вин ~ия для множеств (<=, >- и )п), пазтому символы употреблены дввждьь — Примеч. науч. ред. 642 Приложение. Обзоры языков Условие в первой интерпретации будет выполнено, если либо А, либо В имеют значение Га15е, В то ВрЕМя Как Во Второй интерпРетации предполагается, что А имеет значение Ьгые, а  — СО15е.
Поэтому лучше, во избежание подобной путаницы, всегда использовать скобки в логических выражениях. В выражениях Равса1 не выполняется никакого преобразования типов, за исключением преобразования целочисленных операндов в вещественные, когда это следует из контекста. Операторы Составные операторы. В Равса! составной оператор ограничен конструкцией Ьед1п ... епс: Ьешп оператор оператор епп Условные операторы. В Равса! имеются два условных оператора: т 1 и саве, Оператор т й Простой условный оператор с одной и двумя ветвями выглядит следующим образом: тт логическое вырвиение слеп оператор тт логическое вырвиение тлел оператор е1ве оператор Если две зти формы объединены, как, например, в следующем случае: тт А = О Феп тт В < С слеп 5, е1ве 5,: то возникающая неоднозначность, которая обсуждалась разделе 8.3.2, всегда раз- решается таким образом, что часть е1 ве всегда соотносится с ближайтпим предше- ствующим несогласованным Ьйеп.
Оператор саве. Оператор саве имеет следующую форму: саве вырвиение от константа оператор, константе: оператор епо где константы представляют возможные значения выракении. При выполнении оператора саве вычисляется выражение, расположенное в начале этого оператора, и полученное значение используется для определения того, какой из следующих операторов должен выполнятъся. Если в результате вычисления выражения получается значение, которое не равно ни одной из констант оператора саве, то эта ситуация рассматривается как ошибка времени выполнения программы, Операторы цикла. В Равса1 имеется три вида операторов цикла.
В двух основных операторах, ыМ1е и гереаг, проверка условия окончания цикла проводится перед очередной итерацией (ыМ1е) или после каждой итерации (гереаг). Синтаксис этих операторов следуюШий; ны 1е логическое вырвкение Оо оператор гереат послеловвтЕльность опЕратОРов опттт логическое вырвкение В обоих случаях тело цикла может быть представлено последовательностью операторов, иодля оператора ыЬ11е требуется явным образом определить тело цикла с помоШью составного оператора Ьед1п ., епсС П.8. Рааса! б43 Третий впд операторов цикла — это цикл тог, в котором заданное число итераций сопровождается последовательным увеличением или уменьшением счетчика.
Синтаксис обеих форм оператора Еог следующий: тог простая перененная :- начальное значение Со нонечное значение Со оператор тог простая перененная := начальное значение Всхпто конечное значение Со оператор Здесь форма со указывает, что после каждой итерации простая перененная (счетчик) возрастает на единицу, а форма Осхпьо указывает на соответствующее уменьшение этой переменной иа единицу. Другие варианты увеличения или уменьшения счетчика в Рачса! пе допускаются. Начальное и конечное значения задаются произвольными выражениями, которые вычисляются при входе в цикл. Внутри цикла запрещается прнсваивание каких-либо значений переменной, контролирующей итерации. Конструкции, подверженные ошибкам.