Смекни!
smekni.com

Структура и реализация макроязыков (стр. 2 из 4)

МАК­РО­ВЫ­ЗО­ВЫ ВНУТ­РИ МАК­РО­ОП­РЕ­ДЕ­ЛЕ­НИЯ

По­сколь­ку мак­ро­оп­ре­де­ле­ния яв­ля­ют­ся, по су­ти, “со­кра­ще­ния­ми” для по­сле­до­ва­тель­но­сти ко­манд, то по­лез­ным свой­ст­вом бы­ла бы воз­мож­ность про­из­во­дить та­кие “со­кра­ще­ния” внут­ри са­мих мак­ро­оп­ре­де­ле­ний.

При­мер 5:

.

.

.

MACRO Mac1

SetPrevPos;

CursorCharRight;

END

.

.

.

MACRO Mac2

Mac1

Mac1

END

.

.

.

Внут­ри мак­ро­оп­ре­де­ле­ния Mac2 два­ж­ды про­ис­хо­дит ссыл­ка на мак­ро­оп­ре­де­ле­ние Mac1. Это по­мог­ло нам умень­шить дли­ну мак­ро­оп­ре­де­ле­ния Mac2 и сде­ла­ло его бо­лее лег­ким для по­ни­ма­ния. Та­кое ис­поль­зо­ва­ние мак­ро­средств при­во­дит к мак­ро­рас­ши­ре­ни­ям на не­сколь­ких уров­нях вло­жен­но­сти, на­при­мер:


Ис­ход­ный текст Рас­ши­ре­ние ис­ход­но­го тек­ста (уро­вень 1) Рас­ши­ре­ние ис­ход­но­го тек­ста (уро­вень 2)
...MACRO Mac1 SetPrevPos; CursorCharRight;ENDMACRO Mac2 Mac1 Mac1END...Mac2... MACRO Mac2 SetPrevPos; CursorCharRight; SetPrevPos; CursorCharRight;ENDMac2... SetPrevPos;CursorCharRight;SetPrevPos;CursorCharRight;...

Мак­ро­вы­зо­вы, внут­ри мак­ро­оп­ре­де­ле­ний мо­гут вклю­чать не­сколь­ко уров­ней. На­при­мер, ко­ман­да Mac2 мог­ла бы быть вы­пол­не­на внут­ри дру­го­го мак­ро­оп­ре­де­ле­ния. Фак­ти­че­ски, та­кие сред­ст­ва, как мак­ро-пе­ре­хо­ды да­ют воз­мож­ность лю­бое чис­ло раз об­ра­щать­ся к лю­бо­му мак­ро­оп­ре­де­ле­нию, и да­же к са­мо­му се­бе. Та­кие вы­зо­вы на­зы­ва­ют­ся ре­кур­сив­ны­ми.

МАК­РО­ОП­РЕ­ДЕ­ЛЕ­НИЯ В МАК­РО­ОП­РЕ­ДЕ­ЛЕ­НИ­ЯХ

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

Не­об­хо­ди­мо, од­на­ко, по­ни­мать, что внут­рен­нее мак­ро­оп­ре­де­ле­ние не бу­дет оп­ре­де­ле­но до тех пор, по­ка не про­изой­дет вы­зов внеш­не­го мак­ро­са. Это - след­ст­вие ме­то­да реа­ли­за­ции мак­ро­оп­ре­де­ле­ний. На­при­мер, пусть поль­зо­ва­тель хо­чет оп­ре­де­лить груп­пу мак­ро­оп­ре­де­ле­ний для об­ра­ще­ния к под­про­грам­мам с по­мо­щью ка­кой-то стан­дар­ти­зи­ро­ван­ной вы­зы­ваю­щей по­сле­до­ва­тель­но­сти. При­ве­ден­ный ни­же при­мер оп­ре­де­ля­ет мак­ро­ко­ман­ду DEFINE, ко­то­рая при ука­за­нии в ка­че­ст­ве ее опе­ран­да име­ни под­про­грам­мы оп­ре­де­ля­ет со­от­вет­ст­вую­щий это­му име­ни мак­рос. От­дель­ные ге­не­ри­руе­мые мак­ро­оп­ре­де­ле­ния по­лу­ча­ют име­на свя­зан­ных с ни­ми под­про­грамм.

При­мер 6:

.

.

.

МАСRO DEFINE sub

.......

.......

MACRO sub(param)

......

......

sub(param)

......

......

END

......

......

END

Поль­зо­ва­тель мо­жет об­ра­тить­ся к это­му мак­ро­оп­ре­де­ле­нию сле­дую­щим об­ра­зом:

DEFINE(cos)

оп­ре­де­ляя та­ким об­ра­зом но­вое мак­ро­оп­ре­де­ле­ние с име­нем cos, к ко­то­ро­му впо­след­ст­вии мож­но об­ра­щать­ся сле­дую­щим об­ра­зом:

cos(х)

и мак­ро­про­цес­сор сге­не­ри­ру­ет со­от­вет­ст­вую­щую по­сле­до­ватель­ность вы­зо­ва функ­ции.


РЕА­ЛИ­ЗА­ЦИЯ

Та­ким об­ра­зом, на­ми был опи­сан ва­ри­ант реа­ли­за­ции мак­ро­язы­ка. Рас­смот­рим ме­тод реа­ли­за­ции мак­ро­язы­ка. В ка­че­ст­ве при­ме­ра возь­мем клас­си­че­ский язык мак­ро­ас­семб­ле­ра.

ПО­СТА­НОВ­КА ЗА­ДА­ЧИ

Лю­бой про­цес­сор мак­ро­ко­манд дол­жен ре­шать сле­дую­щие че­ты­ре ос­нов­ные за­да­чи:

Рас­по­зна­вать мак­ро­оп­ре­де­ле­ния. Про­цес­сор мак­ро­ко­манд дол­жен рас­по­зна­вать мак­ро­оп­ре­де­ле­ния, вы­де­ляе­мые со­от­вет­ст­вую­щи­ми псев­до­ко­ман­да­ми. В язы­ке мак­ро­ас­семб­ле­ра эти­ми псев­до­опе­ра­то­ра­ми яв­ля­ют­ся псев­до­ко­ман­ды MACRO и MEND. Эта за­да­ча мо­жет быть ус­лож­не­на тем, что внут­ри мак­ро­оп­ре­де­ле­ний мо­гут встре­чать­ся так­же дру­гие мак­ро­оп­ре­де­ле­ния. Ко­гда мак­ро­оп­ре­де­ле­ния вло­же­ны, как бы­ло про­де­мон­ст­ри­ро­ва­но вы­ше, мак­ро­про­цес­сор дол­жен пра­виль­но рас­по­зна­вать вло­же­ния и со­пос­та­вить на­ча­ло и ко­нец мак­ро­са. Весь вло­жен­ный текст, вклю­чая и дру­гие мак­ро­оп­ре­де­ле­ния оп­ре­де­ля­ет от­дель­ную мак­ро­ко­ман­ду.

За­по­ми­нать мак­ро­оп­ре­де­ле­ния. Про­цес­сор дол­жен за­пом­нить оп­ре­де­ле­ния мак­ро­ко­манд, ко­то­рые бу­дут впо­след­ст­вии ис­поль­зо­вать­ся для рас­ши­ре­ния мак­ро­вы­зо­вов

Рас­по­зна­вать вы­зо­вы. Не­об­хо­ди­мо так­же и рас­по­зна­вать мак­ро­вы­зо­вы, пред­став­лен­ные в ви­де мне­мо­ни­че­ско­го ко­да опе­ра­ции. Это пред­по­ла­га­ет, что име­на мак­ро­ко­манд об­ра­ба­ты­ва­ют­ся на тех же са­мых ос­но­ва­ни­ях, как и один из ко­дов опе­ра­ции.

Вы­пол­нять рас­ши­ре­ние мак­ро­ко­манд и под­ста­нов­ку фак­ти­че­ских па­ра­мет­ров. Вме­сто фор­маль­ных па­ра­мет­ров мак­ро­оп­ре­де­ле­ния мак­ро­про­цес­сор дол­жен под­ста­вить со­от­вет­ст­вую­щие опе­ран­ды мак­ро­ко­ман­ды. Этот текст, в свою оче­редь мо­жет со­дер­жать как мак­ро­ко­ман­ды так и мак­ро­оп­ре­де­ле­ния.

Та­ким об­ра­зом, мак­ро­про­цес­сор дол­жен рас­по­зна­вать и об­ра­ба­ты­вать мак­ро­оп­ре­де­ле­ния и мак­ро­ко­ман­ды.

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

На­при­мер, ес­ли из один из па­ра­мет­ров дол­жен быть со­еди­нен с дру­гим (macro[x,y] = xy), то воз­мо­жен син­так­сис x&y, что оз­на­ча­ет кон­ка­те­на­цию фор­маль­но­го па­ра­мет­ра x с фор­маль­ным па­ра­мет­ром y. Этот слу­чай не вы­зы­ва­ет боль­ших труд­но­стей. Го­раз­до слож­ней об­ра­ба­ты­ва­ет­ся слу­чай, ко­гда речь идет о под­ста­нов­ке па­ра­мет­ра внут­ри сим­воль­ной стро­ки. В та­ком слу­чае воз­мож­ным вы­хо­дом бу­дет кон­ка­те­на­ция по умол­ча­нию двух по­сле­до­ва­тель­но друг за дру­гом иду­щих сим­воль­ных строк, а так­же пре­об­ра­зо­ва­ние фор­маль­но­го па­ра­мет­ра, за­клю­чен­но­го в скоб­ки к сим­воль­ной стро­ке. Та­ким об­ра­зом, ес­ли мы хо­тим, что­бы в мак­ро­се фи­гу­ри­ро­ва­ла стро­ка ви­да “blablabla[x]xxxxx”, где [x] долж­но за­ме­нять­ся фор­маль­ным па­ра­мет­ром впол­не воз­мож­но за­ме­нить стро­ку та­ко­го ви­да стро­кой ти­па “blablabla”(x)”xxxxx”.

На­до за­ме­тить, что мно­же­ст­во за­ме­ча­тель­ных идей по реа­ли­за­ции по­доб­ных мак­ро­язы­ков реа­ли­зо­ва­но в язы­ке REXX, под­дер­жи­вае­мом на сис­тем­ном уров­не опе­ра­ци­он­ной сис­те­мой OS/2 ком­па­нии IBM.

Так­же для вы­пол­не­ния функ­ций ус­лов­ных пе­ре­хо­дов долж­ны вы­чис­лять­ся не­ко­то­рые ариф­ме­ти­че­ские вы­ра­же­ния (возь­мем в при­мер хо­тя бы обык­но­вен­ных счет­чик). Та­ким об­ра­зом час­то ока­зы­ва­ет­ся по­лез­ной воз­мож­ность ис­поль­зо­ва­ния псев­до-пе­ре­мен­ных вре­ме­ни ком­пи­ля­ции внут­ри мак­ро­сов.


ДВУ­ПРОС­МОТ­РО­ВЫЙ АЛ­ГО­РИТМ

Нач­нем с не­ко­то­рых уп­ро­щаю­щих пред­по­ло­же­ний. Бу­дем счи­тать, что наш мак­ро­про­цес­сор функ­цио­наль­но не­за­ви­сим от ос­нов­но­го ком­пи­ля­то­ра и его текст бу­дет пе­ре­да­вать­ся это­му ком­пи­ля­то­ру. Сна­ча­ла не раз­ре­шим мак­ро­вы­зо­вы и мак­ро­оп­ре­де­ле­ния внут­ри мак­ро­оп­ре­де­ле­ний.

Мак­ро­про­цес­сор, как и язык ас­семб­ле­ра, про­смат­ри­ва­ет и об­ра­ба­ты­ва­ет стро­ки тек­ста. Но в язы­ке все стро­ки свя­за­ны ад­ре­са­ци­ей - од­на стро­ка мо­жет ссы­лать­ся на дру­гую при по­мо­щи ад­ре­са или име­ни, ко­то­рое долж­но быть “из­вест­но” ас­семб­ле­ру. Бо­лее то­го, ад­рес присваеваемый ка­ж­дой от­дель­ной стро­ке за­ви­сит от со­дер­жи­мо­го, ко­ли­че­ст­ва и ад­ре­сов пред­ше­ст­вую­щих строк. Ес­ли рас­смат­ри­вать мак­ро­оп­ре­де­ле­ние, как еди­ный объ­ект, то мож­но ска­зать, что стро­ки на­ше­го мак­ро­оп­ре­де­ле­ния не так силь­но взаи­мо­свя­за­ны. Мак­ро­оп­ре­де­ле­ния не мо­гут ссы­лать­ся на объ­ек­ты во­вне это­го мак­ро­оп­ре­де­ле­ния. Пред­по­ло­жим, что в те­ле мак­ро­оп­ре­де­ле­ния есть стро­ка INCR X, при­чем пе­ред этой ко­ман­дой па­ра­метр Х по­лу­чил зна­че­ние 10. Мак­ро­про­цес­сор не про­из­во­дит син­так­си­че­ский ана­лиз, а про­из­во­дит про­стую тек­сто­вую под­ста­нов­ку вме­сто “Х” под­став­ля­ет­ся “10”.