Анимация
JavaScript
|
Главная Библионтека 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 |