Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Непейвода Н.Н. -> "Основания программирования " -> 256

Основания программирования - Непейвода Н.Н.

Непейвода Н.Н., Скопин И.Н. Основания программирования — Институт компьютерных исследований , 2002. — 919 c.
Скачать (прямая ссылка): osnovanprogramm2002.pdf
Предыдущая << 1 .. 250 251 252 253 254 255 < 256 > 257 258 259 260 261 262 .. 316 >> Следующая

4. Если равила 1-3 неприменим и име тся несколько переменных для выра ений с отобра енным левым концом, то выбирается самая левая из них. Она называется открытой e-переменной. Первоначально она получает пустое значение, т. е. ее правый конец проектируется на тот
е узел, что и левй. ругие значения могут присваиваться открытым переменным через удлинение (см. равило 6).
5. Если все элементы P отображены, это значит, что процесс сопоставления успено заверен.
13.1.
737
6. В тупиковой ситуации процесс возвращается назад к последней открытой e-переменной (т. е. к той, что имеет максимальный номер проекции), и ее значение удлиняется; т. е., проекция ее правого конца в E продвигается на один терм вправо. осле этого процесс возобновляется. Если переменную нельзя удлинить (из-за Общих требований 1-3), удлиняется предествуая откртая переменная, и т. д. Если не имеется подлежащих удлинению открытых переменных, процесс сопоставления не удался.
Нарис. 13.2 сопоставление производится следующим образом. В начале имеется два жестких элемента с одним отображенным концом: 'A' и s.3. В соответствии с Правилом 3, отображается 'A' и этот элемент получает при отображении номер 1. Номера 2 и 3 будут назначены левой и правой скобкам, согласно Правилам 3 и 1. Внутри скобок начинается перемещение справа налево, так как t.2 является естким элементом, который мо ет быть ото-бра ен, в то время как значение e.1 ее не мо ет бть определено. а следующем шаге обнаруживается, что e.1 является закрытой переменной, чью проекцию не требуется обозревать для того, чтобы присвоить ей значение; что бы ни было между двумя узлами, это годится для присвоения (на самом деле, значение e.1 оказвается пустм). тобра ение s.3 заверает сопоставление. Располо ение отобрааих номеров над элементами образца дает наглядное представление описанного алгоритма:
1 2 5 4 3 6
'A' ( e.1 t.2 ) s.3
Конец алгоритма
Этот сложный алгоритм упрятан для программиста в про стае программ-не конструкции. рограмма на Рефале состоит из последовательности определений функций. Относительное расположение членов этой последовательности никакой роли не играет, и функции мо но группировать из логических или технологических соображений. Каждое описание функции в базисном Рефале имеет вид
Имя функции {Последовательность сопоставлений} Каждое сопоставление имеет вид Образец = Метавыражение;
Пример 13.1.4. Рассмотрим пример Рефал-программы.
738
ГЛАВА 13. СЕНТЕНЦИАЛЬНЫЕ МЕТОДЫ
Программа 13.1.1 Программа вычисления предиката предшествования одного символа другому в заданном алфавите
Pre_alph {
*1. Отношение рефлексивно s.1 s.1 = T;
*2. Если бук^ы различны, проверить, входит ли * первая из них в алфавит до второй
s.1 s.2 = <Before s.1 s.2 In <Alphabet>>;}
Before {
s.1 s.2 In e.A s.1 e.B s.2 e.C = T; e.Z = F;}
Alphabet {
= 'abcdefghijklmnopqrstuvwxyz';}
Строки, начинающиеся с *, служат комментариями. Последняя из функций Alphabet введена для технологичности, чтобы определение алфавита было в одном месте и его легко было изменять. Так что функция с пустым образцом может пониматься как константное выражение. In является атомом-разделителем, заведомо не встречающимся в алфавите.
Последнее из правил сопоставления в Before применимо всегда. Это гарантирует, что предикат никогда не заканчивается неудачей. Конец примера 13.1.4.
Если взаимное располо ение функций никакой роли не играет, то внутри функции располо ение сопоставлений вано. Сначала применяется первое из сопоставлений, при неудаче переходят ко второму и так далее до последнего.
Заметим, что в языке Рефал отсутствие сопоставления, конкретизацией которого является текуая область зрения, означает аварийный останов программы с выдачей текуего поля памяти и закопанных данных. о алуй, это достаточно технологичное реение, поскольку для тех, кто сам елает обрабатывать ошибки, всегда имеется возможность поместить последней строкой в определение функции правило вида e.A=Обработка ошибки;
ме тся так е встроенные функции, в частности, функции работ с числами <'+' s.Number1 s.Number2> и подобные ей.
13.1.
739
Рассмотрим связь меду языком и программным окру ением. Для запуска Рефал-программы необходимо инициализировать поле памяти. ринято, что в начале выполнения программ поле памяти имеет вид
<Go >
Таким образом, вначале применяется функция Go к пустому полю зрения. Эта функция должна быть определена в программе одним сопоставлением с пустым образцом, и не мо ет взываться никакой другой функцией. о-скольку чае всего программа долна обрабатывать имеиеся в файле исходные данные, в типичном случае описание функции Go выглядит примерно следуим образом:
$ENTRY Go { =<Prog <Open 'r' 1 'data.txt'><Get 1> >}
13.1.3. Дополнительные возможности
В нашей программе 13.1.4 алфавит определен статически. Hо из смысла алфавита видно, что эту глобальную информацию хорошо было бы иметь возможность заменять. Для хранения динамической глобальной информации (чае всего числовых характеристик либо словарей) в язке Рефал име тся стандартные функции работ со стеками закопанных даннх. ункция
Предыдущая << 1 .. 250 251 252 253 254 255 < 256 > 257 258 259 260 261 262 .. 316 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100