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

       

МОДУЛЬ SCANNER


Следующая, и намного более важная, версия лексического анализатора, та которая обрабатывает много символьные токены, которые должны иметь все настоящие языки. Только две функции, GetName и GetNumber отличаются в этих двух модулях, но только чтобы убедиться, что здесь нет никаких ошибок, я воспроизвел здесь весь модуль. Это модуль Scanner:

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

unit Scanner;

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

interface

uses Input, Errors;

function IsAlpha(c: char): boolean;

function IsDigit(c: char): boolean;

function IsAlNum(c: char): boolean;

function IsAddop(c: char): boolean;

function IsMulop(c: char): boolean;

procedure Match(x: char);

function GetName: string;



function GetNumber: longint;

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

implementation

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

{ Recognize an Alpha Character }

function IsAlpha(c: char): boolean;

begin

 

 IsAlpha := UpCase(c) in ['A'..'Z'];

end;

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

{ Recognize a Numeric Character }

function IsDigit(c: char): boolean;

begin

  IsDigit := c in ['0'..'9'];

end;

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

{ Recognize an Alphanumeric Character }

function IsAlnum(c: char): boolean;

begin

 

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

end;

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

{ Recognize an Addition Operator }

function IsAddop(c: char): boolean;

begin

 

 IsAddop := c in ['+','-'];

end;

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

{ Recognize a Multiplication Operator }

function IsMulop(c: char): boolean;

begin

  IsMulop := c in ['*','/'];

end;

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

{ Match One Character }

procedure Match(x: char);

begin

 

 if Look = x then GetChar

  else Expected('''' + x + '''');


end;

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

{ Get an Identifier }

function GetName: string;

var n: string;

begin

  n := '';

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

  while IsAlnum(Look) do begin

    n := n + Look;

    GetChar;

  end;

  GetName := n;

end;

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

{ Get a Number }

function GetNumber: string;

var n: string;

begin

  n := '';

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

  while IsDigit(Look) do begin

    n := n + Look;

    GetChar;

  end;

  GetNumber := n;

end;

end.

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

Та же самая тестовая программа проверит также и этот сканер. Просто измените раздел "uses" для использования Scanner вместо Scanner1. Теперь у вас должна быть возможность набирать много символьные имена и числа.


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