Вот максимально упрощенный алгоритм с малым числом зарезервированных слов для обычного pascal'я. Написан в TurboPascal7.1 / Delphi. (исходный текст пропущен через обусификатор)

{__obus.pas__ programming by arT (c). e-mail: [email protected]}
var
n1,n2 : text;
n3 : string;
n4,n5,n6 : char;
n7 : array[0..2000] of string[31];
n8 : integer;
function n9(n3:string) : string;
var {обусификатор для переменных и имен}
n10 : integer;
begin
n7[0]:=n3;
n10:=n8;
while n7[n10]<>n3 do dec(n10);
if (n10=0) then
begin
inc(n8);
n7[n8]:=n3;
n10:=n8;
end;
str(n10,n3);
n9:='l'+n3;
end;
begin
assign(n1,'obus.pas');
reset(n1);
assign(n2,'obus2.pas');
rewrite(n2);
n6:=#0;
while not eof(n1) do
begin
n5:=n4;
read(n1,n4);
if (n4 in ['_','$','0'..'9','a'..'z','A'..'Z']) and (n6=#0) then
begin
if n4 in [#65..#90] then inc(n4, (97-65));
n3:=n3+n4;
end
else
begin
if n3<>'' then {преобразовать}
begin
if not (n3[1] in ['$','0'..'9'])
and (n3<>'program')
and (n3<>'begin')
and (n3<>'end')
and (n3<>'for')
and (n3<>'to')
and (n3<>'downto')
and (n3<>'do')
and (n3<>'while')
and (n3<>'case')
and (n3<>'of')
and (n3<>'repeat')
and (n3<>'until')
and (n3<>'if')
and (n3<>'then')
and (n3<>'and')
and (n3<>'or')
and (n3<>'not')
and (n3<>'in')
and (n3<>'write')
and (n3<>'writeln')
and (n3<>'read')
and (n3<>'readln')
and (n3<>'paramcount')
and (n3<>'paramstr')
and (n3<>'ioresult')
and (n3<>'assign')
and (n3<>'rewrite')
and (n3<>'reset')
and (n3<>'close')
and (n3<>'halt')
and (n3<>'exit')
and (n3<>'break')
and (n3<>'byte')
and (n3<>'boolean')
and (n3<>'integer')
and (n3<>'longint')
and (n3<>'real')
and (n3<>'shortint')
and (n3<>'const')
and (n3<>'type')
and (n3<>'var')
and (n3<>'label')
and (n3<>'array')
and (n3<>'string')
and (n3<>'char')
and (n3<>'text')
and (n3<>'file')
and (n3<>'inc')
and (n3<>'dec')
and (n3<>'false')
and (n3<>'true')
and (n3<>'procedure')
and (n3<>'function')
and (n3<>'str')
and (n3<>'val')
and (n3<>'eof')
and (n3<>'eol')
and (n3<>'else')
and (n3<>'length')
and (n3<>'flush')
and (n3<>'getmem')
and (n3<>'fillchar')
and (n3<>'freemem')
and (n3<>'sizeof')
{} then n3:=n9(n3);
write(n2,n3);
n3:='';
end;
write(n2,n4);
if (n4=n6) then
begin
if (n4<>')') then n6:=#0
else if (n5='*') then n6:=#0;
end
else if n6=#0 then
begin
if (n4='{') then n6:='}'
else if (n4='''') then n6:=''''
else if (n4='/') and (n5='/') then n6:=#10
else if (n4='*') and (n5='(') then n6:=')';
end;
end;
end;
close(n2);
close(n1);
end.