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

         

МУЛЬТИПЛИКАТИВНЫЕ ВЫРАЖЕНИЯ


Процедуры для работы с мультипликативными операторами почти такие же. Фактически, на первом уровне они почти идентичны, так что я просто покажу их здесь без особых фанфар. Первая - наша общая форма для Factor, которая включает подвыражения в скобках:

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

{ Parse and Translate a Factor }

function Expression: char; Forward;

function Factor: char;

begin

if Look = '(' then begin

      Match('(');

      Factor := Expression;

      Match(')');

      end

   else if IsAlpha(Look) then

      Factor := Load(GetName)



   else

      Factor := LoadNum(GetNum);

end;

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

{ Recognize and Translate a Multiply }

Function Multiply(T1: char): char;

begin

   Match('*');

   Multiply := PopMul(T1, Factor);

end;

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

{ Recognize and Translate a Divide }

function Divide(T1: char): char;

begin

   Match('/');

   DIvide := PopDiv(T1, Factor);

end;

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

{ Parse and Translate a Math Term }

function Term: char;

var Typ: char;

begin

   Typ := Factor;

   while IsMulop(Look) do begin

      Push(Typ);

      case Look of

       '*': Typ := Multiply(Typ);

       '/': Typ := Divide(Typ);

      end;

   end;

   Term := Typ;

end;

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

Эти подпрограммы соответствуют аддитивным почти полностью. Как и прежде, сложность изолирована в PopMul и PopDiv. Если вам захочется протестировать программу прежде чем мы займемся ими, вы можете написать их пустые версии, аналогичные PopAdd и PopSub. И снова, код не будет корректным в данный момент, но синтаксический анализатор должен обрабатывать выражения произвольной сложности.



Содержание раздела