Содержание материала

МОДУЛЬ SCANNER

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

Code:

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. Теперь у вас должна быть возможность набирать много символьные имена и числа.

Добавить комментарий

Не использовать не нормативную лексику.

Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.

ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!


Защитный код
Обновить