В.Н. Пильщиков - Язык Плэнер (1156455), страница 22
Текст из файла (страница 22)
т. д. В случае успеха всех этих проверок 'сопоставление идентификатора с сопоставителем НАЯ считается удачным.'Но если хотя бы одна проверка окааалась неудачной, тогда НАЯ сразу прекращает свою работу, отменяет все побочные аффекты предыдущих проверок и сигнализирует о неудаче своего сопоставления. Пусть, к примеру, идентификатор СОНЯ имеет свойство с названием ТУРЕ и значением БНВВ, а также свойство с названием НАНО и значением 2. Тогда [1Я [НАЯ НАВЯ [ОТ 2]] СОНЯ] -~- () [1Я ([НАБ ТУРЕ Я(1ВВ НАНО «Н] (Е1ЯТ .Н)) (СОНЯ А В)] -+- Т, Н: — 2 2.7.
Определение новых сопоставптелей Для определения нового сопоставителя следует обратиться к встроенной функции ПЕР1НЕ: [ВЕР1НЕ у (КЛРРА гаг раз)]. Здесь а — идентификатор, имя определяемого сопоставителя, а список (КАРРА еаг раз) -овредеаающее выражение этого сопоставителя: элемент КАРРА указывает, что определяется соиоставнтель (а не функция или теорема), элемент еаг — это описание параиетрее сопоставителя, а простой образец рат — его тело.
Описание параметров сопостазителя задается так же, иак и описание параметров определяемой функций (см. $1.12). Если оаг — идентификатор, то это — имя единственного параметра сопоставителя. Обращаться и такому сопоставителю можно с любым числом аргументов, поторые должны быть формами, простымп илп сегментными; все ати аргументы будут вычислены и 1 список иа их значений будет присвоен параметру сопоставителя. Если еаг— идентификатор, помеченный звеадочиой, то у сопоставителя также один параметр и любое число аргументов, но в данном случае параметру присваивается 1 список из невычисленных аргументов.
И, наконец, оаг может иметь вид (о~ оз ... е ), ю ) О, где , о; — либо просто идентификаторы, либо идентификаторы, помеченные звездочкой. При обращении к такому сопоставителю надо аадавать ровно га аргументов, при атом если параметр о; не помечен, то ему присваиваетсн значение Ьго аргумента, который должен быть простой формой, а если помечен — присваивается сам ьй аргумент в том виде, как он задан в обращении. При обращении к сопоставителю, определенному пользователем, выполиязотся следующие действия.
Сначала, если нужно, вычисляются аргументы (все или только часть их), заданные в обращении. Затем вводятся параметры сопоставителя, и им прнсваиваются соответствующие значения. После этого осуществляется сопоставление тела сопоставителя, т. е. образца рай с анализируемым объектом (с объектом, который поставлен в соответствие данному обращепию к сояоставителю).
Параметры сопоставителя локализуются в его теле, где они рассматризаготся как обычные переменные. Если сопоставление тела сопоставителя с анализируемым объектом удачно, то считается, что сопоставитель соответствует этому объекту, неудачно — не соответствует. Определения сопоставителей'могут быть рекурсивными. В теле сопоставителей допускаются обращения к еще не определенным процедурам, однако к моменту первого ооращения к сопоставителю все эти процедуры должны быть уже определены в программе.
Проиллюстрируем скааанноо на конкретных примерах: [ПЕР!11Е МАТОМ (КАРРА () [1(ОХ [АТОМ)))) У этого сопоставителя нет параметров, поэтому обращаться к нему надо без аргументов: [КАТОМ). Сопоставитель соответствует любым выражениям, кроме атомов. действитдльно, сопоставление образца [11ЛТОМ) с любым выраясепием сводится к сопостаэлелию тела этого сопоставителя, т.
е. образца [МОХ [АТОМ)), с этим же 105 выражением, а данному образцу соответствуют только неатомы. [ПЕР?5?Е 16 (КАРРА (М?Е МАХ) [ЫБТВ [ЕТ [6Е.М?Щ [ЕЕ.МАХ]]])] Сопоставнтель ?,6 соответствует любому списку, длина которого ие меныпе М?г? и не больше МАХ. Рассмотрим, например, сопоставление [1Б [1 6 2 5] (А В С)] Выполнение сопоставителя Ь6 начинается с того, что параметру М?г? присваивается значение 2, а параметру МАХ вЂ” значение 5. Далее осуществляется сопоставление образца [1 ?ЯТВ [ЕТ [6Е,М?Щ [1Е .МАХ]]] со списком (А В С).
Оно удачно, поэтому удачным является и сопоставление образца [?6 2 5] со списком (А В С), т. е. функция 1Я вырабатывает значение Т. [??ЕР?5?Е 605?ТА?5?Б (КАРРА («Р) (< ) [РАТ .Р] < )))] Образцу [СОЕТА?5?Я ра?] соответствуют только 1 списки, причем такие, у которых хотя бы один элемент верхнего уровня соответствует образцу рад Например: [?Б [605?ТА?5?Я [?П]] (5 6 А 2)] -«Т Действительно, аначеиием параметра Р при атом обращении к сопоставителю является выралсение [?О].
Поэтому сопоставление тела сопоставителя — образца (< ) [РАТ .Р] < >) — со списком (5 6 А 2) удачно. [ПЕР?г?Е РА?.Уг?ОНОМ (КАРРА () [АСТ () [1?ЯТ 1] [БАМЕ (Х) («Х <РА?:гг?ОНОМ) .Х)]])] Данный сопоставитель соответствует 1 спискам, у которых элементы, равноудаленные от их концов, равны.
Определение сопоставителя рекурсивно: ои соответствует либо пустому 1 списку, либо 1 списку иэ одного элемента, либо 1 списку, у которого первый и последний элементы равны, а середина соответствует этому же сопоставителю. Поэтому [1Б [РА?ХХПВОМ] (А В А)] -«Т [1Б [РА? т"г?ОНОМ] ((А + В) — С вЂ” (А + В))] -«Т [1Б [РА?УР?ПНОМ] (А В С А)! -«() Рассмотрим подробнее, как осуществляется первое из этих сопоставлений.. Параметров у сопоставителя РА?Л5???ВОМ нет, поэтому сразу иачинается сопоставление его тела с анализируемым списком: [1Я [АПТ () [ЫБТ 1] [БАМЕ (Х) («Х <РА1ЛНПВОМ> .Х)]] (А В А)] Так как первый и второй образцы иа АПТ ке соответствуют списку (А В А), с этим списком сопоставляется третий образец: 1 [1Я [БАМЕ (Х) («Х'<РА1Лг(ПНОМ> .Х)] (А В А)] Первый и последний элементы анализируемого списка равиы друг другу, поэтому данное сопоставление будет удачным, если удачно сопоставление сегментного образца <РА(ЛЕОНОМ> с сегмеитом из одного элемента В, а это сопоставление, согласно правилу десегментации, сводится к сопоставлеиию [1Б [РА1ЛНПВОМ] (В)] Снова вызывается сопоставитель РА(ЛНОВОМ, ио теперь его тело сопоставляется со списком (В): [1Я [АПТ () [11БТ 1] [БАМЕ (Х) (»Х <РА1Л1<ПВОМ> .Х)]] (В)] Поскольку список (В) соответствует второму образцу из АПТ, то это сопоставление удачно.
Следовательно, удачным является и сопоставление образца [РА(ЛЕПНОМ] со списком (В), а тем самым удаяно и наше исходное сопоставление. [ОЕР1НЕ ЕТ1 (КАРРА «АВОЯ [%НЕ11 ([ВЕ [ЕМРТУ .АВОБ]]) ([РАТ [1 .АЙОЯЦ [РАТ [РОЕМ [ЕТ1 <ВЕЯТ 1 .АВОЯ>]]])])] Данный сопоставитель аналогичен встроенному сопоставителю ЕТ. При обращеиии к нему можно задавать любое количество аргументов-образцов, список из которых присваивается параметру АВОЯ. Например, при-обращении [ЕТ1 [1НТ] [6Е 1] [ЕЕ 9]] зпачением параметра станет список ([1НТ] [6Е 1] [ЕЕ 9]). Если первый иа заданных обраацов соответствует анализируемому выражению,то ЕТ1,чтобы проверить соответствие этого выражения п остальиым образцам, строит с помощью функции РОЕМ обращение к себе с остальными аргументами-обраацами (в вашем примере — это обращеиие [ЕТ1 [6Е 1] [ЬЕ 9Ц) и получившийся образец сопоставляет с авализируемым выражением.
Если список АВОБ пуст, а это признак того, что сопоставления всех 107 исходных образцов с аналианрусмым выразкеписм оказались удачными, то сопоставление ЕТ1 с выражением завершается, согласно первой клауае условного сопоставителя 1тНЕХ, удачей. с 2.8.
Пример использования сопоставителей Чтобы продемонстрировать возможности сопостазителей, опишем анализатор выражений языка лнсп, который может служить дополнением к рассмотренной в $ 1Л9 программе, преобразующей лисповские выражения в эквивалентные планерские выражения при условии, что лисп-программа записана без ошибок. При построении анализатора мы будем исходить из следующих предположений. Рассматривать будем то же подмножество лиска, что и в $ 1Л9. На вход анализатору будет подаваться последовательность выражений, составляющих связную лисппрограмму. Считаем, что файл, где записаны ати выраязения, уже открыт и является активным файлом ввода н что функции вывода настроены па печать ва АЦПУ пли терминал. Анализатор по очереди считывает выражения лисп-программы, проверяет их и о кансдой замеченной- ошибне выдает сообщение на печать. Анализатор распознает не все ошибки; ои, например, пе может обнаруншть неправильный баланс скобок или запрещенные нами точечные выражения, так как подобные конструкции недопустимы с точки зрения синтакоиса плэнера и попросту не могут быть считапы плэнерской функцией ввода.
Ошибки, которые распознает анализатор,— это неправильное количество аргументов в обращениях к лисповским функциям, обращение к неописанным функциям и т. п. В своей работе анализатор пользуется списками свойств плэперских идентификаторов, являющихся названиями лпсповскпх функций. Свойство МАКО указывает на количество аргументов у .
соответствующей функции, а свойство ТУРЕ указывает на класс фушщии — ЯПВК или РВПВК, прн этом все определяемые лиспфункции мы будем относить к классу ВОВК (напомним, что в нашем подмножестве лиепа все аргументы определяемых функций вызываются по значению). Для названий встроенных лиспфункций эти свойства задаются заранее, а для определяемых— при появлении в лксп-программе их описаний.