М. В. Ломоносова Факультет вычислительной математики и кибернетики Е. И. Большакова, Н. В. Груздева Основы программирования на языке Рефал Учебное пособие
![]()
|
2.3.Особенности синтаксического отождествленияУточним правила синтаксического отождествления рефал-выражений для случаев специфицированных переменных. Одна и та же переменная может входить в левую часть предложения (выражение-образец) несколько раз, причём одни вхождения могут быть специфицированы, а другие – нет. В общем случае у каждого вхождения переменной может быть своя спецификация. При отождествлении выражения-образца с объектным выражением такая переменная получает значение, которое должно удовлетворять всем её спецификациям. Таким образом, множество допустимых значений специфицированной переменной представляет собой пересечение множеств допустимых значений, определяемых её спецификациями. При этом спецификации переменной, которые заданы для её вхождений в правую часть рефал-предложения при отождествлении игнорируются (и поэтому не имеют смысла). К примеру, рефал-предложение S(('A'))X S(('B'))X = SX равносильно предложению S(('AB'))X SX = SX и равносильно S(('AB'))X SX = S('CD')X При синтаксическом отождествлении выражения-образца с объектным выражением S- и W-переменные являются жёсткими элементами. В случае же использования в выражении-образце нескольких V- или E-переменных возможно возникновение неоднозначности при отождествлении. Для устранения неоднозначности применяются левое или правое согласование. При левом согласовании из возможных значений для V- и E- переменных выбираются самые короткие по числу термов на верхнем уровне (в том числе пустое – для Е-переменных), в порядке их рассмотрения слева направо, т.е. сначала для первой слева такой переменной выбирается наикратчайшее значение, затем для второй слева и т.д. При правом согласовании самые короткие значения для V- и E-переменных выражения-образца выбираются в порядке рассмотрения их справа налево. Например, при левом согласовании выражения-образца e1';'e2 с объектным выражением 'a:=2; b:=a; c:=a+b' переменная e1 получит значение 'a:=2', а переменная e2 – значение ' b:=a; c:=a+b'. При правом согласовании переменная e1 получит значение 'a:=2; b:=a', а переменная e2 – значение ' c:=a+b'. Для выполнения правого согласования при отождествлении выражения-образца некоторого рефал-предложения следует в его записи использовать знак R. За знаком R всегда должен следовать хотя бы один пробел. В общем случае знак R записывается в предложении после имени функции, но если оно опущено, то перед знаком R должен стоять пробел, например: R e1';'e2 = e1(e2) Для левого согласования вместо знака R используется знак L, например: L e1';'e2 = e1(e2) В результате применения предложения с правым согласованием к выражению 'a:=2; b:=a; c:=a+b', это выражение будет заменено на 'a:=2; b:=a'(' c:=a+b'). В результате же применения предложения с левым согласованием указанное выражение заменится на 'a:=2'(' b:=a; c:=a+b'). Если направление отождествления в рефал-предложении не указано, рефал-машина по умолчанию реализует левое согласование, поэтому знак L обычно опускается при записи предложений. Часто направление отождествления не существенно, однако в ряде задач именно правое согласование упрощает программирование. Рассмотрим функцию Implic, расставляющую скобки в логическом выражении, состоящем из переменных (записанных латинскими буквами) и знаков импликации ->. В полученном выражении порядок вычисления операций импликации задаётся явно и соответствует общепринятому порядку вычисления вложенных операций, например, выражение 'p‑>q‑>r‑>z' преобразуется в выражение '((p->q)->r)->z' . * Функция Implic расставляет скобки в логическом * выражении, указывая порядок вычисления импликации Implic R e1 '->' s2 = '(' e1 = e1 Применение именно правого отождествления в первом предложении этой функции позволило так просто запрограммировать необходимое преобразование логической формулы. 2.4.Встроенные функцииВ языке Рефал-2 реализован достаточно широкий набор встроенных функций, включающий: арифметические функции; функции-преобразователи типа; функции лексического анализа; функции ввода и вывода; функции для работы с файлами; функция порождения процесса; функции для работы с копилкой (описаны в следующем разделе). Приведём описание основных встроенных функций языка Рефал-2. Арифметические функции Арифметические функции предназначены для работы с целыми числами. Целое число представляется в языке Рефал-2 как символ-число или как последовательность макроцифр (для чисел, больших по модулю 224), которым может предшествовать символ-литера '+' или '-'. Целое число ноль представляется либо символом-числом /0/, либо пустым выражением. Поскольку рефал-функция имеет один аргумент, а арифметические функции имеют обычно два аргумента, принят следующий формат обращения к арифметическим рефал-функциям, позволяющий разделять аргументы: (первый_аргумент)второй_аргумент, далее – (N1)N2. При описании каждой арифметической функции будем указывать форму обращения к ней и получаемый результат. В примерах использования функций знак отделяет функциональное обращение от результата его вычисления. N1)N2> – вычисляется разность чисел N1 и N2. Например, /8/ → /6/ N1)N2> – вычисляется частное целочисленного деления числа N1 на N2. Например, /2/ Приведём дополнительные примеры работы арифметических функций с большими числами: → /16777210/ '>'('-'/16777215/)'-'/1//2/ Функции-преобразователи типа Функция Numb преобразует свой аргумент – цепочку символов-литер, представляющую десятичное целое число со знаком или без него, в соответствующее рефальское число и выдаёт его в качестве результата (функция работает с числами в диапазоне от -2147483647 до 2147483647=231‑1). Например, Функция Symb выполняет обратное преобразование, т.е. преобразует рефальское число в соответствующую цепочку символов-литер (работает с числами в том же диапазоне, что и функция Numb). Например, Функция Cvb – расширение Numb для работы с большими числами. Например, /43860//11111659//2034386/ Функция Cvd – расширение Symb для работы с большими числами. Например, '-12345678901234567890' Функция Ftochar в качестве результата выдает цепочку символов-литер, из которых состоит её аргумент – символ-метка. Например, Обратная к ней функция Chartof превращает цепочку символов-литер в символ-метку и выдает её в качестве результата, при этом строчные буквы цепочки заменяются соответствующими прописными. Например, Все созданные функцией Chartof символы-метки сохраняются в специальной таблице. Функция Functab вызывается с аргументом, являющимся символом-меткой. Она нужна в случаях, когда в тексте рефал-программы используется символ-метка, и такая же символ-метка генерируется функцией Chartof. Тогда в начале работы рефал-программы должно вычислиться обращение Функции лексического анализа Функция Lengw вычисляет длину своего аргумента-выражения, измеренную как количество термов верхнего уровня, и выдает результат в виде символ-числа, например, Длина пустого выражения равна нулю, т.е. Функция First получает в качестве аргумента символ-число, за которым следует произвольное рефал-выражение, и отщепляет от начала этого выражения заданное количество термов на верхнем уровне, заключая их в структурные скобки. Преобразованное таким образом выражение выдается в качестве результата. Если число термов верхнего уровня в этом выражении меньше заданного в аргументе функции числа, то функция возвращает исходное выражение, помещая перед ним символ-литеру '*'. Например, Функция Last осуществляет аналогичное действие, отщепляя заданное количество термов от конца заданного выражения, если это возможно, или же приписывая в конец выражения символ-литеру '*'. Например, Функции ввода и вывода Функция ввода строки с клавиатуры Card считывает строку символов до управляющего символа Enter. Обращение к этой функции имеет вид Функции вывода Print, Printm, Prout и Proutm служат для вывода информации на экран компьютера, их единственный аргумент – объектное выражение. При вычислении соответствующего функционального вызова он заменяется в поле зрения для первых двух функций – выражением-аргументом функции, для последних двух – пустым выражением. Отличие функций Print и Prout от соответствующих Printm и Proutm заключается в формате вывода выражения: две последние функции выводят выражение в том же виде, как оно записывается в исходных рефал-программах, а Print и Prout изменяют при выводе некоторые знаки выводимого выражения: у символов-литер опускаются апострофы, у символов-меток и символов-чисел вместо знаков косой черты печатаются апострофы. Например, в результате вычисления на экране компьютера появится строка: /VARX/':='/25/';'/Y/':=-'/9/ а в результате вычисления на экране компьютера появится строка: 'VARX':='25';'Y':=-'9' Функции для работы с файлами Функции Openget и Openput с аргументом – цепочкой символов, представляющей собой спецификацию файла, открывают указанный файл либо на чтение (функция Openget) либо на запись (функция Openput). При вычислении функциональный вызов заменяется в поле зрения на пустое выражение. Пример обращения к функции: Функции Clsget и Clsput без аргументов закрывают файл, открытый на чтение или запись. При вычислении функциональные вызовы Функция Libget без аргументов читает очередную строку из файла, предварительно открытого для чтения, при вычислении её вызов заменяется в поле зрения считанной строкой символов либо пустым выражением, если файл прочитан полностью. Функция Libput выводит в предварительно открытый для записи файл свой аргумент-выражение, заменяя в этом выражении структурные скобки соответствующими символами-литерами '(' и ')'. Аргументом функции может быть объектное выражение, не содержащее составных символов. При вычислении вызов функции Libput заменяется в поле зрения на пустое выражение. Заметим, что в любой момент времени в программе может быть открыто не более одного файла на чтение и не более одного файла на запись. Функция порождения процесса Apply позволяет писать программы, анализирующие аварийные ситуации вида “отождествление невозможно” и “свободная память исчерпана” и предпринимающие некоторые действия по обработке таких ситуаций. Вызов функции имеет вид: |