C П Р А В О Ч Н И К |
ИНСТАЛЛЯЦИЯ И ИСПОЛЬЗОВАНИЕ |
ДЛЯ IBM XT/AT |
Здесь приведены инструкции по инсталляции и использованию системы РЕФАЛ-5 на персональных компьютерах IBM AT или XT под управлением MS-DOS. Имеется также адаптация этой системы для Apple Macintosh. Ее описание поставляется вместе с дискетой для Macintosh.
Системная дискета содержит следующие файлы:
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
Это приведет к запуску интерактивной программы, выполняющей трансляцию арифметических выражений.
В дальнейшем 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+...
СПРАВОЧНИК ПО СИНТАКСИСУ |
Лексические единицы РЕФАЛа подразделяются на
специальные знаки, символы и переменные. Между
лексическими единицами может проставляться
любое количество как пробелов, так и знаков
переноса. Пробел становится лексической
единицей, когда он появляется в строке,
заключенной в кавычки.
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
является синтаксической ошибкой.
Синтаксис РЕФАЛ-выражений в BNF-представлении имеет вид:
expression ::= empty term expression term ::= symbol variable (expression) <f-name expression> f-name ::= identifier empty ::=
Выражение-образец, или просто образец, представляет собой выражение, которое не включает никаких вычислительных скобок. Основным выражением является такое выражение, которое не содержит ни одной переменной.
РЕФАЛ-программа есть перечень функциональных определений (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 }
Комментарии могут вставляться в текст программы, как это было определено выше. Они ингнорируются РЕФАЛ-компилятором. Имеются два вида комментариев:
Строковые комментарии обычно относятся к следующему предложению(ям); комментарии-вставки относятся к предшествующему тексту.
ВСТРОЕННЫЕ ФУНКЦИИ |
РЕФАЛ-5 содержит библиотеку стандартных встроенных функций. Она включает операции ввода/вывода и арифметические операции, различные системные функции, которые не могут быть заданы в РЕФАЛе, и некоторые простые процедуры, встроенные в систему для повышения ее эффективности. В случае нужды функциональное имя, используемое для встроенной функции, может быть присвоено функции, определяемой посредством РЕФАЛа. Тогда встроенная функция становится недоступной.
<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 .
Представление чисел. Целые числа представляются как последовательности макроцифр с использованием основания 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 .
(Информацию о перечне имеющихся функций см. на
системной дискете.)
<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 заменяет его.
<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 . Все малые буквы
замещаются большими.
<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 (метакодирует его).
РЕФАЛ-ТРАССИРОВЩИК |
Трассировщик производит выдачу основных выражений из поля зрения в коде, который является расширением кода 'подмены выражений' (см Разд.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. Точка может
занимать первую позицию в командной строке.