Показать сообщение отдельно
Старый 29.09.2008, 08:21   #56
satan
Нуждающийся
 
Регистрация: 10.02.2007
Сообщений: 99
Написано 18 полезных сообщений
(для 28 пользователей)
Re: создание MIDletPascal compiler'a

Гут... Мысль понял... Токма у меня опять в штопор входит...
Надо так, ваще вечером загружу TurboDelphi 2006, оно бесплатное и там помойму с памятью корректнее работает, паетому на ней программы можно и продовать и раздавать... Да и синхронность будет!

А машину чоб не мучица из MidpX dll выдрать можно, гы... Ток интерфейс свой прикрутить, я тож гляну чо там за фукции торчат.

Теперь пример уже синтаксического анализатора, который разбирает строки вида
N +/- ... Где N - цифра, тоесть типа
1+2-3+1-6 или 3+3+5+6-4 ну и т.д... Начнем с азов...

{$APPTYPE CONSOLE}

const TAB = ^I;
var Look: char;

procedure GetChar; begin Read(Look); end;
procedure Error(s: string); begin WriteLn; WriteLn(^G, 'Error: ', s, '.'); end;
procedure Abort(s: string); begin Error(s); Halt; end;
procedure Expected(s: string); begin Abort(s + ' Expected'); end;
procedure Match(x: char); begin if Look = x then GetChar else Expected('''' + x + ''''); end;
function IsAlpha(c: char): boolean; begin IsAlpha := upcase(c) in ['A'..'Z']; end;
function IsDigit(c: char): boolean; begin IsDigit := c in ['0'..'9']; end;

function GetName: char;
begin
   if not IsAlpha(Look) then Expected('Name');
   GetName := UpCase(Look);
   GetChar;
end;

function GetNum: char;
begin
   if not IsDigit(Look) then Expected('Integer');
   GetNum := Look;
   GetChar;
end;

procedure Emit(s: string); begin Write(TAB, s); end;
procedure EmitLn(s: string); begin Emit(s); WriteLn; end;

//--------------------------S analizator-----------------------------

procedure Term;
begin
   EmitLn('bipush ' + GetNum);
end;

procedure Add;
begin
   Match('+');
   Term;
   EmitLn('iadd');
end;

procedure Sub;
begin
   Match('-');
   Term;
   EmitLn('isub');
   EmitLn('ineg');
end;

procedure Expression;
begin
   Term;
   while Look in ['+', '-'] do begin
      case Look of
       '+': Add;
       '-': Sub;
      else Expected('Addop');
      end;
   end;
end;

//------------------------------------------------------------------

procedure Init;
begin
   GetChar;
end;

begin
   Init;
   Expression;
end.
вобчем сам анализатор пока из 4 фукций

procedure Term;
procedure Add;
procedure Sub;
procedure Expression;

И выдает асм листинг формата JVM
вот пример разбора строки 1+2-3+4-5+6
        bipush 1
        bipush 2
        iadd
        bipush 3
        isub
        ineg
        bipush 4
        iadd
        bipush 5
        isub
        ineg
        bipush 6
        iadd
В принципе немного отличаецо от Java классики, но ето от того что там используетца польская запись, кстати хто заинтересуеца АЛГОРИТМ ДЕКСТРА для перевода текстовой строки в обратную польскую запись.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
abcdef (03.10.2008)