Интерпретатор отдельно
Кто нить в курсе, почему fr_intpr.pas не удается заюзать отдельно от фастрепорта?
Интерпретатор отказывается обрабатывать управляющие конструкции,( если покопаться в кишочках - вставляя chr(0) в string строку при обработке prepare и тем самым обрезая ее).
Интерпретатор отказывается обрабатывать управляющие конструкции,( если покопаться в кишочках - вставляя chr(0) в string строку при обработке prepare и тем самым обрезая ее).
Комментарии
Глянь к примеру:
constructor TfrGlobals.Create;
Вот мой техт, конечно, в него я впиндюрил кусочек из fr_class.pas, иначе интерпретатор вообще бы не работал, но он работает, только не хочет выполнять операторы ветвления. Там (в fr_intrp) применяется адресация по строкам скрипта, зашифрована в 2 байта, ставится при парсинге в начало строки, ну и естессно, если в стринг записать chr(0), то строка обрежется, если я не ошибаюсь. Я бы и поправил алгоритм интерпретатора, но он же рекурсивный - разбираться полгода надо, мне, во-всяком случае.
Мабыть, я просто протупил где, не зная дельфей толком, если не трудно, поправь.
unit Unit1;
interface
{$I FR.inc}
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, FR_Pars, FR_Intrp;
type
TInterpretator = class(TfrInterpretator)
public
procedure GetValue(const Name: String; var Value: Variant); override;
procedure SetValue(const Name: String; Value: Variant); override;
procedure DoFunction(const name: String; p1, p2, p3: Variant;
var val: Variant); override;
end;
TForm1 = class(TForm)
Edit1: TEdit;
Label1: TLabel;
Button1: TButton;
Memo1: TMemo;
Memo2: TMemo;
Memo3: TMemo;
Button2: TButton;
procedure Edit1KeyPress(Sender: TObject; var Key: Char);
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Edit1Change(Sender: TObject);
procedure OnGetParsVariableValue(const s: String; var v: Variant);
procedure OnGetParsFunction(const name: String; p1, p2, p3: Variant;
var val: Variant);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
mypars:TfrParser;
myvari:TfrVariables;
myinter:TInterpretator;
implementation
function My_say_box(p1,p2,p3:Variant):integer;
begin
form1.Canvas.Pen.Color := p3;
form1.Canvas.Rectangle(p1,p2,p1+p3,p2+p3)
end;
//uses FR_Pars;
{$R *.DFM}
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
var
retval: Variant;
begin
if key = #13
then
Label1.Caption := mypars.Calc(edit1.Text);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
mypars:=TfrParser.Create;
mypars.OnGetValue := OnGetParsVariableValue;
mypars.OnFunction := OnGetParsFunction;
myvari:=TfrVariables.Create;
myinter:=TInterpretator.Create;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
myinter.PrepareScript(memo1.Lines,memo2.Lines,memo3.Lines);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
myinter.DoScript(memo2.lines);
end;
procedure TForm1.Edit1Change(Sender: TObject);
begin
// Label1.Caption := mypars.Calc(edit1.Text);
end;
procedure Tform1.OnGetParsVariableValue(const s: String; var v: Variant);
begin
if myvari.IndexOf(s) <> -1 then
begin
v := myvari;
end;
end;
procedure Tform1.OnGetParsFunction(const name: String; p1, p2, p3: Variant;var val: Variant);
begin
val:=0;
if AnsiCompareText('SAY', Name) = 0 then
val := My_say_box(p1,p2,p3);
end;
procedure TInterpretator.GetValue(const Name: String; var Value: Variant);
begin
if myvari.IndexOf(name) <> -1 then
begin
value := myvari[name];
end;
end;
procedure TInterpretator.SetValue(const Name: String; Value: Variant);
begin
myvari[name]:=value;
end;
procedure TInterpretator.DoFunction(const Name: String; p1, p2, p3: Variant;
var Val: Variant);
begin
val:=0;
if AnsiCompareText('SAY', Name) = 0 then
val := My_say_box(mypars.calc(p1),mypars.calc(p2),mypars.calc(p3));
end;
end.