Главная страница
Навигация по странице:

  • Арифметические функции

  • Функции-преобразователи типа

  • Функции лексического анализа

  • Функции ввода и вывода

  • Функции для работы с файлами

  • Функция порождения процесса

  • М. В. Ломоносова Факультет вычислительной математики и кибернетики Е. И. Большакова, Н. В. Груздева Основы программирования на языке Рефал Учебное пособие


    Скачать 0.92 Mb.
    НазваниеМ. В. Ломоносова Факультет вычислительной математики и кибернетики Е. И. Большакова, Н. В. Груздева Основы программирования на языке Рефал Учебное пособие
    Анкорqewqe
    Дата02.01.2022
    Размер0.92 Mb.
    Формат файлаdoc
    Имя файлаRefalP-1.doc
    ТипУчебное пособие
    #323127
    страница9 из 22
    1   ...   5   6   7   8   9   10   11   12   ...   22

    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 = '('')->' s2

    e1 = e1

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

    2.4.Встроенные функции


    В языке Рефал-2 реализован достаточно широкий набор встроенных функций, включающий:

    • арифметические функции;

    • функции-преобразователи типа;

    • функции лексического анализа;

    • функции ввода и вывода;

    • функции для работы с файлами;

    • функция порождения процесса;

    • функции для работы с копилкой (описаны в следующем разделе).

    Приведём описание основных встроенных функций языка Рефал-2.

    Арифметические функции

    Арифметические функции предназначены для работы с целыми числами. Целое число представляется в языке Рефал-2 как символ-число или как последовательность макроцифр (для чисел, больших по модулю 224), которым может предшествовать символ-литера '+' или '-'. Целое число ноль представляется либо символом-числом /0/, либо пустым выражением.

    Поскольку рефал-функция имеет один аргумент, а арифметические функции имеют обычно два аргумента, принят следующий формат обращения к арифметическим рефал-функциям, позволяющий разделять аргументы: (первый_аргумент)второй_аргумент, далее – (N1)N2.

    При описании каждой арифметической функции будем указывать форму обращения к ней и получаемый результат. В примерах использования функций знак  отделяет функциональное обращение от результата его вычисления.

    1. N1)N2> – результатом вычисления является рефальское число, равное сумме аргументов функции N1 и N2. Например, → '‑'/2/
      → /124/

    2. N1)N2> – вычисляется разность чисел N1 и N2. Например,  /8/
      → /6/

    3. N1)N2> – результатом вычисления является произведение чисел N1 и N2. Например,
       '-'/15/

    4. N1)N2> – вычисляется частное целочисленного деления числа N1 на N2. Например,
       /2/

    5. N1)N2> – возвращает результат в формате частное(остаток), причём остаток имеет знак первого аргумента N1 и выполняется равенство: N1=N2*частное+остаток. Например,
       '-'/2/('-'/4/)

    6. N> – функция увеличивает свой аргумент символ-число N на единицу и выдаёт в качестве результата; функция работает с числами в диапазоне от 0 до 16777214 (=224-2). Например:
       /1/
       /676/

    7. N> – функция уменьшает свой аргумент символ-число N на единицу и выдаёт в качестве результата; функция работает с числами в диапазоне от 1 до 16777215 (=224-1). Например,
       /349/

    8. N1)N2> – результатом вычисления является выражение вида знак(N1)N2, где знак – один из символов '<', '=' или '>', в зависимости от того, является ли целое число N1 меньшим, равным или большим N2. Например:
       '>'('+'/3/)'-'/5/
       '<'('-'/8/)'-'/5/
       '='('+'/3/)/3/

    Приведём дополнительные примеры работы арифметических функций с большими числами:

    → /19//124/

    → '-'/1//2/

    → /16777210/

    → /9//1404081/


    → /671088/(/20/)

    → '<'(/16777215/)/1//2/


    '>'('-'/16777215/)'-'/1//2/

    Функции-преобразователи типа

    1. Функция Numb преобразует свой аргумент – цепочку символов-литер, представляющую десятичное целое число со знаком или без него, в соответствующее рефальское число и выдаёт его в качестве результата (функция работает с числами в диапазоне от -2147483647 до 2147483647=231‑1). Например,
       '-'/27/
       /15/
      → /127//16777215/

    2. Функция Symb выполняет обратное преобразование, т.е. преобразует рефальское число в соответствующую цепочку символов-литер (работает с числами в том же диапазоне, что и функция Numb). Например,
       '-348'
      → '2147483647'

    3. Функция Cvb – расширение Numb для работы с большими числами. Например,

      /43860//11111659//2034386/
       '-'/27/

    4. Функция Cvd – расширение Symb для работы с большими числами. Например,

      '-12345678901234567890'
       '348'

    5. Функция Ftochar в качестве результата выдает цепочку символов-литер, из которых состоит её аргумент – символ-метка. Например,
       'REF'

    6. Обратная к ней функция Chartof превращает цепочку символов-литер в символ-метку и выдает её в качестве результата, при этом строчные буквы цепочки заменяются соответствующими прописными. Например,
       /LR25/
      >  'ASDF'
      Все созданные функцией Chartof символы-метки сохраняются в специальной таблице.

    7. Функция Functab вызывается с аргументом, являющимся символом-меткой. Она нужна в случаях, когда в тексте рефал-программы используется символ-метка, и такая же символ-метка генерируется функцией Chartof. Тогда в начале работы рефал-программы должно вычислиться обращение символ-метка> с этой символ-меткой.

    Функции лексического анализа

    1. Функция Lengw вычисляет длину своего аргумента-выражения, измеренную как количество термов верхнего уровня, и выдает результат в виде символ-числа, например,  /5/.
      Длина пустого выражения равна нулю, т.е.  /0/.

    2. Функция First получает в качестве аргумента символ-число, за которым следует произвольное рефал-выражение, и отщепляет от начала этого выражения заданное количество термов на верхнем уровне, заключая их в структурные скобки. Преобразованное таким образом выражение выдается в качестве результата. Если число термов верхнего уровня в этом выражении меньше заданного в аргументе функции числа, то функция возвращает исходное выражение, помещая перед ним символ-литеру '*'. Например,
      ('a'('b')'c')'d'('e')
       '*a'('bcd')'e'

    3. Функция Last осуществляет аналогичное действие, отщепляя заданное количество термов от конца заданного выражения, если это возможно, или же приписывая в конец выражения символ-литеру '*'. Например,
       'a'('b')('cd'('e'))
       'a'('bcd')'e*'

    Функции ввода и вывода

    1. Функция ввода строки с клавиатуры Card считывает строку символов до управляющего символа Enter. Обращение к этой функции имеет вид , после его вычисления оно заменяется в поле зрения на введённую строку символов.

    2. Функции вывода Print, Printm, Prout и Proutm служат для вывода информации на экран компьютера, их единственный аргумент – объектное выражение. При вычислении соответствующего функционального вызова он заменяется в поле зрения для первых двух функций – выражением-аргументом функции, для последних двух – пустым выражением. Отличие функций Print и Prout от соответствующих Printm и Proutm заключается в формате вывода выражения: две последние функции выводят выражение в том же виде, как оно записывается в исходных рефал-программах, а Print и Prout изменяют при выводе некоторые знаки выводимого выражения: у символов-литер опускаются апострофы, у символов-меток и символов-чисел вместо знаков косой черты печатаются апострофы. Например, в результате вычисления

      на экране компьютера появится строка:
      /VARX/':='/25/';'/Y/':=-'/9/
      а в результате вычисления

      на экране компьютера появится строка:
      'VARX':='25';'Y':=-'9'

    Функции для работы с файлами

    1. Функции Openget и Openput с аргументом – цепочкой символов, представляющей собой спецификацию файла, открывают указанный файл либо на чтение (функция Openget) либо на запись (функция Openput). При вычислении функциональный вызов заменяется в поле зрения на пустое выражение. Пример обращения к функции:


    2. Функции Clsget и Clsput без аргументов закрывают файл, открытый на чтение или запись. При вычислении функциональные вызовы и заменяются в поле зрения на пустое выражение.

    3. Функция Libget без аргументов читает очередную строку из файла, предварительно открытого для чтения, при вычислении её вызов заменяется в поле зрения считанной строкой символов либо пустым выражением, если файл прочитан полностью.

    4. Функция Libput выводит в предварительно открытый для записи файл свой аргумент-выражение, заменяя в этом выражении структурные скобки соответствующими символами-литерами '(' и ')'. Аргументом функции может быть объектное выражение, не содержащее составных символов. При вычислении вызов функции Libput заменяется в поле зрения на пустое выражение.

    Заметим, что в любой момент времени в программе может быть открыто не более одного файла на чтение и не более одного файла на запись.

    Функция порождения процесса Apply позволяет писать программы, анализирующие аварийные ситуации вида “отождествление невозможно” и “свободная память исчерпана” и предпринимающие некоторые действия по обработке таких ситуаций.

    Вызов функции имеет вид: имя_функции выражение>, причём имя_функции должно быть задано в виде символа-метки. Такой вызов порождает новое поле зрения, в которое помещается функциональный терм <имя_функции выражение>, и делается попытка его вычислить. Результат же возвращается в то поле зрения, из которого была вызвана функция Apply, после чего созданное дополнительное поле зрения уничтожается. По первому символу возвращаемого значения можно определить, удачна ли попытка вычисления функционального терма: символ 'N' означает успешное вычисление, 'R' – произошел останов «отождествление невозможно», 'S' – останов «свободная память исчерпана».
    1   ...   5   6   7   8   9   10   11   12   ...   22


    написать администратору сайта