РЕФАЛ

sm_book.jpg (20496 bytes)

C П Р А В О Ч Н И К  

 

   А. Инсталляция и использование для IBM XT/AT

   B. Справочник по синтаксису
   С. Встроенные функции
   D. РЕФАЛ-трассировщик
 
 

A

ИНСТАЛЛЯЦИЯ И ИСПОЛЬЗОВАНИЕ

ДЛЯ IBM XT/AT

 

Здесь приведены инструкции по инсталляции и использованию системы РЕФАЛ-5 на персональных компьютерах IBM AT или XT под управлением MS-DOS. Имеется также адаптация этой системы для  Apple Macintosh. Ее описание поставляется вместе с дискетой для  Macintosh.

1. Инсталляция

Системная дискета содержит следующие файлы:

  README             
  REFC     EXE      
  REFGO    EXE      
  REFTR    EXE      
  RDHELP   TXT       
  TEST     REF       
  TEST     RSL       
  E        REF
  MBPREP   REF      
  REFLIB   REF        


1. Скопируйте три EXE файла в любую поддиректорию, которая входит в PATH .
2. Скопируйте все остальные файлы, кроме README, в любую поддиректорию, допустим, REFAL .
3. Войдите в REFAL и выполните:

  refc E
  refc MBPREP
  refc REFLIB

Это приведет к появлению дополнительных файлов E.RSL , MBPREP.RSL и REFLIB.RSL в REFAL .

4. Введите строку:

  SET RD_HELP=REFAL\RDHELP.TXT

в ваш AUTOEXEC.BAT файл. Это даст вам возможность читать  help-файл из РЕФАЛ-трассировщика.

5. Теперь все установлено. Для проверки, что все работает как нужно, запустите:

  refgo test

Это приведет к запуску интерактивной программы, выполняющей трансляцию арифметических выражений.

2. Использование

В дальнейшем XXX , YYY  и т.д. будут означать некоторые имена файлов (без расширений).

Используя любой редактор текстов, создайте РЕФАЛ-программу в XXX.REF . Чтобы скомпилировать ее, выполните:

  refc XXX 

Если в программе нет ошибок, никакие сообщения не выдаются. Файл XXX.RSL, который содержит результат трансляции РЕФАЛ-программы в интерпретируемый язык RASL, будет размещен в текущей директории. Если имеется сообщение об ошибках, смотрите файл XXX.LIS , содержащий листинг РЕФАЛ-программы с диагностикой ошибок.

Для запуска РЕФАЛ-программы выполните:

  refgo XXX

Если потребуются функции, определяемые в других модулях: YYY , ZZZ  и т.д., скомпилируйте YYY , ZZZ  и т.д. и запустите:

  refgo XXX+YYY+ZZZ  etc.

В частности, не забывайте включать модуль  reflib , когда используете некоторые из стандартных функций, определенных в этом руководстве.

ЗАМЕЧАНИЕ: Убедитесь, что между знаками плюс и именами файлов нет пробелов.

При использовании refgo  можно задать опции:

  refgo -nt XXX+YYY etc.  

либо

  refgo XXX+YYY etc. -nt

Тогда по окончании работы на печать будут выдаваться количество шагов и время выполнения. -n соответствует выдаче только количества шагов, -t    - только времени выполнения.

Чтобы запустить программу через трассировщик,   вместо refgo используется REFTR:

  reftr XXX+YYY+ZZZ  etc.

(описание трассировщика см. в  Разделе справочника D ).

В случае запуска программы в аргументами выполните:

  refgo XXX+YYY etc. Arg1 Arg2 etc.
  reftr XXX+YYY etc. Arg1 Arg2 etc.

Аргумент не может начинаться с - . Для организации доступа к аргументам  из РЕФАЛ-программы используйте <Arg s.N> (см. Раздел справочника C).

При вычислении любых вызовов функций, определенных в некотором файле  XXX, с применением вычислителя E (о нем можно справиться в разделе 6.3), проследите, чтобы этот файл содержал строку:

  $ENTRY Upd { e.X = <Up e.X>; }

Затем введите:

  refgo e+XXX+...

либо

  reftr e+XXX+...

На начало

 

B

СПРАВОЧНИК ПО СИНТАКСИСУ

1. Лексические единицы

Лексические единицы РЕФАЛа подразделяются на специальные знаки, символы и переменные. Между лексическими единицами может проставляться любое количество как пробелов, так и знаков переноса. Пробел становится лексической единицей, когда он появляется в строке, заключенной в кавычки.

1.1 Специальными знаками являются:


Имеются также специальные системные ключевые слова: $ENTRY и $EXTERNAL (последнее можно использовать также в форме $EXTERN или $EXTRN ). Системные ключевые слова следует записывать большими буквами.

1.2 Символами являются:



1.2.1 Идентификатор является строкой алфавитно-цифровых знаков, начинающейся с заглавной буквы. Его длина не должна превышать 15 знаков. Тире и подчеркивания также допустимы в идентификаторах; они являются эквивалентными. Большие и малые буквы внутри идентификаторов также эквивалентны.

1.2.2 Макроцифрами являются целые неотрицательные числа. Они представляются строками десятичных цифр. Значением наибольшей макроцифры служит 232 - 1.

1.2.3 Действительные числа, не снабженные знаком, должны начинаться и заканчиваться цифрой и включать десятичную точку, либо букву E , либо и то и другое. Точный синтаксис действительных чисел может быть задан следующей BNF (бэкусовской нормальной формой); здесь и далее альтернативы располагаются в разных строчках:

real-number ::= unsigned-real 
                - unsigned-real 
                + unsigned-real 
unsigned-real ::= digits . digits 
                  digits . digits E digits 
                  digits E digits 
digits ::= decimal-digit 
           decimal-digit digits 



1.2.4 Знаковые символы заключаются в одинарные или двойные кавычки. Цепочка (строка) знаковых символов заключается  в кавычки целиком; так, 'ab c' есть последовательность четырех знаковых символов (третьим символом является пробел). Недопустим перенос цепочки знаковых символов со строки на строку. Кавычка внутри цепочки, которая ограничена кавычками того же вида, представляется сдвоенной кавычкой. Следующие две строки-цепочки:

  "Jimmy's Pizza" 
  'Jimmy''s Pizza'

представляют один и тот же РЕФАЛ-объект. Для того, чтобы избежать ложных кавычек, следует разделять заключенные в кавычки цепочки пробелами в том случае, когда они следуют непосредственно одна за другой. Размер цепочки ограничен 255 знаками, поэтому следует разбивать длинные цепочки на части.

1.3 Переменная представляет собой индикатор типа, за которым следует точка, а за ней, в свою очередь, следует индекс. Индикаторами типа являются:

Они должны всегда представляться малыми буквами. Индекс может быть идентификатором, либо числом. В случае односимвольного идентификатора   либо числа, представленного единственной цифрой, точка может быть опущена. Если точка не опущена, идентификатор может начинаться с малой буквы. Каждое из представлений e.X , e.X    и  e.x означает один и тот же РЕФАЛ-объект. t12 и eTree не являются правильными переменными; необходима точка: t.12 , e.Tree .

1.4 Знаки пробела, табулирования и возврата каретки (известные под общим названием "невидимые символы") игнорируются РЕФАЛ-компилятором, если они появляются между лексическими элементами. Они всегда играют роль разделителей, предотвращая поглощение лексических единиц каким-либо фрагментoм, как, например, в случае последовательности идентификаторов или чисел. В то же время лексические элементы могут следовать друг за другом, не перемежаясь разделителями, до тех пор, пока это не мешает лексическому анализу. Например, употребление синтаксической конструкции s1s2s3 совершенно законно и эквивалентно s1 s2 s3 , так как за идентификатором типа ожидается появление в точности одного символа в случае, когда за ним не следует непосредственно точка. Однако, запись s.1s.2s.3 является синтаксической ошибкой.

2. Выражения

Синтаксис РЕФАЛ-выражений в  BNF-представлении имеет вид:

expression ::= empty 
               term expression 

term ::= symbol 
         variable  
         (expression)
         <f-name expression>

f-name ::= identifier 
empty ::= 

Выражение-образец, или просто образец, представляет собой выражение, которое не включает никаких вычислительных скобок. Основным выражением является такое выражение, которое не содержит ни одной переменной.

3. Предложения и программы

РЕФАЛ-программа есть перечень функциональных определений (f-definition's -- см. ниже) и внешних объявлений функций (external-decl). Для отделения одного внешнего объявления от другого должны использоваться точки с запятыми; ими могут также разделяться функциональные определения.

program ::= f-definition 
	    f-definition  program 
	    f-definition ;  program 
            external-decl ;  program 
            program  external-decl ;

f-definition ::= f-name {  block }
		 $ENTRY  f-name {  block }

external-decl ::= $EXTERNAL  f-name-list 
                  $EXTERN  f-name-list 
                  $EXTRN  f-name-list 

f-name-list ::= f-name 
                f-name , f-name-list 

block ::= sentence 
          sentence ;
          sentence ;  block 

sentence ::= left-side  conditions  =   right-side 
	     left-side  conditions  ,  block-ending 

left-side ::= pattern 

conditions ::= empty 
               , arg : pattern conditions 

arg ::= expression 

right-side ::= expression 

block-ending ::= arg : { block }

4. Комментарии

Комментарии могут вставляться  в текст программы, как это было определено выше. Они ингнорируются РЕФАЛ-компилятором. Имеются два вида комментариев:

Строковые комментарии обычно относятся к следующему предложению(ям); комментарии-вставки относятся к предшествующему тексту.

На начало

 

C

ВСТРОЕННЫЕ ФУНКЦИИ

РЕФАЛ-5 содержит библиотеку стандартных встроенных функций. Она включает операции ввода/вывода и арифметические операции, различные системные функции, которые не могут быть заданы в РЕФАЛе, и некоторые простые процедуры, встроенные в систему для повышения ее эффективности. В случае нужды функциональное имя, используемое для встроенной функции, может быть присвоено функции, определяемой посредством РЕФАЛа. Тогда встроенная функция становится недоступной.

1. Функции ВВОДа/ВЫВОДа 

<Card>

возвращает (замещается на) следующую строку из входного файла. Обычно она поступает с терминала, но ввод может быть переназначен любым допустимым в  MS-DOS способом. Возвращаемое выражение представляет собой последовательность набираемых символов (быть может, пустую). Байт признака конца файла в нее не включается. Если ввод производится из файла, при достижении конца файла возвращается макроцифра 0 ( строк больше нет). Это используется в программах как индикатор конца, так как в противном случае макроцифра не может возникать при вводе. При считывании с терминала тот же эффект вызывает ввод комбинации Control-Z .


<Print e.Expr>

распечатывает выражение e.Expr на текущее выводное устройство и возвращает (заменяется на) e.Expr .


<Prout e.Expr>

распечатывает выражение e.Expr на текущее выводное устройство и возвращает пустое выражение.

Функциям, которые работают с файлами, требуется в качестве аргумента файловый дескриптор. Дескриптор файла является макроцифрой в диапазоне 1-19; в некоторых операциях допустим дескриптор 0 , он считается ссылкой на терминал.


<Open s.Mode s.D e.File-name>

открывает файл e.File-name и связывает его с файловым дескриптором s.D . s.Mode является одним из символов: 'w','W' (открыть для записи), либо 'r','R' (открыть для чтения). e.File-name может быть пустым; Open в этом случае попытается открыть файл REFALdescr.DAT , где descr является десятичным представлением десткриптора s.D . Если текущим режимом является чтение, а такого файла не существует, выдается ошибка. Если режимом является запись, такой файл будет создан.


<Get s.D>

где s.D является файловым дескриптором либо нулем , действует подобно <Card> , за исключением того, что она получает входные данные из файла, указанного в s.D . Если ни один из файлов с таким файловым дескриптором еще не открыт, Get попытается открыть файл REFALdescr.DAT , где descr является десятичным представлением s.D . В случае неудачи возникает ошибочная ситуация  и выполнение программы завершается. Если значением s.D является 0 , Get будет читать с терминала.


<Put s.D e.Expr>

где s.D является файловым дескриптором либо нулем , записывает e.Expr в файл с дескриптором s.D и возвращает Expr (подобно операции Print ). Если ни один из файлов с таким файловым дескриптором еще не открыт для записи, Put откроет файл REFALdescr.DAT , где descr является десятичным представлением s.D . Если значением  s.D является 0 , Put осуществит вывод на терминал. (Заметим, что этот вывод не является переадресуемым.)


<Putout s.D e.Expr>

возвращает пустое значение (подобно Prout ). Во всем остальном Putout идентична функции Put .


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

 

Представление чисел. Целые числа представляются как последовательности  макроцифр с использованием основания 232 . Перед отрицательными целыми числами ставится символ '-' . Положительные числа могут снабжаться впереди знаком '+' . Арифметические функции возвращают целые числа в стандартной форме: '-' и последовательность макроцифр для отрицательного числа; отсутствие знака '+' для  0 или для положительного числа.

Действительные числа (произвольного знака) представлены как единичные символы и занимают 32-битное слово. (О синтаксисе действительных чисел см.  Раздел справочника B.)

Основным форматом бинарной арифметической операции является следующий:

  <ar-function (e.N1) e.N2>

Однако круглые скобки могут опускаться. В этом нет проблемы для действительных чисел, так всякое такое число представлено ровно одним символом. Когда же первый аргумент представляет собой целое число, по умолчанию от него будет браться одна макроцифра, возможно с предшествующим знаком, в то время как остальная часть поступит во второй аргумент.

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

Реализованы следующие арифметические функции (как ar-function в формате):

Add , или +

возвращает сумму операндов.


 

Sub , или -

вычитает e.N2 из e.N1 и возвращает разность.


 

Mul , или *

возвращает произведение операндов.


 

Div or /

если по крайней мере один из аргументов является действительным, функция возвращает действительное частное. Если оба являются целыми, Div возвращает целое частное от деления e.N1 на e.N2 ; остаток игнорируется. В реализации этой и двух других функций деления возникает ошибка, если значением e.N2 является 0.


 

Divmod

рассчитана на целые аргументы и возвращает

  (e.Quotient) e.Remainder 

Остатку присваивается знак e.N1 .


 

Mod

рассчитана на целые аргументы и возвращает остаток от деления e.N1 на e.N2 .


 

Compare

сравнивает два числа и возвращает '-', когда e.N1 меньше, чем e.N2 ; '+' , когда больше ; '0' , когда числа равны.


 

<Trunc e.N>

где e.N является целым числом, возвращает усеченное целое число.


 

<Real e.N>

где e.N является целым числом, возвращает равное ему действительное число.


 

<Realfun (e.Function) s.N> или
<Realfun (e.Function) s.N1 s.N2>

возвращает значение функции e.Function одного или двух аргументов. e.Function должно быть строкой символов, которая является названием функции, имеющейся в языке C. Например, <Realfun ('log') s.N> возвращает логарифм s.N . (Информацию о перечне имеющихся функций см. на  системной дискете.)


3. Операции со стэком

 

<Br e.Name'=' e.Expr>

закапывает (см. Главу 4) выражение e.Expr под именем e.Name . Имя не должно содержать знак '=' на верхнем уровне структуры.


 

<Dg e.Name>

выкапывает выражение, закопанное под именем e.Name , то есть возвращает последнее выражение, закопанное под этим именем и удаляет его из стэка. Если не существует выражения, закопанного под именем e.Name , Dg возвращает пустое выражение.


 

<Cp e.Name>

работает как Dg, но не удаляет выражение из стэка.


 

<Rp e.Name'=' e.Expr>

замещает выражение, закопанное под именем e.Name, на e.Expr .


 

<Dgall> выкапывает стэк полностью. Стэк является строкой термов вида

  (e.Name'=' e.Value)

Всякий раз, когда вызывается Br, такой терм добавляется к левой части. Dg удаляет самый левый терм, в то время как Cp копирует его, а Rp заменяет его.


4. Обработка символов и строк

 

<Type e.Expr>

возвращает s.Type e.Expr , где e.Expr является неизменным, а s.Type зависит от типа первого элемента выражения e.Expr .

  s.Type   e.Expr начинается с: 
  'L'      буквы 
  'D'      цифры  
  'F'      идентификатора или имени функции 
  'N'      макроцифры 
  'R'      действительного числа 
  'O'      любого другого символа 
  'B'      левой скобки 
  '*'      e.Expr  является пустым 

 

<Numb e.Digit-string>

возвращает макроцифру, представленную строкой e.Digit-string .


 

<Symb s.Macrodigit>

является обратной к функции Numb . Она возвращает строку десятичных цифр, представляющую s.Macrodigit .


 

<Implode e.Expr>

берет начальные алфавитно-цифровые символы выражения e.Expr и создает из них идентификатор (символическое имя). Начальная строка в e.Expr должна начинаться с буквы и заканчиваться неалфавитным символом, скобкой или признаком конца выражения. Строка не должна превышать 15 знаков. Подчеркивание и тире также допустимы. Implode возвращает идентификатор, за которым следует необработанная функцией часть выражения e.Expr . Если первый символ не является буквой, Implode возвращает макроцифру 0 , за которой следует аргумент.


 

<Explode s.Identifier>

возвращает строку символов, которая составляла s.Idenitifier .


 

<Chr e.Expr>

замещает всякую макроцифру в e.Expr знаком клавиатуры с таким же ASCII кодом по модулю 256.


 

<Ord e.Expr>

является обратной к Char . Она возвращает выражение, в котором все символы замещены на макроцифры, совпадающие с символьными  ASCII кодами.


 

<First s.N e.Expr>

где s.N является макроцифрой, разбивает e.Expr на две части -- e.1 и e.2 , и возвращает (e.1)e.2 . Если исходное выражение e.Expr имеет по крайней мере s.N термов (на верхнем уровне структуры), то первые s.N термов поступают в e.1 , а остальные e.2 . В противном случае e.1 совпадает с e.Expr, а e.2 является пустым.


 

<Last s.N e.Expr>

подобна First, но  s.N термов поступают в e.2 .


 

<Lenw e.Expr>

возвращает длину выражения e.Expr в термах, за которой следует e.Expr .


 

<Lower e.Expr>

возвращает исходное выражение e.Expr, в   котором все заглавные буквы замещены малыми буквами.


 

<Upper e.Expr>

подобна функции Lower . Все малые буквы замещаются большими.


5. Системные функции

 

<Step>

возвращает последовательный номер текущего шага в виде макроцифры.


 

<Time>

возвращает строку, в которой указано текущее время работы системы.


 

<Arg s.N>

где s.N является макроцифрой, возвращает аргумент командной строки, который имеет порядковый номeр s.N . Аргументы в командной строке не должны начинаться с '-' (чтобы не перепутать их с флажками).


 

<Mu s.F-name e.Expr> , или
<Mu (e.String) e.Expr>

отыскивает функцию, имеющую имя s.F-name или

  <Implode e.String> 

(когда оно задано в форме символьной строки) и применяет ее к выражению e.Expr , то есть замещается на <s.F-name e.Expr> . Если ни одна такая функция  не является  видимой   из вызова функции Mu , возникает ошибка.


 

<Up e.Expr>

производит подъем выражения e.Expr (восстанавливает его по метакоду).  Об ограничениях на e.Expr см. в Главе 6.


 

<Dn e.Expr> производит погружение e.Expr (метакодирует его).

На начало

 

D

РЕФАЛ-ТРАССИРОВЩИК

Трассировщик производит выдачу основных выражений из поля зрения в коде, который является расширением  кода 'подмены выражений' (см Разд.2.3):

  имеется в поле зрения    выдается как	
  
  s.Identifier             #e.Char-string   blank 
    s.Number               #e.Char-string   blank 
        (                           (
        )                           )
        <                           <
        >                           >
        '('                        #(
        ')'                        #)
        '<'                        #<
        '>'                        #>
        '#'                        ##
  неизвестное(t,n,i)               #t.ni

 


Идентификаторы выдаются большими буквами.

Для вызова РЕФАЛ-трассировщика используется reftr (см. Раздел справочника A). Перечень команд трассировщика приведен ниже. В начале работы и после исполнения каждой команды (за исключением quit ), трассировщик выдает подсказку:

TRACE>

названия команд и их параметры могут набираться как на верхнем, так и на нижнем регистре  (за исключением спецификации образца  P, когда регистр является важным). Командные параметры могут разделяться пробелами, табуляторами или запятыми (в приводимом ниже перечне использованы пробелы). Команды разделяются возвратами каретки или точками с запятой. Для того, чтобы продолжить команду в следующей строке, в конце текущей строки следует набрать косую черту '\'.

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

Команды трассировщика

 

set_break(set,break) <F P>


где F означает функцию, определенную в текущий момент (в каком-либо из используемых модулей), а P  - образец для ее аргумента. Команда устанавливает точку прерывания. Трассировщик остановится, когда активной функцией является  F,  а ее аргумент сопоставим с  P .


 

print(pr,p) value

распечатывает значение value , определенное   в текущий момент. Параметром  value может быть:

view(v) выдается текущее поле зрения.
некоторая РЕФАЛ-переменная выдается значение переменной, определенное в текущей точке прерывания.
act выдается текущее активное выражение.
result(res) выдается результат выполнения команд compute или step.
call выдается активное выражение, которое было вызвано для текущего замещения - примениемое только после step или compute.

 

quit(q)

Останов РЕФАЛ-машины и  выход из трассировщика.


 

exit(e.x)

То же, что и quit, но сопровождается выдачей некоторой информации: число шагов, содержимое поля зрения и т.д.


 

go

Возобновление выполнения программы до следующей точки прерывания либо до конца.


 

compute(comp,com) [result(res)]

Вычисление текущего активного выражения с последующим остановом. Если присутствует result либо res , по окончании выдается результат.


 

delete(del,d) N

Ликвидирует точку прерывания с номером N.


 

step(s) N [result(res)]

Производится N шагов и затем останов. Если N отсутствует, считается, что N = 1 . Если присутствует параметр result и N = 1 , выдается результат шага.


 

show(sho,sh) key

Демонстрирует некоторые текущие характеристики процесса вычислений. Параметром key может быть:

step выдается текущий номер шага.
point выдается текущая точка прерывания.
[break] N выдается точка прерывания номер N.
all выдаются все точки прерывания.
modules(mod) [name]
 
 
выдаются все функции, видимые из модулей с указанными именами. Если в качестве name задано '*' , то все модули выводятся на дисплей. Если name не задано, выдается только перечень доступных модулей.
function(fun) name выдается имя модуля, в котором определена функция name .

 

help

Выдает перечень команд трассировщика.


 

. [N]

Точечная команда повторяет N раз последнюю группу команд, находящуюся в одной строке. Отсутствие N означает, что N = 1. Точка может занимать первую позицию в  командной строке.

На начало