Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π”Π°Π²Π°ΠΉΡ‚Π΅ создадим компилятор!Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 32

Автор Π”ΠΆΠ΅ΠΊ ΠšΡ€Π΅Π½ΡˆΠΎΡƒ

procedure Block; Forward;

procedure DoIf;

var L1, L2: string;

begin

BoolExpression;

L1 := NewLabel;

L2 := L1;

BranchFalse(L1);

Block;

if Token = 'l' then begin

L2 := NewLabel;

Branch(L2);

PostLabel(L1);

Block;

end;

PostLabel(L2);

MatchString('ENDIF');

end;

{–}

{ Parse and Translate a WHILE Statement }

procedure DoWhile;

var L1, L2: string;

begin

L1 := NewLabel;

L2 := NewLabel;

PostLabel(L1);

BoolExpression;

BranchFalse(L2);

Block;

MatchString('ENDWHILE');

Branch(L1);

PostLabel(L2);

end;

{–}

{ Parse and Translate a Block of Statements }

procedure Block;

begin

Scan;

while not(Token in ['e', 'l']) do begin

case Token of

'i': DoIf;

'w': DoWhile;

else Assignment;

end;

Scan;

end;

end;

{–}

{ Parse and Translate Global Declarations }

procedure TopDecls;

begin

Scan;

while Token <> 'b' do begin

case Token of

'v': Decl;

else Abort('Unrecognized Keyword ' + Value);

end;

Scan;

end;

end;

{–}

{ Parse and Translate a Main Program }

procedure Main;

begin

MatchString('BEGIN');

Prolog;

Block;

MatchString('END');

Epilog;

end;

{–}

{ Parse and Translate a Program }

procedure Prog;

begin

MatchString('PROGRAM');

Header;

TopDecls;

Main;

Match('.');

end;

{–}

{ Initialize }

procedure Init;

var i: char;

begin

for i := 'A' to 'Z' do

ST[i] := ' ';

GetChar;

Scan;

end;

{–}

Π­Ρ‚ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ. Если всС измСнСния сдСланы ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ, Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ выглядят ΠΊΠ°ΠΊ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. (Если Π²Ρ‹ Π½Π΅ сдСлали всСх ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ, Π½Π΅ ΠΎΡ‚Ρ‡Π°ΠΈΠ²Π°ΠΉΡ‚Π΅ΡΡŒ. ΠŸΠΎΠ»Π½Ρ‹ΠΉ листинг ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΡ‹ Π΄Π°Π½ Π½ΠΈΠΆΠ΅.)

Π Π°Π±ΠΎΡ‚Π°Π΅Ρ‚? Если Π΄Π°, Ρ‚ΠΎ ΠΌΡ‹ ΠΏΠΎΡ‡Ρ‚ΠΈ Π΄ΠΎΠΌΠ°. ЀактичСски, с нСсколькими нСбольшими ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡΠΌΠΈ, ΠΌΡ‹ ΡƒΠΆΠ΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ компилятор, ΠΏΡ€ΠΈΠ³ΠΎΠ΄Π½Ρ‹ΠΉ для использования. Π˜ΠΌΠ΅ΡŽΡ‚ΡΡ Π΅Ρ‰Π΅ нСсколько областСй, Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰ΠΈΡ… ΡƒΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½ΡΡ‚Π²ΠΎΠ²Π°Π½ΠΈΡ.

ΠœΠ½ΠΎΠ³ΠΎΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹Π΅ ΠΈΠΌΠ΅Π½Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…

Одна ΠΈΠ· Π½ΠΈΡ… – ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅, Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰Π΅Π΅ использования ΠΎΠ΄Π½ΠΎΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹Ρ… ΠΈΠΌΠ΅Π½ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…. Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹Π΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова, это ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ ΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹ΠΌ ΠΈ Π½Π΅Π½ΡƒΠΆΠ½Ρ‹ΠΌ. И Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ это Ρ‚Π°ΠΊ. Π’ основном, СдинствСнноС Π΅Π³ΠΎ достоинство Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ позволяСт ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½ΠΎ ΠΏΡ€ΠΎΡΡ‚ΡƒΡŽ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ². Но это просто удобство для создатСлСй компиляторов ΠΈ ΠΎΠ½ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ΅Π½ΠΎ.

ΠœΡ‹ ΡƒΠΆΠ΅ Π΄Π΅Π»Π°Π»ΠΈ этот шаг ΠΏΡ€Π΅ΠΆΠ΄Π΅. На этот Ρ€Π°Π·, ΠΊΠ°ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ, я сдСлаю это Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎ-Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ. Π― Π΄ΡƒΠΌΠ°ΡŽ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄, ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½Π½Ρ‹ΠΉ здСсь, сохранит простоту Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ, насколько это Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ.

ЕстСствСнным ΠΏΡƒΡ‚Π΅ΠΌ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² Π½Π° Pascal являСтся объявлСниС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Ρ‚ΠΈΠΏΠ° запись ΠΈ созданиС Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² ΠΊΠ°ΠΊ массива Ρ‚Π°ΠΊΠΈΡ… записСй. Π—Π΄Π΅ΡΡŒ, ΠΎΠ΄Π½Π°ΠΊΠΎ, Π½Π°ΠΌ Π² Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΏΠΎΠΊΠ° Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ»Π΅ Ρ‚ΠΈΠΏΠ° (сущСствуСт ΠΏΠΎΠΊΠ° Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ), Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ Π½ΡƒΠΆΠ΅Π½ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ массив символов. Π­Ρ‚ΠΎ ΠΈΠΌΠ΅Π΅Ρ‚ своС прСимущСство, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ Lookup для поиска Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² Ρ‚Π°ΠΊΠΆΠ΅ ΠΊΠ°ΠΊ ΠΈ Π² спискС ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… слов. ΠžΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ΡΡ, Π΄Π°ΠΆΠ΅ ΠΊΠΎΠ³Π΄Π° Π½Π°ΠΌ Π½ΡƒΠΆΠ½Ρ‹ большС ΠΏΠΎΠ»Π΅ΠΉ, ΠΌΡ‹ всС Ρ€Π°Π²Π½ΠΎ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΡ‚ ΠΆΠ΅ самый ΠΏΠΎΠ΄Ρ…ΠΎΠ΄, просто сохраняя Π΄Ρ€ΡƒΠ³ΠΈΠ΅ поля Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… массивах.

Π’ΠΎΡ‚ измСнСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ. Π‘ΠΏΠ΅Ρ€Π²Π° Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Π½ΠΎΠ²ΡƒΡŽ Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ константу:

NEntry: integer = 0;

Π—Π°Ρ‚Π΅ΠΌ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½ΠΈΠΆΠ΅:

const MaxEntry = 100;

var ST : array[1..MaxEntry] of Symbol;

(ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ST Π½Π΅ объявлСн ΠΊΠ°ΠΊ SymTab. Π­Ρ‚ΠΎ объявлСниС Π»ΠΈΠΏΠΎΠ²ΠΎΠ΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Lookup Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ. SymTab заняля Π±Ρ‹ слишком ΠΌΠ½ΠΎΠ³ΠΎ памяти ΠΈ поэтому фактичСски Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΠΎΠ±ΡŒΡΠ²Π»ΡΠ΅Ρ‚ΡΡ).

Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ InTable.

{–}

{ Look for Symbol in Table }

function InTable(n: Symbol): Boolean;

begin

InTable := Lookup(@ST, n, MaxEntry) <> 0;

end;

{–}

Нам Ρ‚Π°ΠΊΠΆΠ΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠ° новая ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° AddEntry, которая добавляСт Π½ΠΎΠ²Ρ‹ΠΉ элСмСнт Π² Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ:

{–}

{ Add a New Entry to Symbol Table }

procedure AddEntry(N: Symbol; T: char);

begin

if InTable(N) then Abort('Duplicate Identifier ' + N);

if NEntry = MaxEntry then Abort('Symbol Table Full');

Inc(NEntry);

ST[NEntry] := N;

SType[NEntry] := T;

end;

{–}

Π­Ρ‚Π° ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° вызываСтся ΠΈΠ· Alloc:

{–}

{ Allocate Storage for a Variable }

procedure Alloc(N: Symbol);

begin

if InTable(N) then Abort('Duplicate Variable Name ' + N);

AddEntry(N, 'v');

.

.

.

{–}

НаконСц, ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ всС ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π² настоящСС врСмя ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ ΠΈΠΌΠ΅Π½Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΊΠ°ΠΊ ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½Ρ‹ΠΉ символ. Они Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ LoadVar ΠΈ Store (просто ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚Π΅ Ρ‚ΠΈΠΏ с char Π½Π° string) ΠΈ Factor, Assignment ΠΈ Decl (просто ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚Π΅ Value[1] Π½Π° Value).

ПослСдняя Π²Π΅Ρ‰ΡŒ: ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ Init для очистки массива ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½ΠΈΠΆΠ΅:

{–}

{ Initialize }

procedure Init;

var i: integer;

begin

for i := 1 to MaxEntry do begin

ST[i] := '';

SType[i] := ' ';

end;

GetChar;

Scan;

end;

{–}

Π­Ρ‚ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ. Π˜ΡΠΏΡ‹Ρ‚Π°ΠΉΡ‚Π΅ Π΅Π΅ ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹Π΅ ΠΈΠΌΠ΅Π½Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ….

Π‘Π½ΠΎΠ²Π° ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΉ

Π£ нас ΠΎΡΡ‚Π°Π»ΠΎΡΡŒ послСднСС односимвольноС ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ – ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΉ. НСкоторыС ΠΈΠ· ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΉ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ состоят ΠΈΠ· ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½Ρ‹Ρ… символов, Π½ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ Π΄Π²ΡƒΡ…. Π­Ρ‚ΠΎ '<=' ΠΈ '>='. Π― Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡ΠΈΡ‚Π°ΡŽ ПаскалСвскоС '<>' для Β«Π½Π΅ Ρ€Π°Π²Π½ΠΎΒ» вмСсто '#'.

Как Π²Ρ‹ ΠΏΠΎΠΌΠ½ΠΈΡ‚Π΅, Π² Π³Π»Π°Π²Π΅ 7 я ΡƒΠΊΠ°Π·Π°Π», Ρ‡Ρ‚ΠΎ стандартный способ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°ΠΌΠΈ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΉ – Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΈΡ… Π² список ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… слов ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ΡŒ лСксичСскому Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρƒ ΠΎΡ‚Ρ‹ΡΠΊΠΈΠ²Π°Ρ‚ΡŒ ΠΈΡ…. Но, ΠΎΠΏΡΡ‚ΡŒ, это Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π° выраТСния, Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ Π΄ΠΎ этого ΠΌΡ‹ Ρƒ нас Π±Ρ‹Π»Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚ΡŒ использованиС сканСра Π½Π°Ρ‡Π°Π»ΠΎΠΌ утвСрТдСния.

Π― упомянул Ρ‚ΠΎΠ³Π΄Π°, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ всС ΠΆΠ΅ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ нСприятностСй с этим, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΌΠ½ΠΎΠ³ΠΎΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΉ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΈ ΠΎΠ½ΠΈ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Ρ‹ Π² ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠΈ. Π‘Ρ‹Π»ΠΎ Π±Ρ‹ Π»Π΅Π³ΠΊΠΎ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΈΡ… просто ΠΊΠ°ΠΊ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ случаи ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ ΠΈΡ… ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΌ способом.

Π’Ρ€Π΅Π±ΡƒΠ΅ΠΌΡ‹Π΅ измСнСния Π²Π»ΠΈΡΡŽΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΊΠΎΠ΄Π° ΠΈ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ Relation ΠΈ Π΅Π΅ Π΄Ρ€ΡƒΠ·Π΅ΠΉ. Π‘ΠΏΠ΅Ρ€Π²Π°, Π½Π°ΠΌ понадобятся Π΅Ρ‰Π΅ Π΄Π²Π΅ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΊΠΎΠ΄Π°:

{–}

{ Set D0 If Compare was <= }

procedure SetLessOrEqual;

begin

EmitLn('SGE D0');

EmitLn('EXT D0');

end;

{–}

{ Set D0 If Compare was >= }

procedure SetGreaterOrEqual;

begin

EmitLn('SLE D0');

EmitLn('EXT D0');

end;

{–}

Π—Π°Ρ‚Π΅ΠΌ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚Π΅ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π°Π½Π°Π»ΠΈΠ·Π° ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΉ ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½ΠΈΠΆΠ΅:

{–}

{ Recognize and Translate a Relational Β«Less Than or EqualΒ» }

procedure LessOrEqual;

begin

Match('=');

Expression;

PopCompare;

SetLessOrEqual;

end;

{–}

{ Recognize and Translate a Relational Β«Not EqualsΒ» }

procedure NotEqual;

begin

Match('>');

Expression;

PopCompare;

SetNEqual;

end;

{–}

{ Recognize and Translate a Relational Β«Less ThanΒ» }

procedure Less;

begin

Match('<');

case Look of

'=': LessOrEqual;

'>': NotEqual;

else begin

Expression;

PopCompare;

SetLess;

end;

end;

end;

{–}

{ Recognize and Translate a Relational Β«Greater ThanΒ» }

procedure Greater;

begin

Match('>');

if Look = '=' then begin

Match('=');

Expression;

PopCompare;

SetGreaterOrEqual;

end

else begin

Expression;

PopCompare;

SetGreater;

end;

end;

{–}

Π­Ρ‚ΠΎ всС, Ρ‡Ρ‚ΠΎ трСбуСтся. Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ всС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΉ. ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅.

Π’Π²ΠΎΠ΄/Π’Ρ‹Π²ΠΎΠ΄

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Ρƒ нас Π΅ΡΡ‚ΡŒ ΠΏΠΎΠ»Π½Ρ‹ΠΉ, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠΉ язык, Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΎΠ΄Π½ΠΎΠ³ΠΎ нСбольшого ΡΠΌΡƒΡ‰Π°ΡŽΡ‰Π΅Π³ΠΎ Ρ„Π°ΠΊΡ‚Π°: Ρƒ нас Π½Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ способа ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΈΠ»ΠΈ вывСсти Π΄Π°Π½Π½Ρ‹Π΅. Нам Π½ΡƒΠΆΠ½Ρ‹ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π°.

Π‘ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ΅ соглашСниС, установлСнноС Π² C ΠΈ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½Π½ΠΎΠ΅ Π² Ada ΠΈ Modula-2, состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ вывСсти I/O ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ ΠΈΠ· самого языка ΠΈ просто Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΈΡ… Π² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ. Π­Ρ‚ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ прСкрасно, Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΏΠΎΠΊΠ° Π½Π΅ ΠΈΠΌΠ΅Π΅ΠΌ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… срСдств ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ. Π’ любом случаС, с этим ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΎΠΌ Π²Ρ‹ ΡΡ‚ΠΎΠ»ΠΊΠ½Π΅Ρ‚Π΅ΡΡŒ с ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ‹ списка ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ². Π’ ПаскалС I/O ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ встроСны Π² язык, поэтому это СдинствСнныС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹, для ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… список ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ΅ число элСмСнтов. Π’ C ΠΌΡ‹ примиряСмся с ΠΊΠ»ΡƒΠ΄ΠΆΠ°ΠΌΠΈ Ρ‚ΠΈΠΏΠ° scanf ΠΈ printf ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ количСство ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π² Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΡƒΡŽ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ. Π’ Ada ΠΈ Modula-2 ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π½Π΅ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΉ (ΠΈ ΠΌΠ΅Π΄Π»Π΅Π½Π½Ρ‹ΠΉ!) способ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°.

Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ я Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡ΠΈΡ‚Π°ΡŽ ПаскалСвский ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ встраивания ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π°, Π΄Π°ΠΆΠ΅ Ссли ΠΌΡ‹ Π½Π΅ нуТдаСмся Π² этом.

Как ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ, для этого Π½Π°ΠΌ Π½ΡƒΠΆΠ½Ρ‹ Π΅Ρ‰Π΅ нСсколько ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΊΠΎΠ΄Π°. Они, оказываСтся, самыС простыС ΠΈΠ· всСх, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ всС, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π΄Π΅Π»Π°Π΅ΠΌ это Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½Ρ‹Π΅ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ для выполнСния Ρ€Π°Π±ΠΎΡ‚Ρ‹.

{–}

{ Read Variable to Primary Register }

procedure ReadVar;

begin

EmitLn('BSR READ');

Store(Value);

end;

{–}

{ Write Variable from Primary Register }

procedure WriteVar;

begin

EmitLn('BSR WRITE');

end;

{–}

ИдСя состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ READ Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· Π²Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° Π² D0, Π° WRITE Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ Π΅Π³ΠΎ ΠΎΡ‚Ρ‚ΡƒΠ΄Π°.

Π­Ρ‚ΠΈ Π΄Π²Π΅ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ собой Π½Π°ΡˆΡƒ ΠΏΠ΅Ρ€Π²ΡƒΡŽ встрСчу с ΠΏΠΎΡ‚Ρ€Π΅Π±Π½ΠΎΡΡ‚ΡŒΡŽ Π² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½Ρ‹Ρ… ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π°Ρ…... ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°Ρ… Run Time Library (RTL). ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ ΠΊΡ‚ΠΎ-Ρ‚ΠΎ (Π° ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΌΡ‹) Π΄ΠΎΠ»ΠΆΠ΅Π½ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ эти ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π½ΠΎ ΠΎΠ½ΠΈ Π½Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ нСпосрСдствСнно Ρ‡Π°ΡΡ‚ΡŒΡŽ компилятора. Π― Π΄Π°ΠΆΠ΅ Π½Π΅ Π±ΡƒΠ΄Ρƒ Π±Π΅ΡΠΏΠΎΠΊΠΎΠΈΡ‚ΡŒΡΡ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ здСсь эти ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ ΠΎΡ‡Π΅Π½ΡŒ ОБ-зависимы. Π― просто скаТу, Ρ‡Ρ‚ΠΎ для SK*DOS ΠΎΠ½ΠΈ особСнно просты... ΠΏΠΎΡ‡Ρ‚ΠΈ Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½Ρ‹. Одна ΠΈΠ· ΠΏΡ€ΠΈΡ‡ΠΈΠ½, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ я Π½Π΅ Π±ΡƒΠ΄Ρƒ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΈΡ… здСсь Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ Π²ΠΈΠ΄Ρ‹ возмоТностСй, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΡ€ΠΈΠ³Π»Π°ΡˆΠ΅Π½ΠΈΠ΅ Π² READ ΠΈΠ»ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΠΈΡ‚ΡŒ ΠΎΡˆΠΈΠ±ΠΎΡ‡Π½Ρ‹ΠΉ Π²Π²ΠΎΠ΄.