[Delphi] Интерпретатор brainfuck

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by BHYCHIK, 5 Feb 2011.

  1. BHYCHIK

    BHYCHIK Member

    Joined:
    30 Jan 2009
    Messages:
    52
    Likes Received:
    28
    Reputations:
    9
    Доброго времени суток. Написал интерпретатор брэинфака. Вроде работает нормально. Но хочется, чтобы был не быдлокод, а качественный. Укажите, пожалуйста, на ошибки.

    Code:
    program BrainFuck;
    
    {$APPTYPE CONSOLE}
    
    uses
      SysUtils;
    
    var
      Script: TextFile;
      ByteCode: File of Char;
      Command: Char;
      Memory: array[0..10000] of Char;
      CurrentCell: Integer = 0;
      FilePath: string;
      I: Integer;
      Syntax: set of char = ['+', '-', '<', '>', '[', ']', '.', ','];
    
    procedure SeekEndOfCycle;
    var
      Depth: Integer;
    begin
      Depth := 1;
      repeat
        Read(ByteCode, Command);
        case Command of
          '[': Inc(Depth);
          ']': Dec(Depth);
        end;
      until Depth = 0;
    end;
    
    procedure Cycle;
    var
      Depth, I: Integer;
    begin
      Depth := 1;
      while Depth > 0 do
      begin
        Read(ByteCode, Command);
        case Command of
          '>': Inc(CurrentCell);
          '<': Dec(CurrentCell);
          ',': Read(Memory[CurrentCell]);
          '.': Write(Memory[CurrentCell]);
          '+': Inc(Memory[CurrentCell]);
          '-': Dec(Memory[CurrentCell]);
          ']': Dec(Depth);
          '[':
          begin
            if Memory[CurrentCell] <> chr(0) then
            begin
              I := FilePos(ByteCode);
              while Memory[CurrentCell] <> chr(0) do
              begin
                Cycle;
                Seek(ByteCode, I);
              end;
              SeekEndOfCycle;
            end
            else
            begin
              SeekEndOfCycle;
            end;
          end;
        end;
      end;
    end;
    
    begin
      {$I-}
      repeat
        Write('Type path to script: ');
        ReadLn(FilePath);
        AssignFile(Script, FilePath);
        Reset(Script);
      until IOResult = 0;
      {$I+}
      for I := 0 to 10000 do
      begin
        Memory[I] := chr(0);
      end;
      AssignFile(ByteCode, 'bytecode.dat');
      Rewrite(ByteCode);
      while not EOF(Script) do
      begin
        Read(Script, Command);
        if Command in Syntax then
          Write(ByteCode, Command);
      end;
      CloseFile(Script);
      Reset(ByteCode);
    
      while not EOF(ByteCode) do
      begin
        Read(ByteCode, Command);
        case Command of
          '>': Inc(CurrentCell);
          '<': Dec(CurrentCell);
          ',': Read(Memory[CurrentCell]);
          '.': Write(Memory[CurrentCell]);
          '+': Inc(Memory[CurrentCell]);
          '-': Dec(Memory[CurrentCell]);
          '[':
          begin
            if Memory[CurrentCell] <> chr(0) then
            begin
              I := FilePos(ByteCode);
              while Memory[CurrentCell] <> chr(0) do
              begin
                Cycle;
                Seek(ByteCode, I);
              end;
              SeekEndOfCycle;
            end
            else
            begin
              SeekEndOfCycle;
            end;
          end;
        end;
      end;
    
      CloseFile(ByteCode);
      DeleteFile('bytecode.dat');
      ReadLn;
      ReadLn;
    end.
    
    
     
  2. GhostOnline

    GhostOnline Active Member

    Joined:
    20 Dec 2008
    Messages:
    723
    Likes Received:
    110
    Reputations:
    22
    Мне просто интересно: нахуя? =)
    ПС гыгы, сам страдал как-то этой херней
     
  3. BHYCHIK

    BHYCHIK Member

    Joined:
    30 Jan 2009
    Messages:
    52
    Likes Received:
    28
    Reputations:
    9
    В универе каникулы, друзья хвосты сдают, делать нефиг, от каникул уже офигел. Ну вот и решил от нечего делать написать.

    Эх жаль знаний маловато, хотелось сделать компилятор.
     
  4. =Zeus=

    =Zeus= Member

    Joined:
    10 Aug 2009
    Messages:
    213
    Likes Received:
    54
    Reputations:
    5
    ОМГ, стало интересно, и я решил почитать, что же такое брэинфак. Компильнул, и даже скормил проге код, который выводит Хелоу Ворлд.
    И зачем только люди такое придумывают? Писать на таком языке это же реально можно мозг сломать о_О
    По теме:
    А если мне нужно только 100 символов? Не лучше ли сделать динамический массив?