Лекции по построению компилятора на Pascal



              

ВЫРАЖЕНИЯ С ДВУМЯ ЦИФРАМИ


     Теперь, давайте немного улучшим то, что у нас есть. По общему признанию, выражение, состоящее только из одного символа, не удовлетворит наших потребностей надолго, так что давайте посмотрим, как мы можем расширить возможности компилятора. Предположим, что мы хотим обрабатывать выражения вида:

1+2

или

4-3

или в общем  <term> +/- <term>  (это часть формы Бэкуса-Наура или БНФ.)

Для того, чтобы сделать это, нам нужна процедура, распознающая термы и сохраняющая результат, и другая процедура, которая распознает и различает «+» и «-»  и генерирует соответствующий код. Но если процедура Expression  сохраняет свои результаты в регистре D0, то где процедура Term сохранит свои результаты? Ответ:  на том же месте. Мы окажемся перед необходимостью сохранять первый результат процедуры Term где-нибудь, прежде чем мы получим следующий.

В основном, что нам необходимо сделать – создать процедуру Term, выполняющую то что раннее выполняла процедура Expression. Поэтому просто переименуйте процедуру Expression в Term и наберите новую версию Expression:

{---------------------------------------------------------------}

{ Parse and Translate an Expression }

procedure Expression;

begin

   Term;

   EmitLn('MOVE D0,D1');

   case Look of

    '+': Add;

    '-': Subtract;

   else Expected('Addop');

   end;

end;

{--------------------------------------------------------------}

Затем выше Expression наберите следующие две процедуры:

{--------------------------------------------------------------}

{ Recognize and Translate an Add }

procedure Add;

begin

   Match('+');

   Term;

   EmitLn('ADD D1,D0');

end;

{-------------------------------------------------------------}

{ Recognize and Translate a Subtract }

procedure Subtract;

begin

   Match('-');

   Term;

   EmitLn('SUB D1,D0');




Содержание  Назад  Вперед