Анимация
JavaScript


Главная  Библионтека 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 [ 44 ] 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97

procedure Multiply; begin

Match(*);

Factor;

PopMul; end;

{ Recognize and Translate a Divide }

procedure Divide;

begin

MatchC/);

Factor;

PopDiv; end;

{ Common Code Used by Term and FirstTerm }

procedure Term1;

begin

while IsMulop(Look) do begin Push;

case Look of

*: Multiply; /: Divide; end; end; end;

{ Parse and Translate a Math Term }

procedure Term;

begin

Factor;

Term1; end;

{ Parse and Translate a Leading Term }

procedure FirstTerm;

begin

FirstFactor;

Term1; end;

{ Recognize and Translate an Add }

procedure Add;

begin

Match(+);

Term;

PopAdd; end;



procedure Subtract; begin

Match(-);

Term;

PopSub; end;

{ Parse and Translate an Expression }

procedure Expression;

begin

FirstTerm;

while IsAddop(Look) do begin Push;

case Look of

+: Add;

Subtract;

end; end; end;

{ Parse and Translate an Assignment Statement } procedure Assignment; var Name: char; begin

Name := GetName;

Match(=);

Expression;

Store(Name); end;

ОК, если вы вставили весь этот код, тогда откомпилируйте и проверьте его. Вы должны увидеть приемлемо выглядящий код, представляющий собой законченную программу, которая будет ассемблироваться и выполняться. У нас есть компилятор!

БУЛЕВА ЛОГИКА

Следующий шаг также должен быть вам знаком. Мы должны добавить булевы выражения и операторы отношений. Снова, так как мы работали с ними не один раз, я не буду подробно разбирать их за исключением моментов, в которых они отличаются от того, что мы делали прежде. Снова, мы не будем просто копировать их из других файлов потому что я немного изменил некоторые вещи. Большинство изменений просто включают изоляцию машинозависимых частей как мы делали для арифметических операций. Я также несколько изменил процедуру NotFactor для соответствия структуре FirstFactor. Наконец я исправил ошибку в объектном коде для операторов отношений: в инструкции Scc я использовал только младшие 8 бит D0. Нам нужно установить логическую истину для всех 16 битов поэтому я добавил инструкцию для изменения младшего байта.

Для начала нам понадобятся несколько подпрограмм распознавания:

{ Recognize a Boolean Orop }



function IsOrop(c: char): boolean; begin

IsOrop := c in [, -]; end;

{ Recognize a Relop }

function IsRelop(c: char): boolean;

begin

IsRelop := c in [=, #, <, >]; end;

Также нам понадобятся несколько подпрограмм генерации кода:

{ Complement the Primary Register }

procedure NotIt;

begin

EmitLnCNOT D0); end;

{ AND Top of Stack with Primary }

procedure PopAnd;

begin

EmitLn(AND (SP)+,D0); end;

{ OR Top of Stack with Primary }

procedure PopOr;

begin

EmitLnCOR (SP) + ,D0); end;

{ XOR Top of Stack with Primary }

procedure PopXor;

begin

EmitLn(EOR (SP)+,D0); end;

{ Compare Top of Stack with Primary }

procedure PopCompare;

begin

EmitLnCCMP (SP)+,D0); end;

{ Set D0 If Compare was = } procedure SetEqual; begin

EmitLnCSEQ D0);

EmitLnCEXT D0); end;



0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 [ 44 ] 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97