Доброго времени суток. Написал интерпретатор брэинфака. Вроде работает нормально. Но хочется, чтобы был не быдлокод, а качественный. Укажите, пожалуйста, на ошибки. 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.
В универе каникулы, друзья хвосты сдают, делать нефиг, от каникул уже офигел. Ну вот и решил от нечего делать написать. Эх жаль знаний маловато, хотелось сделать компилятор.
ОМГ, стало интересно, и я решил почитать, что же такое брэинфак. Компильнул, и даже скормил проге код, который выводит Хелоу Ворлд. И зачем только люди такое придумывают? Писать на таком языке это же реально можно мозг сломать о_О По теме: А если мне нужно только 100 символов? Не лучше ли сделать динамический массив?