Следующая, и намного более важная, версия лексического анализатора, та которая обрабатывает много символьные токены, которые должны иметь все настоящие языки. Только две функции, 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;
{--------------------------------------------------------------} { 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;
Та же самая тестовая программа проверит также и этот сканер. Просто измените раздел "uses" для использования Scanner вместо Scanner1. Теперь у вас должна быть возможность набирать много символьные имена и числа.