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

       

ЭКСПЕРИМЕНТЫ ПО СКАНИРОВАНИЮ


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

Давайте начнем с двух определений, наиболее часто встречающихся в настоящих языках программирования:

<ident> ::= <letter> [ <letter> | <digit> ]*

     <number ::= [<digit>]+

 (Не забудьте, что "*" указывает на ноль или более повторений условия в квадратных скобках, а "+" на одно и более.)

Мы уже работали с подобными элементами в третьей главе. Давайте начнем (как обычно) с пустого Cradle. Не удивительно, что нам понадобится новая процедура распознавания:

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

{ Recognize an Alphanumeric Character }

function IsAlNum(c: char): boolean;

begin

   IsAlNum := IsAlpha(c) or IsDigit(c);

end;

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



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

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

{ Get an Identifier }

function GetName: string;

var x: string[8];

begin

   x := '';

   if not IsAlpha(Look) then Expected('Name');

   while IsAlNum(Look) do begin

     x := x + UpCase(Look);

     GetChar;

   end;

   GetName := x;

end;

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

{ Get a Number }

function GetNum: string;

var x: string[16];

begin

   x := '';

   if not IsDigit(Look) then Expected('Integer');

   while IsDigit(Look) do begin

     x := x + Look;

     GetChar;

   end;

   GetNum := x;

end;

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

(Заметьте, что эта версия GetNum возвращает строку, а не целое число, как прежде).

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

     WriteLn(GetName);

Эта программа выведет любое допустимое набранное имя (максимум восемь знаков, потому что мы так сказали GetName). Она отвергнет что-либо другое.

Аналогично проверьте другую подпрограмму.



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