"Джек Креншоу. Давайте создадим компилятор! " - читать интересную книгу автора

использовании одиночного, глобального упреждающего символа. Части процедуры
инициализации служит для "запуска помпы", считывая первый символ из входного
потока. Никаких других специальных методов не требуется... каждый удачный
вызов GetChar считывает следующий символ из потока.

{-}
program Cradle;
{-}
{ Constant Declarations }
const TAB = ^I;
{-}
{ Variable Declarations }
var Look: char; { Lookahead Character }
{-}
{ Read New Character From Input Stream }
procedure GetChar;
begin
Read(Look);
end;
{-}
{ Report an Error }
procedure Error(s: string);
begin
WriteLn;
WriteLn(^G, 'Error: ', s, '.');
end;
{-}
{ Report Error and Halt }
procedure Abort(s: string);
begin
Error(s);
Halt;
end;
{-}
{ Report What Was Expected }
procedure Expected(s: string);
begin
Abort(s + ' Expected');
end;
{-}
{ Match a Specific Input Character }
procedure Match(x: char);
begin
if Look = x then GetChar
else Expected('''' + x + '''');
end;
{-}
{ Recognize an Alpha Character }
function IsAlpha(c: char): boolean;
begin