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

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

?? zparser.pas

?? 一款由Zlib來的數學公式解析器
?? PAS
?? 第 1 頁 / 共 2 頁
字號:
{******************************************************************
*  (c)copyrights Capella Development Group, Donetsk 1999 - 2000
*  Project: Zeos Library
*  Module: Formula parser component
*  Author: Sergey Seroukhov   E-Mail: voland@kita.dgtu.donetsk.ua
*  Date: 26/03/99
*
*  List of changes:
*   27/03/99 - Class convert to component, add vars
*   16/04/99 - Add some functions, operators LIKE, XOR
*   23/04/99 - Add math functions
*     Fixed error in CheckParams method
*     Fixed Variable processing bug
*   13/11/99 - Add string resource
*   13/03/00 - Fixed style (Thanks Robert Marquardt)
******************************************************************}

unit ZParser;

{$R *.DCR}

interface

uses SysUtils, Classes, ZToken, ZMatch, Math;

{$INCLUDE Zeos.inc}

const
  MAX_PARSE_ITEMS = 100;
  MAX_PARSE_STACK = 100;
  MAX_PARSE_VARS  = 20;
  MAX_PARSE_FUNCS = 20;

type

  TParseItemType=(ptFunction, ptVariable, ptDelim, ptString, ptInteger, ptFloat,
    ptBoolean);

  TParseItem = record
    ItemValue: Variant;
    ItemType:  TParseItemType;
  end;

  TParseStack = array[0..MAX_PARSE_STACK] of Variant;

  TParseVar = record
    VarName:  string;
    VarValue: Variant;
  end;

  TZParser = class;

  TParseFunc = function(Sender: TZParser): Variant;

  TParseFuncRec = record
    FuncName: string;
    FuncPtr: TParseFunc;
  end;

  EParseException = class(Exception);

{*************** TZParser implementation *************}

  TZParser = class(TComponent)
  private
    FParseItems: array[0..MAX_PARSE_ITEMS] of TParseItem;
    FParseCount: Integer;
    FErrCheck:   Integer;
    FEquation:   string;
    FParseStack: TParseStack;
    FStackCount: Integer;
    FVars:       array[0..MAX_PARSE_VARS] of TParseVar;
    FVarCount:   Integer;
    FFuncs:      array[0..MAX_PARSE_FUNCS] of TParseFuncRec;
    FFuncCount:  Integer;

    function  ExtractTokenEx(var Buffer, Token: string): TParseItemType;
    function  OpLevel(Operat: string): Integer;
    function  Parse(Level: Integer; var Buffer: string): Integer;
    procedure SetEquation(Value: string);
    function  GetVar(VarName: string): Variant;
    procedure SetVar(VarName: string; VarValue: Variant);
    function  GetVarName(VarIndex: Integer): string;
    function  GetFunc(FuncName: string): TParseFunc;
    procedure SetFunc(FuncName: string; FuncPtr: TParseFunc);
    function  GetFuncName(FuncIndex: Integer): string;
    procedure CheckTypes(Value1: Variant; var Value2: Variant);
    function  ConvType(Value: Variant): Variant;
    function  CheckFunc(var Buffer: string): Boolean;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;

    function  Evalute: Variant;
    procedure Clear;
    procedure Push(Value: Variant);
    function  Pop: Variant;

    property Variables[Index: string]: Variant read GetVar  write SetVar;
    property VarCount: Integer read FVarCount;
    property VarNames[Index: Integer]: string read GetVarName;
    property Functions[Index: string]: TParseFunc read GetFunc write SetFunc;
    property FuncCount: Integer read FFuncCount;
    property FuncNames[Index: Integer]: string read GetFuncName;
  published
    property Equation: string read FEquation write SetEquation;
  end;

{ Component registration }
procedure Register;

implementation

uses ZExtra, ZCommonConst, ZVclUtils;

const
  tokABS   = 'ABS';
  tokAND   = 'AND';
  tokCOS   = 'COS';
  tokEXP   = 'EXP';
  tokFALSE = 'FALSE';
  tokIIF   = 'IIF';
  tokLIKE  = 'LIKE';
  tokLN    = 'LN';
  tokMAX   = 'MAX';
  tokMIN   = 'MIN';
  tokNOT   = 'NOT';
  tokNOW   = 'NOW';
  tokOR    = 'OR';
  tokSIN   = 'SIN';
  tokSQRT  = 'SQRT';
  tokSUM   = 'SUM';
  tokTAN   = 'TAN';
  tokTRUE  = 'TRUE';
  tokXOR   = 'XOR';

{************** User functions implementation *************}

{ Get current date and time }
function FuncNow(Sender: TZParser): Variant; forward;

{ Define minimal value }
function FuncMin(Sender: TZParser): Variant; forward;

{ Define maximum value }
function FuncMax(Sender: TZParser): Variant; forward;

{ Define result by value }
function FuncIIf(Sender: TZParser): Variant; forward;

{ Calculate sum of values }
function FuncSum(Sender: TZParser): Variant; forward;

{ Evalue sinus value }
function FuncSin(Sender: TZParser): Variant; forward;

{ Evalue cosinus value }
function FuncCos(Sender: TZParser): Variant; forward;

{ Evalue tangens value }
function FuncTan(Sender: TZParser): Variant; forward;

{ Evalue exponent value }
function FuncExp(Sender: TZParser): Variant; forward;

{ Evalue natural logoriphm value }
function FuncLn(Sender: TZParser): Variant; forward;

{ Evalue square root value }
function FuncSqrt(Sender: TZParser): Variant; forward;

{ Evalue absolute value }
function FuncAbs(Sender: TZParser): Variant; forward;

{******************* TZParser implementation ****************}

{ Class constructor }
constructor TZParser.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FErrCheck   := 0;
  FStackCount := 0;
  FVarCount   := 0;
  FFuncCount  := 0;
  SetFunc(tokNOW, FuncNow);
  SetFunc(tokMAX, FuncMax);
  SetFunc(tokMIN, FuncMin);
  SetFunc(tokIIF, FuncIIf);
  SetFunc(tokSUM, FuncSum);
  SetFunc(tokSIN, FuncSin);
  SetFunc(tokCOS, FuncCos);
  SetFunc(tokTAN, FuncTan);
  SetFunc(tokEXP, FuncExp);
  SetFunc(tokLN,  FuncLn);
  SetFunc(tokABS, FuncAbs);
  SetFunc(tokSQRT,FuncSqrt);
end;

{ Class destructor }
destructor TZParser.Destroy;
begin
  inherited Destroy;
end;

{ Extract highlevel lexem }
function TZParser.ExtractTokenEx(var Buffer, Token: string): TParseItemType;
var
  P: Integer;
  Temp: string;
  TokenType: TTokenType;
begin
  repeat
    TokenType := ExtractToken(Buffer, Token);
  until (Token <> tokNL) and (Token <> tokCR);
  if Token = '[' then
  begin
    TokenType := ttAlpha;
    P := Pos(']',Buffer);
    Token := '';
    if P > 0 then
    begin
      Token  := Copy(Buffer, 1, P-1);
      Buffer := Copy(Buffer, P+1, Length(Buffer)-P);
    end;
  end;
  if (Buffer <> '') and (Token = '>') and (Buffer[1] = '=') then
  begin
    ExtractToken(Buffer, Temp);
    Token := Token + Temp;
  end;
  if (Buffer <> '') and (Token = '<') and ((Buffer[1] = '=')
    or (Buffer[1] = '>')) then
  begin
    ExtractToken(Buffer, Temp);
    Token := Token + Temp;
  end;
  Temp := UpperCase(Token);
  if (Temp = tokAND) or (Temp = tokNOT) or (Temp = tokOR)
    or (Temp = tokXOR) or (Temp = tokLIKE) then
  begin
    Token  := Temp;
    Result := ptDelim;
    Exit;
  end;
  if (Temp = tokTRUE) or (Temp = tokFALSE) then
  begin
    Token  := Temp;
    Result := ptBoolean;
    Exit;
  end;

  Result := ptString;
  case TokenType of
    ttAlpha:
      Result := ptVariable;
    ttDelim:
      Result := ptDelim;
    ttDigit:
      begin
        if (Buffer <> '') and (Buffer[1] = '.') then
        begin
          ExtractToken(Buffer, Temp);
          Token := Token + '.';
          if (Buffer <> '') and (Buffer[1] >= '0') and (Buffer[1] <= '9') then
          begin
            ExtractToken(Buffer,Temp);
            Token := Token + Temp;
          end;
          Result := ptFloat;
        end else
          Result := ptInteger;
      end;
  end;
end;

{ Get priority level of operation }
function TZParser.OpLevel(Operat: string): Integer;
var
  Temp: string;
begin
  Result := 7;
  Temp := UpperCase(Operat);
  if (Temp = tokAND) or (Temp = tokOR) or (Temp = tokXOR) then
    Result := 1;
  if Temp = tokNOT then
    Result := 2;
  if (Temp = '<') or (Temp = '>') or (Temp = '=') or (Temp = '>=')
    or(Temp = '<=') or (Temp = '<>') then
    Result := 3;
  if (Temp[1] = '+') or (Temp[1] = '-') or (Temp = tokLIKE) then
    Result := 4;
  if (Temp[1] = '/') or (Temp[1] = '*') or (Temp[1] = '%') then
    Result := 5;
  if (Temp[1] = '^') then
    Result := 6;
end;

{ Internal convert equation from infix form to postfix }
function TZParser.Parse(Level: Integer; var Buffer: string): Integer;
var
  ParseType: TParseItemType;
  Token, FuncName: string;
  NewLevel, Params, SaveCount: Integer;
  Temp: Char;
begin
  Result := 0;
  while Buffer <> '' do
  begin
    ParseType := ExtractTokenEx(Buffer, Token);
    if Token = '' then
      Exit;
    if (Token = ')') or (Token = ',') then
    begin
      PutbackToken(Buffer, Token);
      Exit;
    end;
    if Token = '(' then
    begin
      FErrCheck := 0;
      Parse(0,Buffer);
      ExtractTokenEx(Buffer, Token);
      if Token <> ')' then
        raise EParseException.Create(ResStr(SSyntaxError));
      FErrCheck := 1;
      Continue;
    end;

    if ParseType = ptDelim then
    begin
      NewLevel := OpLevel(Token);

      if (FErrCheck = 2) and (Token <> tokNOT) then
        raise EParseException.Create(ResStr(SSyntaxError));
      if FErrCheck = 0 then
        if (Token <> tokNOT) and (Token <> '+') and (Token <> '-') then
          raise EParseException.Create(ResStr(SSyntaxError))
        else if Token <> tokNOT then
          NewLevel := 6;

      if (Token <> tokNOT) and (NewLevel <= Level) then
      begin
        PutbackToken(Buffer, Token);
        Result := NewLevel;
        Exit;
      end else if (Token = tokNOT) and (NewLevel < Level) then
      begin
        PutbackToken(Buffer, Token);
        Result := NewLevel;
        Exit;
      end;

      if (FErrCheck = 0) and (Token = '+') then
        Continue;
      if (FErrCheck = 0) and (Token = '-') then
        Token := '~';
      FErrCheck := 2;

      while (Buffer <> '') and (Buffer[1] <> ')')
        and (Parse(NewLevel, Buffer) > NewLevel) do;
      FParseItems[FParseCount].ItemValue := Token;
      FParseItems[FParseCount].ItemType  := ptDelim;
      Inc(FParseCount);
      Result := NewLevel;
      Continue;
    end;

    if FErrCheck = 1 then
      raise EParseException.Create(ResStr(SSyntaxError));
    FErrCheck := 1;

    case ParseType of
      ptVariable:
        begin
          FParseItems[FParseCount].ItemValue := Token;
          if CheckFunc(Buffer) then
            ParseType := ptFunction
          else
            SetVar(Token, NULL);
        end;
      ptInteger:
        FParseItems[FParseCount].ItemValue := StrToInt(Token);
      ptFloat:
        begin
          Temp := DecimalSeparator;
          DecimalSeparator := '.';
          FParseItems[FParseCount].ItemValue := StrToFloat(Token);
          DecimalSeparator := Temp;
        end;
      ptString:
        begin
          DeleteQuotes(Token);
          FParseItems[FParseCount].ItemValue := Token;
        end;
      ptBoolean:
        FParseItems[FParseCount].ItemValue := (Token = tokTRUE);
    end;

{ Process function params }
    if ParseType = ptFunction then
    begin
      FuncName  := AnsiUpperCase(Token);
      SaveCount := FParseCount;
      Params    := 0;
      repeat
        FErrCheck := 0;
        Parse(0,Buffer);
        ExtractTokenEx(Buffer, Token);
        case Token[1] of
          ',':
            begin
              Inc(Params);
              Continue;
            end;
          ')':
            begin
              if SaveCount < FParseCount then
                Inc(Params);
              FParseItems[FParseCount].ItemValue := ConvType(Params);
              FParseItems[FParseCount].ItemType  := ptInteger;
              Inc(FParseCount);
              Break;
            end;
          else
            raise EParseException.Create(ResStr(SSyntaxError));
        end;
      until Buffer = '';
      FParseItems[FParseCount].ItemValue := FuncName;
    end;

    FParseItems[FParseCount].ItemValue :=
      ConvType(FParseItems[FParseCount].ItemValue);
    FParseItems[FParseCount].ItemType := ParseType;
    Inc(FParseCount);
  end;
end;

{ Split equation to stack }
procedure TZParser.SetEquation(Value: string);
begin
  FParseCount := 0;
  FErrCheck   := 0;
  FEquation   := Value;
//  while Value<>'' do
  Parse(0, Value);
end;

{ Get variable name by it index }
function TZParser.GetVarName(VarIndex: Integer): string;
begin
  if VarIndex >= FVarCount then
    raise EParseException.Create(ResStr(SIncorVarIdx));
  Result := AnsiUpperCase(FVars[VarIndex].VarName);
end;

{ Get variable value }
function TZParser.GetVar(VarName: string): Variant;
var
  I: Integer;
begin
  VarName := AnsiUpperCase(VarName);
  I := 0;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲激情校园春色| 中文字幕日韩av资源站| 艳妇臀荡乳欲伦亚洲一区| 国产传媒欧美日韩成人| 丰满岳乱妇一区二区三区| 国产三级一区二区| 美女www一区二区| 精品国产污网站| 香蕉影视欧美成人| 欧美大片一区二区| 国产精品一区二区免费不卡| 久久男人中文字幕资源站| 蜜桃av噜噜一区| 国产视频一区二区在线| 成a人片亚洲日本久久| 夜夜精品浪潮av一区二区三区| 欧洲中文字幕精品| 亚洲日本在线观看| 久久精品欧美日韩精品| 成人国产精品免费观看动漫| 欧美日韩精品福利| 国产一区二区三区观看| 亚洲婷婷国产精品电影人久久| 欧美日韩一级二级三级| 亚洲色图欧美偷拍| 日韩欧美二区三区| 91美女片黄在线观看91美女| 日韩电影免费在线看| 国产偷国产偷精品高清尤物| 欧美亚洲国产一区二区三区va| 免费美女久久99| 艳妇臀荡乳欲伦亚洲一区| 国产日本欧洲亚洲| 久久午夜电影网| 日韩欧美高清在线| 欧美区在线观看| 一本一道波多野结衣一区二区| 久久超碰97中文字幕| 日本怡春院一区二区| 亚洲一区在线观看视频| 精品av久久707| 欧美精品粉嫩高潮一区二区| 色婷婷国产精品| 色综合天天在线| 91香蕉视频mp4| 91激情在线视频| 欧美亚洲一区二区在线| 国产成人一区二区精品非洲| 人禽交欧美网站| 国产盗摄一区二区| 99久久免费精品| 99热这里都是精品| 欧美亚一区二区| 正在播放亚洲一区| 久久久久国产精品麻豆ai换脸| 国产亚洲福利社区一区| 亚洲欧美一区二区在线观看| 亚洲综合在线第一页| 蜜臀久久99精品久久久久宅男| 日韩高清在线观看| 欧美在线免费观看视频| 91精品国产综合久久久久久| 日韩你懂的在线播放| 日本一区二区三级电影在线观看 | 亚洲成av人片在线| 91精品办公室少妇高潮对白| 51精品国自产在线| 欧美国产乱子伦| 亚洲一区av在线| 国产精品99久久久| 欧美视频在线观看一区二区| 国产喂奶挤奶一区二区三区| 午夜欧美大尺度福利影院在线看| 成人av资源在线| 日韩一本二本av| 亚洲欧洲性图库| 欧美丝袜丝交足nylons| 日韩免费观看2025年上映的电影| 久久久久久亚洲综合影院红桃| 天天综合网 天天综合色| 91碰在线视频| 伊人开心综合网| 欧美午夜影院一区| 亚洲一区二区三区不卡国产欧美| 成人av电影在线| 国产精品美女久久久久久久| 国产精品1024久久| 国产喂奶挤奶一区二区三区| 成人涩涩免费视频| 中文字幕第一区二区| aaa国产一区| 午夜精品福利一区二区蜜股av| 裸体一区二区三区| 91原创在线视频| 久久精品人人做人人综合 | 91久久一区二区| 亚洲夂夂婷婷色拍ww47| 日本不卡视频在线观看| 亚洲精选在线视频| 国产老妇另类xxxxx| 久久久91精品国产一区二区精品| www.欧美色图| 婷婷久久综合九色综合伊人色| 日韩欧美资源站| av一区二区三区黑人| 极品少妇一区二区三区精品视频| 久久精品一区二区| 欧美日韩一级视频| 91黄色免费观看| fc2成人免费人成在线观看播放| 青青草国产精品97视觉盛宴| 亚洲免费观看高清完整版在线观看熊| 久久伊人蜜桃av一区二区| 欧美一级国产精品| 欧美酷刑日本凌虐凌虐| 欧美日韩久久久一区| 欧美丝袜丝nylons| 欧美福利视频一区| 欧美不卡一区二区三区四区| 日韩亚洲欧美一区二区三区| 日韩免费在线观看| 国产亚洲综合性久久久影院| 久久精品男人的天堂| 中文字幕视频一区| 亚洲夂夂婷婷色拍ww47| 久久99国产精品麻豆| 国产一区二区看久久| 成人视屏免费看| 欧美乱熟臀69xxxxxx| 精品国产91九色蝌蚪| 国产精品久久毛片| 男女男精品网站| 国产91高潮流白浆在线麻豆| 欧美四级电影在线观看| 国产视频一区在线播放| 亚洲激情综合网| 国产一区二区精品久久91| 91亚洲国产成人精品一区二三 | 亚洲一区二区美女| 国产精品2024| 欧美日韩高清影院| 欧美日韩国产免费| 国产精品拍天天在线| 五月婷婷综合网| 99这里只有久久精品视频| 欧美va亚洲va在线观看蝴蝶网| 一区二区三区加勒比av| 国产高清在线精品| 久久综合久久鬼色中文字| 亚洲成人黄色小说| 91久久香蕉国产日韩欧美9色| www一区二区| 极品少妇xxxx精品少妇| 精品国产伦一区二区三区观看方式 | 欧美乱熟臀69xxxxxx| 国产精品嫩草影院com| 黄色精品一二区| 国产精品萝li| 国产久卡久卡久卡久卡视频精品| 91精品国产麻豆| 国内精品国产成人| 国产色产综合产在线视频| 国产精品一区二区久激情瑜伽| 精品国产一区二区在线观看| 久久99久久精品| 欧美精品一区二区三区高清aⅴ| 国产寡妇亲子伦一区二区| 免费成人你懂的| 精品国产精品网麻豆系列| 国产剧情一区二区三区| 国产精品久久久久久久久免费相片| 毛片av中文字幕一区二区| 久久综合色婷婷| 色呦呦日韩精品| 午夜电影一区二区三区| 久久青草国产手机看片福利盒子 | 精品国产伦一区二区三区免费| 国产伦精一区二区三区| 亚洲免费毛片网站| 亚洲精品在线免费播放| 在线国产电影不卡| 国产精品白丝jk黑袜喷水| 性做久久久久久免费观看欧美| 国产精品色哟哟| 日韩一区二区中文字幕| 8x8x8国产精品| 色综合久久久久网| www.色精品| 成人av在线资源网| 强制捆绑调教一区二区| 在线观看免费亚洲| 亚洲成人动漫在线免费观看| 91精品综合久久久久久| 在线欧美小视频| 色狠狠一区二区| 92精品国产成人观看免费| 成人免费视频网站在线观看| 国产精品996| 不卡一区中文字幕| 色偷偷一区二区三区|