Макропроцессор общего назначения РМ 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Макропроцессор общего назначения РМ



В этом разделе мы дадим краткое описание макропроцессора общего назначения, имеющего имя РМ (Pattern Matching). Более подробное описание этой системы имеется в Сасс [1979].

Макроопределения и предложения макроинициализации макропроцессора РМ существенно отличаются от рассмотренных ранее. Средства записи макрошаблонов (макропрототипов), со ответствующие по назначению заголовкам макроопределений, имеют множество различных вариантов. Некоторые части шаблона могут быть вообще опущены; могут содержать набор альтернативных конструкций; могут повторяться столько раз, сколько необходимо. Процесс макрогенерации инициализируется при совпадении макрошаблона с некоторым фрагментом входного текста. Предложение макроинициализации (и даже его отдельные аргументы) может быть записано в нескольких строках исходного файла. Язык записи тел макроопределений похож на Алгол.

Макропроцессор допускает определение пользователем локальных и глобальных меток периода макрогенерации. Имеются также системные переменные периода макрогенерации, аналогичные тем, с которыми мы встречались при анализе макропро цессора System/370. Одна из таких системных переменных является счетчиком количества обработанных предложений макроинициализации. Значение этой переменной может быть использовано для генерации уникальных меток. Допустимы также предложения условной макрогенерации, которые функционально (но не по способу записи) близки к условным предложениям макроязыка УУМ.

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

Оператор сору в РМ является обобщением идеи текстовой константыт. е. порции информации входного текста, которая должна быть непосредственно скопирована в выходной текст без анализа макропроцессором. Пользователь имеет возможность определить синтаксис оператора сору. Символы или лексемы, определяющие начало и конец копируемого куска текста, могут быть изменены в выходном файле. В дополнение к операторам skip и сору макропроцессор РМ имеет средства описания количества открывающихся и закрывающихся скобок, лексем, состоящих из нескольких символов, правила записи одного предложения на нескольких строках, а также средства обработки пробелов и признака "конец строки".

На рис. 4.14 изображен пример макроопределения и предложения макроннициализации для макропроцессора РМ. Макроопределение на рис. 4.14а разработано для использования с языком Фортран. Предложение макроиинциализации по форме похоже на алгольное предложение for; выходной текст имеет формат Фортрана. Строка 1 определяет шаблон предложения макроинициализации: ключевое слово for, за которым следует параметр id, за которым следует ключевое слово from и т.д. Предложение, заключенное в скобки, определяет альтернативные варианты построения предложения макроиницпализации. Выражение в скобках может либо быть пустым (обозначено символом /), либо содержать конструкцию by. Таким образом, в предложении макроинициализации конструкция by может либо содержаться, либо быть опущена. Спецификация noneg, следующая за параметром body, определяет, что пробелы и символы "конец строки" являются значимыми (т. е. не должны игнорироваться) при обработке

1 macro 'for' id 'from' f ('by' b I /) 'to' t 'do' body:noneg 'od'

2 begin

3 <%id = %f

4 %snum IF (%id.GT. %t) GO TO %(snum+1)

5 %Ьоdi

6 %id = %id+>;

7 if b >< '' then <(%b)> else <i> fi;

8 <%/GО TO %snum

9 %(sunm+1) CONTINUE %/>;

10 snum: = snum+2;

11 end

а

 

for I from 0 to n-1

do

S: = S + A(I)

оd

б

 

I = 0

9000 IF (I.GT. N-l) GO TO 9001

S = S + A(I)

I = I + 1

GO TO 9000

9001 CONTINUE

в

 

Рис.4.14. Примеры макроопределения и макрорасширений для макропроцессора РМ.

 

значений макроаргументов.

Тело макроопределения записано в алгольном стиле в строках 2-11. Текст, который должен появиться в макрорасширении, заключен в угловые скобки. В строках 3-6 содержатся четыре строки выходного текста. Внутри выходного текста символ % используется для выделения параметров и имен переменных периода макрогенерации. Так, например, строка 3 говорит о том, что в выходной файл должно быть переписано id, за которым следует знак равенства, за которым следует значение параметра f. Далее строка кончается. Конец строки входного текста порождает конец строки и в выходном тексте. Предполагается, что переменной периода макрогенерации snum ранее уже присвоено начальное значение 9000. Эта переменная используется для генерации меток предложений Фортрана. В результате обработки строки 7 в выходном тексте появится либо значение параметра b, либо 1 в зависимости от того, был ли задан аргумент, соответствующий параметру b. Его значение окажется на той же строке, которая начала образовываться при обработке строки 6 макроопределения. Символы %/которыми начинается строка 8, означают конец строки. Таким образомпредложение GOTO будет расположено в отдельной строке. Оператор присваивания в строке 10 увеличивает значение переменной snum периода макрогенерации таким образом, что в следующем макрорасширении метки оператора Фортрана не будут совпадать с ранее сгенерированными.

На рис. 4.14б изображено предложение, которое будет обработано как предложение макроинициализации только что описанного макроопределения. На рис. 4.14в приведен сгенерированный текст. (Детали, определяющие формат выходных фортрановских строк, опущены.) Предполагаетсячто было определено соответствующее макроопределение, заменяющее символы:= на символ = в операторе присваивания S:=S+A(I). Подробно проанализируйте этот пример, чтобы лучше понять процессы макроинициализации и макрогенерации, реализованные в макропроцессоре РМ.

Упражнения

Раздел 4.1

1. Примените приведенный на рис. 4.5 алгоритм для обработки исходной программы на рис. 4.1. Результат должен совпасть с изображенным на рис. 4.2.

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

3. Предположим, мы хотим видеть макроопределения внутри ассемблерного листинга. Каким образом макропроцессор и ассемблер могут это реализовать?

4. В большинстве случаев фрагменты комментариев не должны заменяться на значения макроаргументов, даже если они и совпадают с именами макропараметров. Каким образом можно предотвратить замену параметров внутри комментариев?

5. На основании чего программист должен принять решение о реализации некоторой конкретной логической функции с помощью подпрограммы или макроопределения?

6. Напишите алгоритм работы двухпросмотрового макропроцессоракоторый при первом просмотре обрабатывает все макроопределения, а на втором - предложения макроинициализации. Можно считать, что вложенные друг в друга макроопределения запрещены и внутри макроопределений не могут встречаться предложения макроипициализации.

7. Модифицируйте приведенный на рис. 4.5 алгоритм таким образомчтобы макропроцессор брал нe описанное программистом макроопределение из библиотеки.

8. Предложите некоторый способ работы с таблицами DEFTAB и NAMTAB.

9. Предположим, что вхождения макропарамегров в таблице DEFTAB не заменены соответствующими позиционными обозначениями?n. Какие изменения это потребует в алгоритме работы макропроцессора на рис. 4.5?

Раздел 4.2

1. Макроопределение на рис. 4.1 содержит несколько предложений, в которых макропараметры сконкатенированы с другими символами (напримерстроки 50 и 75). Почему в этих предложениях нет необходимости использовать оператор конкатенации?

2. Модифицируйте приведенный на рис. 4.5 алгоритм так, чтобы он обрабатырал операторы конкатенации.

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

4. Предположим, что мы хотим использовать метки внутри текста макрорасширения, не требуя, чтобы они имели какую-либо специальную форму (например, начинались символом %). Каждая такая метка предполагается описанной только внутри соответствующего макрорасширения, что исключает проблему дважды определенных меток. Каким образом макропроцессор и ассемблер должны взаимодействовать для обеспечения такой возможности?

5. В чем заключается наиболее существенное различие между следующими фрагментами:

а) LDA ALPHA

СОМP #0

JEQ SKIP

LDA #З

STA BETA

SKIP...

б) IF (&ALPHA NE 0)

&BETA SET 3

ENDIF

6. Получите макрорасширения следующих двух предложений макроинициализации, используя макроопределения, приведенные на рис. 4.8

а) RDBUFF F1,BUFFER,LENGTH,00,1024

б) LOOP RDBUFF F2,BUFFER,LTH

7. Модифицируйте приведенный на рис. 4.5 алгоритм так, чтобы допустить использование операторов присваивания и конструкций IF-ELSE-ENDIF периода макрогенерации. Можно считать, что вложенные конструкции IF отсутствуют.

8. Дополните свой ответ к упр. 7 так, чтобы допустить наличие вложенных предложений IF.

9. В чем наиболее существенная разница между следующими двумя фрагментами: а) LDT #8

CLEAR X

LOOP

.

.

.

TIXR T

JLT LOOP

б) &CTR SET 0

WHILE (&CTR LT 8)

.

.

.

&CTR SET &CTR+1

ENDW

10. Используя макроопределения на рис. 4.9а. получите текст макрорасширении для следующих предложений макроинициализации:

а) RDBUFF F1,BUFFER,LENGTH,(04,12)

б) LABEL RDBUFF F1,BUFFER,LENGTH,00

в) RDBUFF F1,BUFFER,LENGTH

Какое значение будет иметь функция %NITEMS(&EOR) в последних двух случаях?

11. Дополните свой ответ к упр. 7 так, чтобы включить предложение WHILE. Можете не заботиться о вложенных конструкциях WHILE.

12. Дополните свой ответ к упр. 11 так, чтобы допустить вложенные конструкции WHILE.

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

14. Модифицируйте приведенный на рис. 4.5 алгоритм с тем, чтобы включить в него обработку ключевых параметров макроопределений.

15. Некоторые макропроцессоры допускают использование предложений макроинициализации, в которых одни параметры являются ключевыми, а другие - позиционными. Каким образом макропроцессор может обработать такого рода предложения макроинициализации?

16. Каким образом можно было бы задать значения по умолчанию для позиционных параметров? Какие изменения в алгоритме на рис. 4.5 пришлось бы сделать для введения такой возможности?

17. Вспомним макроопределение RDBUFF на рис. 4.8а. Каждое из нижеследующих предложений макроииициализапии этого макроопределения содержит ошибку. Какие из этих ошибок будут выявлены макропроцессором, а какие - ассемблером? а) RDBUFF F3,BUF,RECL,ZZ

(неправильное значение для &EOF)

б) RDBUFF F3,BUF,RECL,04,2048,01

(слишком много аргументов)

в) RDBUFF F3,,RECL,04

(не определено значение для &BUFADR)

г) RDBUFF F3,RECL,BUF

(неправильный порядок аргументов)

 

Раздел 4.3

1. Предположим, что макропроцессор с логикой работы, аналогичной изображенной на рис. 4.5, должен обеспечивать рекурсивную макрогенерацию. При обсуждении было выявлено, что значения переменной EXPANDING и ARGTAB должны запоминаться при рекурсивных вызовах процедуры EXPAND. Какие другие значения также необходимо запоминать для разных способов реализации алгоритма?

2. Каким образом рекурсивный макропроцессор может быть реализован на языке макропроцессора?

3. Можно ли в нерекурсивном макропроцессоре допустить появление предложений макроипициализацпй внутри макроопределений? Каковы будут преимущества и недостатки такого подхода?

4. Выберите два знакомых вам языка программирования высокого уровня. Какие особенности этих языков будут существенны при реализации макропроцессора для них?

5. Выберите какой-либо знакомый вам язык высокого уровня и язык ассемблера. Какие особенности этих двух языков будут существенны для реализации макропроцессора для них?

6. Опишите алгоритм взаимодействия макропроцессора, реализующего режим "строка в строку", с ассемблером.

7. Перечислите вспомогательные функции и процедуры, которые могли бы быть общими для ассемблера и встроенного макропроцессора.

 



Поделиться:


Последнее изменение этой страницы: 2017-02-17; просмотров: 124; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.146.221.204 (0.071 с.)