Структура и реализация макроязыков
Рефераты >> Программирование и компьютеры >> Структура и реализация макроязыков

-----------------

-----------------

END;

где <paramlist> это пе­ре­чис­ле­ние че­рез за­пя­тую всех опе­ран­дов мак­ро­са.

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

Ис­ход­ный текст  

Рас­ши­ре­ние ис­ход­но­го тек­ста

MACRO MacGoto(labelno)

SetPrevPos;

MoveToMark(labelno);

CenterFixScreenPos;

END;

.

.

.

MacGoto(1)

.

.

.

MacGoto(2)

.

.

.  

.

.

.

SetPrevPos;

MoveToMark(1);

CenterFixScreenPos;

.

.

.

SetPrevPos;

MoveToMark(2);

CenterFixScreenPos;

.

.

.

Сле­ду­ет за­ме­тить, что мак­ро­ко­ман­да мо­жет иметь и бо­лее од­но­го опе­ран­да. Ка­ж­дый опе­ранд дол­жен при этом со­от­вет­ст­во­вать фор­маль­но­му па­ра­мет­ру в стро­ке оп­ре­де­ле­ния име­ни мак­ро­са.

Рас­смот­рим сле­дую­щий при­мер:

При­мер 3:

.

.

.

ScrollScreenDown;

ScrollScreenLeft(0);

FixCursorPos;

.

.

.

ScrollScreenUp;

ScrollScreenLeft(1);

FixCursorPos;

.

.

.

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

Ис­ход­ный текст  

Рас­ши­ре­ние ис­ход­но­го тек­ста

MACRO MacMove(cmd,left)

cmd;

ScrollScreenLeft(left);

FixCursorPos;

END;

.

.

.

MacMove(ScrollScreenDown,0)

.

.

.

MacMove(ScrollScreenUp,1)

.

.

ScrollScreenDown;

ScrollScreenLeft(0);

FixCursorPos;

.

.

.

ScrollScreenUp;

ScrollScreenLeft(1);

FixCursorPos;

.

.

.

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

MacMove(cmd=ScrollScreenUp,left=1)

УС­ЛОВ­НОЕ МАК­РО­РАС­ШИ­РЕ­НИЕ

Ино­гда воз­ни­ка­ют по­треб­но­сти из­ме­нять по­ря­док команд мак­ро­рас­ши­ре­ния внут­ри мак­ро­са.

Рас­смот­рим сле­дую­щую про­грам­му:

При­мер 4:

.

.

.

ScrollScreenLeft(1);

LiteralChar('-');

.

.

.

ScrollScreenDown;

ScrollScreenLeft(2);

LiteralChar('*');

.

.

.

В этом при­ме­ре не толь­ко па­ра­мет­ры, но и ко­ли­че­ст­во ко­манд - пе­ре­мен­ная ве­ли­чи­на. Эта про­грам­ма мо­жет быть за­пи­са­на сле­дую­щим об­ра­зом:

.

.

.

MACRO Mac1(p1,left,chr)

IF p1==1 THEN

ScrollScreenDown;

ENDIF

ScrollScreenLeft(2);

LiteralChar('*');

END

.

.

.

Mac1(1,2,’-’)

.

.

.

Mac1(0,1,’*’)

.

.

.

.

.

.

ScrollScreenLeft(1);

LiteralChar('-');

.

.

.

ScrollScreenDown;

ScrollScreenLeft(2);

LiteralChar('*');

.

.

.  

Ком­би­на­ция IF .THEN .ELSE яв­ля­ет­ся мак­ро­мет­ка­ми или сим­во­ла­ми сле­до­ва­ния и не по­яв­ля­ют­ся в вы­ход­ном тек­сте мак­ро­про­цес­со­ра. В мак­ро­язы­ке так­же мо­гут быть пре­ду­смот­ре­ны псев­до­ко­ман­ды ус­лов­но­го и без­ус­лов­но­го пе­ре­хо­да на псев­до-мет­ку, с ко­то­рой мак­ро­про­цес­сор про­дол­жит об­ра­бот­ку тек­ста про­грам­мы. Точ­но так же, как и в слу­чае вы­пол­не­ния про­грам­мы, опе­ра­то­ры пе­ре­хо­дов слу­жат для ука­за­ния вы­пол­не­ния опе­ра­то­ров про­грам­мы, опе­ра­то­ры мак­ро-пе­ре­хо­дов слу­жат для ука­за­ния по­ряд­ка компиляции тек­ста про­грам­мы. Это да­ет воз­мож­ность в про­цес­се рас­ши­ре­ния по­лу­чать кон­крет­ные ва­ри­ан­ты по­сле­до­ва­тель­но­стей ко­манд, со­от­вет­ст­вую­щие дан­но­му слу­чаю при­ме­не­ния мак­ро­ко­ман­ды. Вы­пол­не­ние пе­ре­хо­дов и про­ве­рок внут­ри вы­пол­няе­мо­го ко­да уве­ли­чи­ва­ет его раз­мер и вре­мя вы­пол­не­ния, в то вре­мя, как про­вер­ка и пе­ре­хо­ды в мак­ро­сах про­ис­хо­дят на ста­дии ком­пи­ля­ции и по­это­му не тре­бу­ют за­трат вре­ме­ни при вы­пол­не­нии ко­да. Эта воз­мож­ность из­би­ра­тель­ной вы­бор­ки нуж­ных час­тей тек­ста яв­ля­ет­ся од­ним из са­мых мощ­ных средств в сис­тем­ном про­грам­ми­ро­ва­нии.

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

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

При­мер 5:

.

.

.

MACRO Mac1

SetPrevPos;

CursorCharRight;

END

.

.

.

MACRO Mac2

Mac1

Mac1

END

.

.

.

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

Ис­ход­ный текст

Рас­ши­ре­ние ис­ход­но­го тек­ста (уро­вень 1)

Рас­ши­ре­ние ис­ход­но­го тек­ста (уро­вень 2)

.

.

.

MACRO Mac1

SetPrevPos;

CursorCharRight;

END

MACRO Mac2

Mac1

Mac1

END

.

.

.

Mac2

.

.

.  

MACRO Mac2

SetPrevPos;

CursorCharRight;

SetPrevPos;

CursorCharRight;

END

Mac2

.

.

.  

SetPrevPos;

CursorCharRight;

SetPrevPos;

CursorCharRight;

.

.

.

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


Страница: