Анимация
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

end; Factor; if s then

EmitLnCNEG D0);

end;

{ Recognize and Translate a Multiply }

procedure Multiply;

begin

MatchC*);

Factor;

EmitLnCMULS (SP) + ,D0); end;

{ Recognize and Translate a Divide }

procedure Divide;

begin

MatchC/);

Factor;

EmitLnCMOVE (SP) + ,D1); EmitLnCEXS.L D0); EmitLnCDIVS D1,D0); end;

{ Completion of Term Processing (called by Term and FirstTerm }

procedure Term1;

begin

while IsMulop(Look) do begin EmitLnCMOVE D0,-(SP)); case Look of

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

{ Parse and Translate a Math Term }

procedure Term;

begin

Factor;

Term1; end;

{ Parse and Translate a Math Term with Possible Leading Sign }

procedure FirstTerm;

begin

SignedFactor;

Term1; end;

{ Recognize and Translate an Add }

procedure Add;

begin

Match(+);

Term;

EmitLnCADD (SP)+,D0); end;



{ Recognize and Translate a Subtract }

procedure Subtract;

begin

MatchC-);

Term;

EmitLnCSUB (SP)+,D0); EmitLnCNEG DO); end;

{ Parse and Translate an Expression }

procedure Expression;

begin

FirstTerm;

while IsAddop(Look) do begin EmitLnCMOVE D0,-(SP)); case Look of

+: Add;

-: Subtract;

end; end; end;

{ Parse and Translate a Boolean Condition } { This version is a dummy } Procedure Condition; begin

EmitLn(Condition); end;

{ Recognize and Translate an IF Construct }

procedure Block; Forward;

procedure DoIf;

var L1, L2: string;

begin

Condition;

L1 := NewLabel;

L2 := L1;

EmitLnCBEQ + L1);

Block;

if Token = l then begin

L2 := NewLabel;

EmitLn(BRA + L2);

PostLabel(L1); Block; end;

PostLabel(L2);

MatchString(ENDIF); end;

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

Name := Value;

Match(=);

Expression;

EmitLnCLEA + Name + (PC),A0);



EmitLnCMOVE D0,(A0)); end;

{ Recognize and Translate a Statement Block } procedure Block; begin Scan;

while not (Token in [e, 4]) do begin case Token of i: DoIf; else Assignment; end; Scan; end; end;

{ Parse and Translate a Program } procedure DoProgram; begin Block;

MatchString(END); EmitLnCEND) end;

{ Initialize } procedure Init; begin

LCount := 0;

GetChar; end;

{ Main Program } begin

Init;

DoProgram; 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