亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? parsing.pas

?? RX Library contains a large number of components, objects and routines for Borland Delphi with full
?? PAS
字號:
{*******************************************************}
{                                                       }
{         Delphi VCL Extensions (RX)                    }
{                                                       }
{         Copyright (c) 1995, 1996 AO ROSNO             }
{         Copyright (c) 1997, 1998 Master-Bank          }
{                                                       }
{*******************************************************}

unit Parsing;

interface

{$I RX.INC}

uses SysUtils, Classes;

type
  TParserFunc = (pfArcTan, pfCos, pfSin, pfTan, pfAbs, pfExp, pfLn, pfLog,
    pfSqrt, pfSqr, pfInt, pfFrac, pfTrunc, pfRound, pfArcSin, pfArcCos,
    pfSign, pfNot);
  ERxParserError = class(Exception);
{$IFDEF WIN32}
  TUserFunction = function(Value: Extended): Extended;
{$ELSE}
  TUserFunction = Pointer;
{$ENDIF}

  TRxMathParser = class(TObject)
  private
    FCurPos: Cardinal;
    FParseText: string;
    function GetChar: Char;
    procedure NextChar;
    function GetNumber(var AValue: Extended): Boolean;
    function GetConst(var AValue: Extended): Boolean;
    function GetFunction(var AValue: TParserFunc): Boolean;
    function GetUserFunction(var Index: Integer): Boolean;
    function Term: Extended;
    function SubTerm: Extended;
    function Calculate: Extended;
  public
    function Exec(const AFormula: string): Extended;
    class procedure RegisterUserFunction(const Name: string; Proc: TUserFunction);
    class procedure UnregisterUserFunction(const Name: string);
  end;

function GetFormulaValue(const Formula: string): Extended;

{$IFNDEF WIN32}
function Power(Base, Exponent: Extended): Extended;
{$ENDIF}

implementation

uses RxTConst;

const
  SpecialChars = [#0..' ', '+', '-', '/', '*', ')', '^'];

  FuncNames: array[TParserFunc] of PChar =
    ('ARCTAN', 'COS', 'SIN', 'TAN', 'ABS', 'EXP', 'LN', 'LOG',
    'SQRT', 'SQR', 'INT', 'FRAC', 'TRUNC', 'ROUND', 'ARCSIN', 'ARCCOS',
    'SIGN', 'NOT');

{ Parser errors }

procedure InvalidCondition(Str: Word);
begin
  raise ERxParserError.Create(LoadStr(Str));
end;

{ IntPower and Power functions are copied from Borland's MATH.PAS unit }

function IntPower(Base: Extended; Exponent: Integer): Extended;
{$IFDEF WIN32}
asm
        mov     ecx, eax
        cdq
        fld1                      { Result := 1 }
        xor     eax, edx
        sub     eax, edx          { eax := Abs(Exponent) }
        jz      @@3
        fld     Base
        jmp     @@2
@@1:    fmul    ST, ST            { X := Base * Base }
@@2:    shr     eax,1
        jnc     @@1
        fmul    ST(1),ST          { Result := Result * X }
        jnz     @@1
        fstp    st                { pop X from FPU stack }
        cmp     ecx, 0
        jge     @@3
        fld1
        fdivrp                    { Result := 1 / Result }
@@3:
        fwait
end;
{$ELSE}
var
  Y: Longint;
begin
  Y := Abs(Exponent);
  Result := 1.0;
  while Y > 0 do begin
    while not Odd(Y) do begin
      Y := Y shr 1;
      Base := Base * Base;
    end;
    Dec(Y);
    Result := Result * Base;
  end;
  if Exponent < 0 then Result := 1.0 / Result;
end;
{$ENDIF WIN32}

function Power(Base, Exponent: Extended): Extended;
begin
  if Exponent = 0.0 then Result := 1.0
  else if (Base = 0.0) and (Exponent > 0.0) then Result := 0.0
  else if (Frac(Exponent) = 0.0) and (Abs(Exponent) <= MaxInt) then
    Result := IntPower(Base, Trunc(Exponent))
  else Result := Exp(Exponent * Ln(Base))
end;

{ User defined functions }

type
{$IFDEF WIN32}
  TFarUserFunction = TUserFunction;
{$ELSE}
  TFarUserFunction = function(Value: Extended): Extended;
{$ENDIF}

var
  UserFuncList: TStrings;

function GetUserFuncList: TStrings;
begin
  if not Assigned(UserFuncList) then begin
    UserFuncList := TStringList.Create;
    with TStringList(UserFuncList) do begin
      Sorted := True;
      Duplicates := dupIgnore;
    end;
  end;
  Result := UserFuncList;
end;

procedure FreeUserFunc; far;
begin
  UserFuncList.Free;
  UserFuncList := nil;
end;

{ Parsing routines }

function GetFormulaValue(const Formula: string): Extended;
begin
  with TRxMathParser.Create do
  try
    Result := Exec(Formula);
  finally
    Free;
  end;
end;

{ TRxMathParser }

function TRxMathParser.GetChar: Char;
begin
  Result := FParseText[FCurPos];
end;

procedure TRxMathParser.NextChar;
begin
  Inc(FCurPos);
end;

function TRxMathParser.GetNumber(var AValue: Extended): Boolean;
var
  C: Char;
  SavePos: Cardinal;
  Code: Integer;
  IsHex: Boolean;
  TmpStr: string;
begin
  Result := False;
  C := GetChar;
  SavePos := FCurPos;
  TmpStr := '';
  IsHex := False;
  if C = '$' then begin
    TmpStr := C;
    NextChar;
    C := GetChar;
    while C in ['0'..'9', 'A'..'F', 'a'..'f'] do begin
      TmpStr := TmpStr + C;
      NextChar;
      C := GetChar;
    end;
    IsHex := True;
    Result := (Length(TmpStr) > 1) and (Length(TmpStr) <= 9);
  end
  else if C in ['+', '-', '0'..'9', '.', DecimalSeparator] then begin
    if (C in ['.', DecimalSeparator]) then TmpStr := '0' + '.'
    else TmpStr := C;
    NextChar;
    C := GetChar;
    if (Length(TmpStr) = 1) and (TmpStr[1] in ['+', '-']) and
      (C in ['.', DecimalSeparator]) then TmpStr := TmpStr + '0';
    while C in ['0'..'9', '.', 'E', 'e', DecimalSeparator] do begin
      if C = DecimalSeparator then TmpStr := TmpStr + '.'
      else TmpStr := TmpStr + C;
      if (C = 'E') then begin
        if (Length(TmpStr) > 1) and (TmpStr[Length(TmpStr) - 1] = '.') then
          Insert('0', TmpStr, Length(TmpStr));
        NextChar;
        C := GetChar;
        if (C in ['+', '-']) then begin
          TmpStr := TmpStr + C;
          NextChar;
        end;
      end
      else NextChar;
      C := GetChar;
    end;
    if (TmpStr[Length(TmpStr)] = '.') and (Pos('E', TmpStr) = 0) then
      TmpStr := TmpStr + '0';
    Val(TmpStr, AValue, Code);
    Result := (Code = 0);
  end;
  Result := Result and (FParseText[FCurPos] in SpecialChars);
  if Result then begin
    if IsHex then AValue := StrToInt(TmpStr)
    { else AValue := StrToFloat(TmpStr) };
  end
  else begin
    AValue := 0;
    FCurPos := SavePos;
  end;
end;

function TRxMathParser.GetConst(var AValue: Extended): Boolean;
begin
  Result := False;
  case FParseText[FCurPos] of
    'E':
      if FParseText[FCurPos + 1] in SpecialChars then
      begin
        AValue := Exp(1);
        Inc(FCurPos);
        Result := True;
      end;
    'P':
      if (FParseText[FCurPos + 1] = 'I') and
        (FParseText[FCurPos + 2] in SpecialChars) then
      begin
        AValue := Pi;
        Inc(FCurPos, 2);
        Result := True;
      end;
  end
end;

function TRxMathParser.GetUserFunction(var Index: Integer): Boolean;
var
  TmpStr: string;
  I: Integer;
begin
  Result := False;
  if (FParseText[FCurPos] in ['A'..'Z', 'a'..'z', '_']) and
    Assigned(UserFuncList) then
  begin
    with UserFuncList do
      for I := 0 to Count - 1 do begin
        TmpStr := Copy(FParseText, FCurPos, Length(Strings[I]));
        if (CompareText(TmpStr, Strings[I]) = 0) and
          (Objects[I] <> nil) then
        begin
          if FParseText[FCurPos + Cardinal(Length(TmpStr))] = '(' then
          begin
            Result := True;
            Inc(FCurPos, Length(TmpStr));
            Index := I;
            Exit;
          end;
        end;
      end;
  end;
  Index := -1;
end;

function TRxMathParser.GetFunction(var AValue: TParserFunc): Boolean;
var
  I: TParserFunc;
  TmpStr: string;
begin
  Result := False;
  AValue := Low(TParserFunc);
  if FParseText[FCurPos] in ['A'..'Z', 'a'..'z', '_'] then begin
    for I := Low(TParserFunc) to High(TParserFunc) do begin
      TmpStr := Copy(FParseText, FCurPos, StrLen(FuncNames[I]));
      if CompareText(TmpStr, StrPas(FuncNames[I])) = 0 then begin
        AValue := I;
        if FParseText[FCurPos + Cardinal(Length(TmpStr))] = '(' then begin
          Result := True;
          Inc(FCurPos, Length(TmpStr));
          Break;
        end;
      end;
    end;
  end;
end;

function TRxMathParser.Term: Extended;
var
  Value: Extended;
  NoFunc: TParserFunc;
  UserFunc: Integer;
  Func: Pointer;
begin
  if FParseText[FCurPos] = '(' then begin
    Inc(FCurPos);
    Value := Calculate;
    if FParseText[FCurPos] <> ')' then InvalidCondition(SParseNotCramp);
    Inc(FCurPos);
  end
  else begin
    if not GetNumber(Value) then
      if not GetConst(Value) then
        if GetUserFunction(UserFunc) then begin
          Inc(FCurPos);
          Func := UserFuncList.Objects[UserFunc];
          Value := TFarUserFunction(Func)(Calculate);
          if FParseText[FCurPos] <> ')' then InvalidCondition(SParseNotCramp);
          Inc(FCurPos);
        end
        else if GetFunction(NoFunc) then begin
          Inc(FCurPos);
          Value := Calculate;
          try
            case NoFunc of
              pfArcTan: Value := ArcTan(Value);
              pfCos: Value := Cos(Value);
              pfSin: Value := Sin(Value);
              pfTan:
                if Cos(Value) = 0 then InvalidCondition(SParseDivideByZero)
                else Value := Sin(Value) / Cos(Value);
              pfAbs: Value := Abs(Value);
              pfExp: Value := Exp(Value);
              pfLn:
                if Value <= 0 then InvalidCondition(SParseLogError)
                else Value := Ln(Value);
              pfLog:
                if Value <= 0 then InvalidCondition(SParseLogError)
                else Value := Ln(Value) / Ln(10);
              pfSqrt:
                if Value < 0 then InvalidCondition(SParseSqrError)
                else Value := Sqrt(Value);
              pfSqr: Value := Sqr(Value);
              pfInt: Value := Round(Value);
              pfFrac: Value := Frac(Value);
              pfTrunc: Value := Trunc(Value);
              pfRound: Value := Round(Value);
              pfArcSin:
                if Value = 1 then Value := Pi / 2
                else Value := ArcTan(Value / Sqrt(1 - Sqr(Value)));
              pfArcCos:
                if Value = 1 then Value := 0
                else Value := Pi / 2 - ArcTan(Value / Sqrt(1 - Sqr(Value)));
              pfSign:
                if Value > 0 then Value := 1
                else if Value < 0 then Value := -1;
              pfNot: Value := not Trunc(Value);
            end;
          except
            on E: ERxParserError do raise
            else InvalidCondition(SParseInvalidFloatOperation);
          end;
          if FParseText[FCurPos] <> ')' then InvalidCondition(SParseNotCramp);
          Inc(FCurPos);
        end
        else InvalidCondition(SParseSyntaxError);
  end;
  Result := Value;
end;

function TRxMathParser.SubTerm: Extended;
var
  Value: Extended;
begin
  Value := Term;
  while FParseText[FCurPos] in ['*', '^', '/'] do begin
    Inc(FCurPos);
    if FParseText[FCurPos - 1] = '*' then
      Value := Value * Term
    else if FParseText[FCurPos - 1] = '^' then
      Value := Power(Value, Term)
    else if FParseText[FCurPos - 1] = '/' then
      try
        Value := Value / Term;
      except
        InvalidCondition(SParseDivideByZero);
      end;
  end;
  Result := Value;
end;

function TRxMathParser.Calculate: Extended;
var
  Value: Extended;
begin
  Value := SubTerm;
  while FParseText[FCurPos] in ['+', '-'] do begin
    Inc(FCurPos);
    if FParseText[FCurPos - 1] = '+' then Value := Value + SubTerm
    else Value := Value - SubTerm;
  end;
  if not (FParseText[FCurPos] in [#0, ')', '>', '<', '=', ',']) then
    InvalidCondition(SParseSyntaxError);
  Result := Value;
end;

function TRxMathParser.Exec(const AFormula: string): Extended;
var
  I, J: Integer;
begin
  J := 0;
  Result := 0;
  FParseText := '';
  for I := 1 to Length(AFormula) do begin
    case AFormula[I] of
      '(': Inc(J);
      ')': Dec(J);
    end;
    if AFormula[I] > ' ' then FParseText := FParseText + UpCase(AFormula[I]);
  end;
  if J = 0 then begin
    FCurPos := 1;
    FParseText := FParseText + #0;
    if (FParseText[1] in ['-', '+']) then FParseText := '0' + FParseText;
    Result := Calculate;
  end
  else InvalidCondition(SParseNotCramp);
end;

class procedure TRxMathParser.RegisterUserFunction(const Name: string;
  Proc: TUserFunction);
var
  I: Integer;
begin
  if (Length(Name) > 0) and (Name[1] in ['A'..'Z', 'a'..'z', '_']) then
  begin
    if not Assigned(Proc) then UnregisterUserFunction(Name)
    else begin
      with GetUserFuncList do begin
        I := IndexOf(Name);
        if I < 0 then I := Add(Name);
{$IFDEF WIN32}
        Objects[I] := @Proc;
{$ELSE}
        Objects[I] := Proc;
{$ENDIF}
      end;
    end;
  end
  else InvalidCondition(SParseSyntaxError);
end;

class procedure TRxMathParser.UnregisterUserFunction(const Name: string);
var
  I: Integer;
begin
  if Assigned(UserFuncList) then
    with UserFuncList do begin
      I := IndexOf(Name);
      if I >= 0 then Delete(I);
      if Count = 0 then FreeUserFunc;
    end;
end;

initialization
  UserFuncList := nil;
{$IFDEF WIN32}
finalization
  FreeUserFunc;  
{$ELSE}
  AddExitProc(FreeUserFunc);
{$ENDIF}
end.

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩成人一级大片| 亚洲一区二区中文在线| 久国产精品韩国三级视频| 欧美一区二区三区婷婷月色| 男女男精品视频| 久久久五月婷婷| 99视频精品在线| 一个色综合av| 91精选在线观看| 国产在线精品不卡| 亚洲欧洲性图库| 欧美日韩国产综合草草| 免费成人结看片| 亚洲日本va午夜在线影院| 91高清视频在线| 美女尤物国产一区| 欧美韩国日本一区| 欧美视频一区二区三区四区 | 国产精品区一区二区三| 91蝌蚪porny成人天涯| 丝袜亚洲另类欧美综合| 精品盗摄一区二区三区| 99精品一区二区三区| 亚洲一区二区三区四区五区中文| 91麻豆精品国产91久久久久久| 国产一区二区三区在线观看精品 | 7777精品伊人久久久大香线蕉 | 久久精工是国产品牌吗| 国产亚洲精品7777| 欧美午夜精品一区二区蜜桃| 美腿丝袜亚洲一区| 亚洲日本丝袜连裤袜办公室| 日韩午夜激情视频| 99视频一区二区三区| 美女在线视频一区| 亚洲人精品午夜| 精品国产一区二区三区久久影院| 91免费看`日韩一区二区| 青青草视频一区| 亚洲天堂免费在线观看视频| 日韩亚洲电影在线| 91热门视频在线观看| 久久99久久久久久久久久久| ...av二区三区久久精品| 欧美一级片在线看| 色偷偷久久人人79超碰人人澡| 狠狠色综合播放一区二区| 亚洲欧美成人一区二区三区| 久久亚洲精品国产精品紫薇| 欧美日韩一区 二区 三区 久久精品| 国产露脸91国语对白| 五月婷婷欧美视频| 亚洲色图视频网| 亚洲国产经典视频| 欧美精品一区二区高清在线观看 | 国产精品一区二区三区99| 亚洲大片精品永久免费| 国产精品麻豆一区二区 | 色综合久久88色综合天天| 国产在线不卡一区| 久久er99精品| 日韩精彩视频在线观看| 亚洲国产欧美另类丝袜| 亚洲欧美另类小说视频| 久久精品欧美日韩| 久久五月婷婷丁香社区| 精品奇米国产一区二区三区| 4438x亚洲最大成人网| 欧亚洲嫩模精品一区三区| 91色在线porny| 91免费在线视频观看| gogogo免费视频观看亚洲一| 国产1区2区3区精品美女| 激情小说亚洲一区| 欧美日韩国产一级片| 色偷偷一区二区三区| 91麻豆免费观看| 99re热视频精品| 91丝袜呻吟高潮美腿白嫩在线观看| 成人听书哪个软件好| 成人一区二区视频| eeuss鲁片一区二区三区在线观看| 国产成人免费在线视频| 国产凹凸在线观看一区二区| 粉嫩av一区二区三区粉嫩| 国产激情一区二区三区| 成人h动漫精品一区二区| 国产91色综合久久免费分享| 成人丝袜视频网| www.日韩av| 在线观看www91| 在线成人免费观看| 日韩色在线观看| 久久精品人人做人人爽97| 国产精品美女久久久久aⅴ国产馆 国产精品美女久久久久av爽李琼 国产精品美女久久久久高潮 | 亚洲免费av在线| 亚洲线精品一区二区三区 | 亚洲国产高清不卡| 亚洲三级久久久| 亚洲高清视频中文字幕| 日韩av在线播放中文字幕| 精品一区二区三区的国产在线播放 | 成人sese在线| 欧美优质美女网站| 91精品国产麻豆国产自产在线| 精品剧情在线观看| 中文一区一区三区高中清不卡| 国产原创一区二区三区| 91麻豆免费观看| 日韩视频免费观看高清在线视频| 国产无人区一区二区三区| 亚洲欧美日韩系列| 另类调教123区| 成人av一区二区三区| 欧美视频你懂的| 久久欧美一区二区| 亚洲一区二区三区不卡国产欧美| 日本成人在线一区| fc2成人免费人成在线观看播放| 欧美日韩黄色一区二区| 国产欧美日韩在线视频| 亚洲午夜成aⅴ人片| 国产精品一卡二| 欧美另类高清zo欧美| 欧美国产精品一区二区| 日韩成人免费看| 91色婷婷久久久久合中文| 日韩欧美在线一区二区三区| 亚洲色图欧洲色图| 国产一区二区电影| 欧美精品丝袜中出| 亚洲欧美视频在线观看| 国产在线精品免费| 91精品国产综合久久久久久漫画 | 精品久久久久99| 一区二区三区毛片| 国产激情一区二区三区四区| 欧美精品一级二级| 亚洲精品一二三四区| 国产mv日韩mv欧美| 精品乱人伦小说| 亚洲成人av福利| 99久久99精品久久久久久| 久久久三级国产网站| 天涯成人国产亚洲精品一区av| 99久久精品免费观看| 国产亚洲欧美日韩日本| 久久国内精品视频| 777xxx欧美| 亚洲国产wwwccc36天堂| 色视频成人在线观看免| 国产精品美日韩| 国产精品 日产精品 欧美精品| 欧美一区二区三区免费在线看| 亚洲一线二线三线久久久| 不卡影院免费观看| 国产精品美女久久久久久久久久久| 黄色日韩网站视频| 久久亚洲私人国产精品va媚药| 久久精品国产99国产| 欧美一区二区视频网站| 日韩国产一二三区| 欧美精品第1页| 舔着乳尖日韩一区| 制服丝袜成人动漫| 日韩国产一二三区| 日韩一区国产二区欧美三区| 男人的j进女人的j一区| 欧美一区二区三区视频免费| 日本va欧美va欧美va精品| 69堂国产成人免费视频| 日本不卡不码高清免费观看| 在线电影国产精品| 美日韩一区二区三区| 日韩欧美专区在线| 九色|91porny| 国产网站一区二区三区| 风间由美一区二区三区在线观看| 国产精品三级电影| 色综合天天综合给合国产| 一区二区三区不卡视频| 欧美日韩美女一区二区| 麻豆专区一区二区三区四区五区| 日韩三级免费观看| 国产成人综合网站| 亚洲欧美日韩系列| 欧美日韩极品在线观看一区| 奇米综合一区二区三区精品视频| 精品不卡在线视频| 国产sm精品调教视频网站| 自拍偷自拍亚洲精品播放| 欧美日韩在线综合| 九一久久久久久| 中文字幕日本乱码精品影院| 欧美色图12p| 精一区二区三区| 国产精品国产自产拍高清av王其| 欧洲视频一区二区| 九九精品一区二区| 亚洲美女视频在线观看|