Давайте создадим компилятор!   ::   Креншоу Джек

Страница: 381 из 382

Мы определим процедуру NotFactor:



{–}

{ Parse and Translate a Factor with Optional «Not» }

procedure NotFactor;

begin

if Look ='!' then begin

Match('!');

Factor;

Notit;

end

else

Factor;

end;

{–}



и вызовем ее из всех мест, где мы прежде вызывали Factor, т.е. из Term, Multiply, Divide и _And. Обратите внимание на новую процедуру генерации кода:



{–}

{ Bitwise Not Primary }

procedure NotIt;

begin

EmitLn('EOR #-1,D0');

end;

{–}



Испытайте ее сейчас с несколькими простыми случаями. Фактически, попробуйте пример с исключающим или:

a&!b|!a&b

Вы должны получить код (без комментариев, конечно):

MOVE A(PC),DO ; load a

MOVE D0,-(SP) ; push it

MOVE B(PC),DO ; load b

EOR #-1,D0 ; not it

AND (SP)+,D0 ; and with a

MOVE D0,-(SP) ; push result

MOVE A(PC),DO ; load a

EOR #-1,D0 ; not it

MOVE D0,-(SP) ; push it

MOVE B(PC),DO ; load b

AND (SP)+,D0 ; and with !a

OR (SP)+,D0 ; or with first term

Это точно то, что мы хотели получить. Так что, по крайней мере, и для арифметических и для логических операторов наш новый приоритет и новый, более тонкий синтаксис, поддерживают друг друга. Даже специфическое, но допустимое выражение с ведущим addop:

~x

имеет смысл. SignedTerm игнорирует ведущий '~' как и должно быть, так как выражение эквивалентно:

0~x,

что эквивалентно x.

|< Пред. 378 379 380 381 382 След. >|

Java книги

Контакты: [email protected]