В.Н. Пильщиков - Язык Плэнер (1156455), страница 19
Текст из файла (страница 19)
Для втого она определяет тип оператора и выполняет сама (для оператора вывода и условного оператора) или с помощью других функций (для операторов перехода и присваивания) действия данного оператора. Если оператор ваписан неправильно, выдается сообщение аб ошибке и интерпретация всей программы прекращается.
[ВЕР1ХЕ СОТО (ЬАМВОА (Ь) [РКОС (В ОР Е) [СОХО ([ХОТ [1В .Ц] [ЕВВ 4 .Ц) ([1Б (!»В (.1: !»ОР) !»Е) .РВОС] [ЯЕТ ОРЯ [ВЕЕТ [ЬЕХСТН .В] .РКОС] ] ) (Т [ЕВВ 5 .Ц)] ])] Функция СОТО интерпретирует оператор перехода. Она находит в списке РВОС всех операторов интерпретируемой программы оператор, помеченный меткой Ь, и присваивает переменкой ОРБ список операторов, начиная с найденного (переменные РКОС и ОРБ являются внепшими по отношению к функции СОТО и берутся из фушщии 1ХТЕВР).
Тем самым наследующем шаге интерпретации именно втот оператор и будет выбран функцией 1ХТЕВР для выполнения. Если в операторе перехода в качестве метки указан не идентификатор или если указанной меткой не помечен ни один оператор программы, то выдается сообщение об ошибке, после чего интерпретация программы прекращается.. [СЕР!ХЕ ЕЧВ001. (ЬАМВОА (В) [РВОС (Е1 Е2) [СОХО ([1Б (!»Е! = !»Е2) .В] [ЕО [ЕУЕХР .Е(] [ЕУЕХР .Е2]]) ([1Б (!»Е! чь!»Е2) .В] [ХЕ!] [ЕЧЕХР .Е1] [ЕЧЕХР .Е2]]) (Т [ЕКВ 6 .В])] ])] Функция ЕЧВООЬ вычисляет условия в условных операторах. [ОЕР1ХЕ ЕУЕХР (ЬАМВОА (Е) [РВОС (Х) [СОХО ([1Я (»Е),Е] [СОХО ([Х!)М .Е] .Е) (Т [СЕТЧА1 .Е] ) ] ) ([АХО [1Б (»Е + «Х) .Е] [ХСМ .Х]] [+ [СЕТЧАЬ .Е) .Х]) (Т [ЕВВ 7 .Е])] ])] Функция ЕЧЕХР вычисляет значения выражений интерпретируемой программы.
Отметим, что выражения подаются на вход функции в виде 1 списков. Следующие две функции предназначены для работы со списком АЬ, где хранятся переменные интерпретируемой программы и их текущие значения. Функция ОЕТЧАЬ находит текущее аначенпе укааанной переменнон, а функция РПТЧАЬ заменяетпрежкее значение па новос. В этих функциях учитывается возможность следующих ошибок: в качестве имени переменной указан не идентификатор; указанной переменной иет в списке А1.; запрашивается значение переменной в тот момент, когда она его не имеет.
[ПЕР)ХЕ ОЕТЧАЬ (ЬАМВПА (Ч) [РВОО (Б ЧАЬ) [СОХО ([ХОТ [1П .Ч]] [ЕВВ 2 .Ч]) ([13 (!»Б ( Ч»ЧАЬ) !«3) .А1! [СОХО (ЧАЬ) (Т [ЕВВ 9 .Ч])]) (Т [ЕВВ 8 Ч])] ])] [ПЕР1ХЕ РПТЧАЬ'(ЬАМВПА (Ч ЧАЬ) [РВОО (В Е Х) [СОХО ([ХОТ [1П .Ч]] [ЕВВ 2 Ч]) ([13 (!»В ( Ч «Х) !»Е) .АЬ] [БЕТ А1, (ЬВ ( Ч .ЧАЬ) !.Е)]) (Т [ЕВВ 8 Ч])] ])] И, нжгонец, последняя функция интерпретатора — зто функция ЕВВ, которая реагирует на ошибки, встретившиеся в интерпретируемой программе.,Данная функция по номеру ошибки выдает на печать название ошибки и фрагмент программы, вкотором была обнаружена ошибка, после чего осущеотвляет выход из функции 1ХТЕВР (со вначением АВЕХП), т е. прекращает работу интерпретатора. [ПЕР1ХЕ ЕВВ (ЬАМВПА (Х Р) [00 [МРВ1ХТ СХ:ЕВВОВБ>: (.Р] [ЕХ1Т АВЕХП 1ХТЕВР]])] Названия-ошибок перечислены в списке, являющемся значением константы ЕВВОВБ.
Определение этой константы также входит в описание интерпретатора. [СБЕТ ЕВВОВБ ((НЕТ ОПИСАНИЯ) (ИМЯ ПЕРЕМЕННОИ вЂ” НЕ ИДЕНТИФИКАТОР) (НЕПРАВИЛЬНЫИ ОПЕРАТОР) (МЕТКА — НЕ ИДЕНТИФИКАТОР) (НЕОПИСАННАЯ МЕТКА) (НЕПРАВИЛЬНОЕ УСЛОВИЕ) (НЕПРАВИЛЬНОЕ ВЫРАЯ(ЕНИЕ) (НЕОПИСАННАЯ ПЕРЕМЕННАЯ) (ПЕРЕМЕННАЯ ВЕЗ ЗНАЧЕНИЯ))] Запуск интерпретатора осуществляется обращением; [1НТЕВР ртсб] где ртсб — программа, которую надо провнтерпретировать. 2.5.
Сопоетанители Хотя рассмотренные в предыдущих параграфах образцы и предоставляют польэователю весьма богатые воэможности для аналнэа данных, во многих случаях их все же недостаточно. Например, нельэя построить обрааец, с помоптью которого можно было бы проверить, нвляется ли анализируемое выражение Е списком, первый элемент которого — атом (любой). Правда, такой аналиа можно провести, испольэуя обраэцы и функции: [АР]В [1Б [»Х 1»У) .Е] [АТОМ .Х)] однако с помощью только одних обраацов атот анализ провести пельэя. Введение в яэык сопоставителей как раэ и обусловлено стремлением расширить воэможности обраэцов так, чтобы в виде обраэцов можно было описать любое правило аналиэа данных.
Соиостаеители — это особый класс процедур, обращаться к которым можно только в образцах. Синтаксически обращения к сопоставителям записываются так же, как и обращения к функциям: простое обращение к сопостаеителю с именем б н аргументами аг задается в виде Р-списка [б а, аг .. аг] а сегментное обращение к соиостаеителю — в виде Я-списка: (б а~ аг ...
аг) Как и в случае функций, при обращении к сопоставителю раэрешается в качестве первого элемента списка-обращения укаэывать .-переменную или :-переменную. В этих ситуациях имя сопоставителя, к которому происходит обращение, аадается аначением данной переменной или константы, которое обяаано быть идентификатором. Однако в отличие от функций сопоставители не вырабатывают никаких значений.'Выполнение сопоставителя заключается в проверке, обладает лн объект, с которым он сопоставляется, определенным свойством нли нет.
При простом обращении сопоставитель сопоставляется с одним выраясением, при сегментном — с последовательностью выражений. Если проверяемое выражение или сегмент обладает нужным свойством, сопоставление этого объекта. с сопоставителем считается удачным, не обладает †неудачн, 92 Каждый сопоставитель проверяет есвоез свойство, Например, в языке имеется сопостэвитель АТОМ без аргументов, который проверяет свойство «быть атомомк Поэтому простое обращение к атому сопоставителю, т. е. образец [АТОМ], соответствует только атомам: [1Я [АТОМ] А] -з Т [1Я [АТОМ] (АЦ -~ ( ) [1Б ([АТОМ] (еХ) (А В СЦ -~ Т, Х; (В С) (Отметим, что в последнем примере использован образец, позволяющий провести анализ, о котором шла речь в начале параграфа.) Другой пример — сопоставнтель [ЫЯТ 2], который соответствует любому 1 списку из двух элементов: [1Я [ЫЯТ 2] (А ВЦ -~ Т [1Б (»Х.[ЫБТ 2]) '(А (ВЦ] -~ () Сегментный вариант обращения к этому сопоставителю соответ- ствует любому сегменту из двух элементов: [1Я (А (1.|БТ 2> Р) (А В С РЦ -~- Т В общем случае свойства, которые проверяют сопоставители, зависят от некоторых параметров.
Аргументы в обращениях к сопоставителям как раз и задают конкретные значения этих параметров. Так, сопоставитель ЫБТ в общем случае проверяет свойство «быть 1 спискомз, а его аргумент уточняет данное свойство, накладывая ограничение на длину списка. Например, образец [ЫЯТ 5] соответствует только 1 спискам из пяти алементов, а образец [В1БТ 0] — только пустому списку (). Кроме сопоставителей, проверяющих свойства, в языке есть сопоставители, которые пааволяют задавать различные комбинации обраацов. К примеру, сопоставитель АУТ, аргументами которого являготся образцы, определяет «дизъюнкцию» зтих обраацов: он соответствует любому объекту, который соответствует хотя бы одному из его аргументов-образцов. В частности, образец [АОТ () [ЫБТ 2]] соответствует как пустому списку (), так и любому 1 списку из двух элементов, а обрааец [АУТ + У(] соответствует атому +, или атому —, или атому )(.
На сопоставители распространяются все иравнла сопоставления образцов с выражениями, рассмотренные нами в предыдущих параграфах. Так, выполнение процедуры-сопоставителя может сопрововождаться побочными эффектамп; например, во время сопоставления [1Я [АОТ [АТОМ] (А еХ)] (А В)] -~- Т переменная Х получит значение В. Но как и раньше, такие побочные эффекты сохраняют свою силу только в случае удачного исхода сопоставления в целом.
Поэтому при неудачных сопоставлениях [1Я [АОТ («Х + 0) (О + «Х)] (Π— 2)] [1Я ([А[ЛТ [АТОМ] ( 1 «Х)] 1~,Х) (( 1 А) Д В)] переменная Х не изменит своего значения, хотя в процессе сопоставления ей и присваивалось (условно) эначение 0 в первом примере илп значение А во втором примере. На сопоставители распространяется и правило, которое гласит, что иэ всех возможных вариантов удачного сопоставления обраэца с выран<ением всегда рассыатривается только один (первый) вариант. Например,при сопоставлении [!Я [А()Т (А + «Х) («Х + В)] (А + В)] учитывается только вариант удачного сопоставления первого аргумента-образца со спискам (А + В), а вариант удачного сопоставления обраэца («Х + В) с этим списком уже не рассматривается.
Поэтому после сопоставления переменная Х будет иметь аначение В. И, наконец, на сопоставители распространяется правило десегментации: сегментное обращение к сопоставителю соответствует последовательности выражений тогда и только тогда, когда 1 список иэ этих элементов соответствует простому обращению к данному сопоставителю. Например, обрааец <1.1ЯТ 3> соответствует сегменту А В С, поскольку образец [1.1ЯТ 3] соответствует списку (А В С).