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

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



Соответствующий выходной код должен быть таким: 

IF

 

BEQ L1 

 

BRA L2 

L1:  

L2: ...

Это приводит нас к следующей синтаксически управляемой схеме перевода:

IF

 { L1 = NewLabel;

L2 = NewLabel;

Emit(BEQ L1) }



ELSE { Emit(BRA L2);

PostLabel(L1) }



ENDIF { PostLabel(L2) } 

Сравнение этого со случаем IF без ELSE дает нам понимание того, как обрабатывать обе эти ситуации. Код ниже выполняет это. (Обратите внимание, что использую "l" вместо «ELSE» так как "e" имеет другое назначение):



{–}

{ Recognize and Translate an IF Construct }

procedure DoIf;

var L1, L2: string;

begin

Match('i');

Condition;

L1 := NewLabel;

L2 := L1;

EmitLn('BEQ ' + L1);

Block;

if Look = 'l' then begin

Match('l');

L2 := NewLabel;

EmitLn('BRA ' + L2);

PostLabel(L1);

Block;

end;

Match('e');

PostLabel(L2);

end;

{–}



Вы получили его. Законченый анализатор/транслятор в 19 строк кода.

Сейчас протестируйте его. Испробуйте что-нибудь типа:

aiblcede

Работает? Теперь, только для того, чтобы убедиться, что мы ничего не испортили и случай с IF без ELSE тоже будет обрабатываться, введите

aibece

Теперь испробуйте несколько вложенных IF. Испытайте что-нибудь на ваш выбор, включая несколько неправильных утверждений. Только запомните, что 'e' не является допустимым оператором «other».

ОПЕРАТОР WHILE



Следующий вид оператора должен быть простым, так как мы уже имеем опыт.

|< Пред. 61 62 63 64 65 След. >|

Java книги

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