Найденные баги и замечания для: D1,2,C++ Builder: Библиотека компонент для компиляции. Белугин Максим, 20.06.1997, 05.11.1997, 26.02.98 FidoNet:2:5020/484.28 mailto: belugin@bsd.lanit.ru http://www.geocities.com/SiliconValley/Pines/1605 составитель Лагунов Алексей Анатольевич. mailto: alexs@n10.ft.stavropol.ru FidoNet:2:5064/13.50 Для устанвки всех компонент создал новый пакет:comp_belugin.dpk 1.Для установки компонент под Delphi 4.0 нужно добавить следующие строки (используется библиотека RxLib) файл Comped; в начало файла добавляем {$I RX.INC} сразу после списка подключенных модулей uses {$IFDEF RX_D4} type TDesigner = IDesigner; TFormDesigner = IFormDesigner; {$ENDIF} тоже самое для файла Execed; 2.Объектная виртуальная машина файл ObjOps.pas: метод: function TOrOp.DoOp; begin Result:=Inherited DoOp(a,b); Result.AsBoolean:=a.AsBoolean and b.AsBoolean; end; // ^^^ по моему должно быть function TOrOp.DoOp; begin Result:=Inherited DoOp(a,b); Result.AsBoolean:=a.AsBoolean or b.AsBoolean; end; // ^^ 3. Вот это - чтобы быстрей работало OpList: function TOpList.Find; Var i:Integer; begin Result:=nil; for i:=0 to fList.Count-1 do begin if (fList.Obj[i] as TObjOp).OpCode=OpCode then begin Result:=fList.Obj[i] as TObjOp; exit;//!!! (c) alexs end; end; end; 4. Чтобы закрывалась форма редактора компилятора при удалении TCompiler-а модуль Compiler; {TCompiler provides lexical and grammar parse } TCompiler = class(TComponent) private { Private declarations } fLexems:TLexInfLs; .... .... .... procedure wrOnCompile(Rule:Integer;a:TRuleEvent); public fEditWind:TObject; //(c) alexs {} procedure write(w:TWRiter); procedure read(r:TReader); destructor TCompiler.Destroy; begin if fEditWind<>nil then //(c) by alexs fEditWind.Free; модуль Comped; constructor TCompEdForm.Create; Var i:Integer; begin Inherited Create(o); Comp.fEditWind:=Self; //(c) alexs fComp:=Comp; .... .... .... procedure TCompEdForm.FormDestroy(Sender: TObject); begin Comp.fEditWind:=nil; //(c) alexs { Modif; ReadRLFromS(fComp.Rules,RulesGrid.Cols[1],fComp.Lexems); fErrEd.Destroy; } end; 5. Чтобы во время компиляции отображать прогрес: вслед за оюъявлением TCompiler-a объявим тип: TCompilerProgress = procedure(Sender: TCompiler; LineNo: Integer) of object; в приватной части TCompiler введём переменную fOnCompilerProgress:TCompilerProgress; а в опубликованной объявим свойство property OnCompilerProgress:TCompilerProgress read fOnCompilerProgress write fOnCompilerProgress; перепишем метод TCompiler.AcceptStrings след. образом function TCompiler.AcceptStrings; Var i:integer; begin for i:=0 to s.COunt-1 do begin if not AcceptString(LineNo+i,s[i]) then begin Result:=False; break; end; if Assigned(OnCompilerProgress) then //(c) alex OnCompilerProgress(Self, i); end; end; 6.Иногда возникает необходимость прервать выполнение скрипта. поэтому сделал следующие изменения в модуле uObjVM; локальную переменную из метода procedure IObjVM.Run переименовал в Executor и вынес в объявление объекта IObjVM. В него же добавил новый метод: procedure IObjVM.Halt; begin Executor.IsEnd:=true; end; 7.Добавил в объект TCode два метода (просто мне удобно сохранять код в мемо-файл, чтобы не плодить кучу мелких файликов) модуль Code; {Load code from stream} procedure TCode.LoadFromStream(S:TStream); var r:TReader; begin r:=TReader.Create(S,1024); Size:=r.ReadInteger; r.Read(Body^,Size); r.Free; end; {Save code to stream} procedure TCode.SaveToStream(S:TStream); var w:TWriter; begin w:=TWriter.Create(S,1024); w.writeInteger(Size); w.write(Body^,Size); w.Free; end;