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

       

ОПЕРАТОРЫ


Мы могли бы сейчас остановиться и иметь в своем распоряжении довольно полезный сканер. В тех фрагментах KISS, которые мы построили, единственными токенами, состоящими из нескольких символов, являются идентификаторы и числа. Все операторы были одно-символьными. Единственное исключение, которое я могу придумать - это операторы отношений "<=", ">=" и  "<>", но они могут быть обработаны как особые случаи.

Однако другие языки имеют много символьные операторы такие как ":=" в Паскале или "++" и ">>" в C. Хотя пока нам и не нужны много символьные операторы, было бы хорошо знать как получить их в случае необходимости.

Само собой разумеется, что мы можем обрабатывать операторы точно таким же способом, что и другие токены. Давайте начнем с подпрограммы распознавания:

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

{ Recognize Any Operator }

function IsOp(c: char): boolean;

begin

   IsOp := c in ['+', '-', '*', '/', '<', '>', ':', '='];

end;

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

Важно заметить, что мы не должны включать в этот список каждый возможный оператор. К примеру круглые скобки не включены, так же как и завершающая точка. Текущая версия Scan и так хорошо поддерживает одно-символьные операторы. Список выше включает только те символы, которые могут появиться в много символьных операторах. (Для конкретных языков список конечно всегда может быть отредактирован).

Теперь давайте изменим Scan следующим образом:

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



{ Lexical Scanner }

Function Scan: string;

begin

   while Look = CR do

      Fin;

   if IsAlpha(Look) then

      Scan := GetName

   else if IsDigit(Look) then

      Scan := GetNum

   else if IsOp(Look) then

      Scan := GetOp

   else begin

      Scan := Look;

      GetChar;

   end;

   SkipWhite;

end;

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

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



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