73
72
constructor Create;
74
73
destructor Destroy; override;
76
procedure AddReplaceExprWord(AExprWord: TExprWord);
77
procedure DefineFloatVariable(AVarName: string; AValue: PDouble);
78
procedure DefineIntegerVariable(AVarName: string; AValue: PInteger);
75
function DefineFloatVariable(AVarName: string; AValue: PDouble): TExprWord;
76
function DefineIntegerVariable(AVarName: string; AValue: PInteger): TExprWord;
79
77
// procedure DefineSmallIntVariable(AVarName: string; AValue: PSmallInt);
80
78
{$ifdef SUPPORT_INT64}
81
procedure DefineLargeIntVariable(AVarName: string; AValue: PLargeInt);
79
function DefineLargeIntVariable(AVarName: string; AValue: PLargeInt): TExprWord;
83
procedure DefineDateTimeVariable(AVarName: string; AValue: PDateTimeRec);
84
procedure DefineBooleanVariable(AVarName: string; AValue: PBoolean);
85
procedure DefineStringVariable(AVarName: string; AValue: PPChar);
86
procedure DefineStringVariableFixedLen(AVarName: string; AValue: PPChar; ALength: Integer);
87
procedure DefineFunction(AFunctName, AShortName, ADescription, ATypeSpec: string;
88
AMinFunctionArg: Integer; AResultType: TExpressionType; AFuncAddress: TExprFunc);
89
procedure ReplaceFunction(OldName: string; AFunction: TObject);
81
function DefineDateTimeVariable(AVarName: string; AValue: PDateTimeRec): TExprWord;
82
function DefineBooleanVariable(AVarName: string; AValue: PBoolean): TExprWord;
83
function DefineStringVariable(AVarName: string; AValue: PPChar): TExprWord;
84
function DefineStringVariableFixedLen(AVarName: string; AValue: PPChar; ALength: Integer): TExprWord;
85
function DefineFunction(AFunctName, AShortName, ADescription, ATypeSpec: string;
86
AMinFunctionArg: Integer; AResultType: TExpressionType; AFuncAddress: TExprFunc): TExprWord;
90
87
procedure Evaluate(AnExpression: string);
91
88
function AddExpression(AnExpression: string): Integer;
92
89
procedure ClearExpressions; virtual;
478
475
// simple constant, variable or function?
479
476
if LastItem = FirstItem then
481
Result.ExprWord := TExprWord(Expr.Items[FirstItem]);
482
Result.Oper := @Result.ExprWord.ExprFunc;
483
if Result.ExprWord.IsVariable then
478
Result^.ExprWord := TExprWord(Expr.Items[FirstItem]);
479
Result^.Oper := Result^.ExprWord.ExprFunc;
480
if Result^.ExprWord.IsVariable then
485
482
// copy pointer to variable
486
Result.Args[0] := Result.ExprWord.AsPointer;
483
Result^.Args[0] := Result^.ExprWord.AsPointer;
487
484
// is this a fixed length string variable?
488
if Result.ExprWord.FixedLen >= 0 then
485
if Result^.ExprWord.FixedLen >= 0 then
490
487
// store length as second parameter
491
Result.Args[1] := PChar(Result.ExprWord.LenAsPointer);
488
Result^.Args[1] := PChar(Result^.ExprWord.LenAsPointer);
517
514
if IEnd >= FirstItem then
520
Result.ExprWord := TExprWord(Expr.Items[IEnd]);
521
Result.Oper := Result.ExprWord.ExprFunc;
517
Result^.ExprWord := TExprWord(Expr.Items[IEnd]);
518
Result^.Oper := Result^.ExprWord.ExprFunc;
522
519
// recurse into left part if present
523
520
if IEnd > FirstItem then
525
Result.ArgList[IArg] := MakeTree(Expr, FirstItem, IEnd-1);
522
Result^.ArgList[IArg] := MakeTree(Expr, FirstItem, IEnd-1);
528
525
// recurse into right part if present
529
526
if IEnd < LastItem then
530
Result.ArgList[IArg] := MakeTree(Expr, IEnd+1, LastItem);
532
if TExprWord(Expr.Items[FirstItem]).IsFunction then
527
Result^.ArgList[IArg] := MakeTree(Expr, IEnd+1, LastItem);
529
if TExprWord(Expr.Items[FirstItem]).IsFunction then
535
Result.ExprWord := TExprWord(Expr.Items[FirstItem]);
536
Result.Oper := Result.ExprWord.ExprFunc;
532
Result^.ExprWord := TExprWord(Expr.Items[FirstItem]);
533
Result^.Oper := Result^.ExprWord.ExprFunc;
537
534
// parse function arguments
538
535
IEnd := FirstItem + 1;
900
procedure TCustomExpressionParser.DefineFunction(AFunctName, AShortName, ADescription, ATypeSpec: string;
901
AMinFunctionArg: Integer; AResultType: TExpressionType; AFuncAddress: TExprFunc);
903
AddReplaceExprWord(TFunction.Create(AFunctName, AShortName, ATypeSpec, AMinFunctionArg, AResultType, AFuncAddress, ADescription));
906
procedure TCustomExpressionParser.DefineIntegerVariable(AVarName: string; AValue: PInteger);
908
AddReplaceExprWord(TIntegerVariable.Create(AVarName, AValue));
912
procedure TCustomExpressionParser.DefineSmallIntVariable(AVarName: string; AValue: PSmallInt);
914
AddReplaceExprWord(TSmallIntVariable.Create(AVarName, AValue));
897
function TCustomExpressionParser.DefineFunction(AFunctName, AShortName, ADescription, ATypeSpec: string;
898
AMinFunctionArg: Integer; AResultType: TExpressionType; AFuncAddress: TExprFunc): TExprWord;
900
Result := TFunction.Create(AFunctName, AShortName, ATypeSpec, AMinFunctionArg, AResultType, AFuncAddress, ADescription);
901
FWordsList.Add(Result);
904
function TCustomExpressionParser.DefineIntegerVariable(AVarName: string; AValue: PInteger): TExprWord;
906
Result := TIntegerVariable.Create(AVarName, AValue);
907
FWordsList.Add(Result);
918
910
{$ifdef SUPPORT_INT64}
920
procedure TCustomExpressionParser.DefineLargeIntVariable(AVarName: string; AValue: PLargeInt);
912
function TCustomExpressionParser.DefineLargeIntVariable(AVarName: string; AValue: PLargeInt): TExprWord;
922
AddReplaceExprWord(TLargeIntVariable.Create(AVarName, AValue));
914
Result := TLargeIntVariable.Create(AVarName, AValue);
915
FWordsList.Add(Result);
927
procedure TCustomExpressionParser.DefineDateTimeVariable(AVarName: string; AValue: PDateTimeRec);
929
AddReplaceExprWord(TDateTimeVariable.Create(AVarName, AValue));
932
procedure TCustomExpressionParser.DefineBooleanVariable(AVarName: string; AValue: PBoolean);
934
AddReplaceExprWord(TBooleanVariable.Create(AVarName, AValue));
937
procedure TCustomExpressionParser.DefineFloatVariable(AVarName: string; AValue: PDouble);
939
AddReplaceExprWord(TFloatVariable.Create(AVarName, AValue));
942
procedure TCustomExpressionParser.DefineStringVariable(AVarName: string; AValue: PPChar);
944
DefineStringVariableFixedLen(AVarName, AValue, -1);
947
procedure TCustomExpressionParser.DefineStringVariableFixedLen(AVarName: string; AValue: PPChar; ALength: Integer);
949
AddReplaceExprWord(TStringVariable.Create(AVarName, AValue, ALength));
920
function TCustomExpressionParser.DefineDateTimeVariable(AVarName: string; AValue: PDateTimeRec): TExprWord;
922
Result := TDateTimeVariable.Create(AVarName, AValue);
923
FWordsList.Add(Result);
926
function TCustomExpressionParser.DefineBooleanVariable(AVarName: string; AValue: PBoolean): TExprWord;
928
Result := TBooleanVariable.Create(AVarName, AValue);
929
FWordsList.Add(Result);
932
function TCustomExpressionParser.DefineFloatVariable(AVarName: string; AValue: PDouble): TExprWord;
934
Result := TFloatVariable.Create(AVarName, AValue);
935
FWordsList.Add(Result);
938
function TCustomExpressionParser.DefineStringVariable(AVarName: string; AValue: PPChar): TExprWord;
940
Result := DefineStringVariableFixedLen(AVarName, AValue, -1);
943
function TCustomExpressionParser.DefineStringVariableFixedLen(AVarName: string; AValue: PPChar; ALength: Integer): TExprWord;
945
Result := TStringVariable.Create(AVarName, AValue, ALength);
946
FWordsList.Add(Result);
972
969
//LAST operand should be boolean -otherwise If(,,) doesn't work
973
970
while (FLastRec^.Next <> nil) do
974
971
FLastRec := FLastRec^.Next;
975
if FLastRec.ExprWord <> nil then
976
Result := FLastRec.ExprWord.ResultType;
972
if FLastRec^.ExprWord <> nil then
973
Result := FLastRec^.ExprWord.ResultType;
980
procedure TCustomExpressionParser.ReplaceExprWord(OldExprWord, NewExprWord: TExprWord);
986
if OldExprWord.MaxFunctionArg <> NewExprWord.MaxFunctionArg then
987
raise Exception.Create('Cannot replace variable/function MaxFunctionArg doesn''t match');
989
p := OldExprWord.AsPointer;
990
pnew := NewExprWord.AsPointer;
993
if (Rec.ExprWord = OldExprWord) then
995
Rec.ExprWord := NewExprWord;
996
Rec.Oper := NewExprWord.ExprFunc;
999
for J := 0 to Rec.ExprWord.MaxFunctionArg - 1 do
1000
if Rec.Args[J] = p then
1001
Rec.Args[J] := pnew;
1006
977
function TCustomExpressionParser.MakeRec: PExpressionRec;
1012
Result.AuxData := nil;
983
Result^.AuxData := nil;
1013
984
for I := 0 to MaxArg - 1 do
1015
Result.Args[I] := nil;
1016
Result.ArgsPos[I] := nil;
1017
Result.ArgsSize[I] := 0;
1018
Result.ArgsType[I] := etUnknown;
1019
Result.ArgList[I] := nil;
986
Result^.Args[I] := nil;
987
Result^.ArgsPos[I] := nil;
988
Result^.ArgsSize[I] := 0;
989
Result^.ArgsType[I] := etUnknown;
990
Result^.ArgList[I] := nil;
1023
Result.ExprWord := nil;
1024
Result.ResetDest := false;
994
Result^.ExprWord := nil;
995
Result^.ResetDest := false;
1027
998
procedure TCustomExpressionParser.Evaluate(AnExpression: string);
1044
1015
//CurrentIndex := Result;
1047
procedure TCustomExpressionParser.ReplaceFunction(OldName: string; AFunction:
1052
// clearing only allowed when expression is not present
1053
if (AFunction = nil) and (FCurrentRec <> nil) then
1054
raise Exception.Create('Cannot undefine function/variable while expression present');
1056
if FWordsList.Search(PChar(OldName), I) then
1058
// if no function specified, then no need to replace!
1059
if AFunction <> nil then
1060
ReplaceExprWord(FWordsList.Items[I], TExprWord(AFunction));
1061
FWordsList.AtFree(I);
1063
if AFunction <> nil then
1064
FWordsList.Add(AFunction);
1067
1018
procedure TCustomExpressionParser.ClearExpressions;
1069
1020
DisposeList(FCurrentRec);