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

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

?? hwexpression.pas

?? 另一個簡單的公式解釋器
?? PAS
字號:
unit hwExpression;
{**********************************************************************************************
  表達式解析器
  2002-01-11

  功能:
        解析一個有待于計算的表達式,支持表達式內嵌入函數、變量、引用,支持基本數學運算,支持
        部分Delphi內部數學函數;支持用戶自定義的函數。
        對于用戶自定義的函數,格式如下:
        function_name ( argument_name [, argument_name ....]) = expression
        支持的數學運算符有:
        + - * / ^ !
  特殊符號含義:
        @         引用標識,指明緊隨其后的Token為表達單元、單元格、映射、用戶常量、查詢結果
                  等值;
        %a        系統內部變量

 **********************************************************************************************
}
interface

uses Classes, Sysutils, Math;

type
  //定義Token類型, 目前的類型有空,數字,括號,操作符,字符串,空格,變量,系統變量
  TTokenType = (ttNone, ttNumeric, ttParenthesis, ttOperation, ttString, ttSpace, ttVariable,
                ttReference, ttSysVariable, ttStringValue);

  //被TExpParser 和TExpNode調用的類,用于將文本剪裁成Token,并創建語法樹(syntax tree)。
  TExpToken = class
  private
    FText: string;
    FTokenType: TTokenType;
  public
    property Text: string read FText;
    property TokenType: TTokenType read FTokenType;
  end;

  //分解文本為Token的引擎
  TExpParser = class
  private
    FExpression: string;
    FToken: TList;
    FPos: Integer;
  protected
    procedure Clear;
    function  GetToken(Index: integer): TExpToken;
    procedure SetExpression(const Value: string);
  public
    constructor Create;
    destructor  Destroy; override;

    function ReadFirstToken: TExpToken;
    function ReadNextToken:TExpToken;

    function TokenCount: Integer;
    property Tokens[Index: integer]: TExpToken read GetToken;
    property TokenList: TList read FTokens;
    property Expression: String read FExpresstion write SetExpresstion;
  end;

  //syntax-tree節點。
  TExpNode = class
  private
    FOwner: TObject;
    FParent: TExpNode;
    FChildren: TList;
    FTokens: TList;
    FLevel: Integer;
    FToken: TExpToken;
    FOnEvaluate: TOnEvaluate;
    FOnVariable: TOnVariable;
  protected
    function GetToken(Index: integer): TExpToken;
    function GetChildren(Index: Integer): TExpNode;
    function FindLSOTI: Integer;
    function ParseFunction: Boolean;
    function Evaluate: Double;
    function Variable: Double;
    function ParseVariable: Boolean;
    procedure RemoveSorroundingParenthesis;
    procedure SplitToChildren(TokenIndex: Integer);
    property Children[Index: integer]: TExpNode read GetChildren;
  public
    constructor Create(AOwner: TObject; AParent: TExpNode: Tokens: TList);
    destructor  Destroy: override;
    procedure   Build;
    function TokenCount: Integer;
    function Calculate: Double;
    property Tokens[Index: integer]: TExpToken read GetToken;
    property Parent: TExpNode read FParent;
    property OnEvaluate: TOnEvaluate read FOnEvaluate write FOnEvaluate;
    property OnVariable: TOnVariable read FOnVariable write FOnVariable;
  end;

  TFunction = class
  protected
    FAsString, FName, FHead, FFunction: string;
    FOwner: TObject;
    FArgCount: Integer;
    FArgs: TStringList;
    FValues: array of Double;
  private
    procedure SetAsString(const Value: string);
    procedure EvalArgs(Sender: TObject; Eval: string; Args: array of Double;
      ArgCount: Integer; var Value: Double);
  public
    constructor Create(AOwner: TObject);
    destructor Destroy; override;
    function Call(Values: array of Double): Double;
    property AsString: string read FAsString write SetAsString;
    property Name: string read FName;
    property ArgCount: Integer read FArgCount;
    property Args: TStringList read FArgs;
  end;

  // main component, actually only a wrapper for TExpParser, TExpNode and
  // user input via OnEvaluate event
  //主組件,
  ThwExpression = class(TComponent)
  protected
    FInfo, FText: string;
    FEvaluateOrder: TEvaluateOrder;
    FOnEvaluate: TOnEvaluate;
    FOnVariable: TOnVariable;
    FValue: Double;
    FFunctions: TStringList;
  private
    procedure Compile;
    function GetValue: Double;
    procedure SetInfo(Value: string);
    procedure Evaluate(Eval: string; Args: array of Double; var Value: Double);
    function FindFunction(FuncName: string): TFunction;
    procedure SetFunctions(Value: TStringList);
    procedure Variable(Eval: string; var Value: Double);
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    property Value: Double read GetValue;
  published
    property Text: string read FText write FText;
    property Info: string read FInfo write SetInfo;
    property Functions: TStringList read FFunctions write SetFunctions;
    property EvaluateOrder: TEvaluateOrder read FEvaluateOrder write
      FEvaluateOrder;
    property OnEvaluate: TOnEvaluate read FOnEvaluate write FOnEvaluate;
    property OnVariable: TOnVariable read FOnVariable write FOnVariable;
  end;

implementation

const
  // 目前所支持的數學運算符
  STR_OPERATION = '+-*/^!';
  // 函數參數分隔符
  STR_PARAMDELIMITOR = ',';
  // 合法的變量名字符
  STR_STRING: array[0..1] of string =
  ('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_',
    'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_0123456789');
  //特別含義Token的前導字符。@代表引用,%代表內部變量
  STR_EXTRAPREFIX = '@#%';

//確定操作符類型
function OperParamateres(const Oper: string): Integer;
begin
  if Pos(Oper, '+-*/^') > 0 then
    Result := 2
  else if Oper = '!' then
    Result := 1
  else
    Result := 0;
end;

constructor TExpParser.Create;
begin
  inherited Create;
  FTokens := TList.Create;
end;

destructor TExpParser.Destroy;
begin
  Clear;
  FTokens.Free;
  inherited;
end;

procedure TExpParser.Clear;
begin
  while FTokens.Count > 0 do
  begin
    TExpToken(FTokens[0]).Free;
    FTokens.Delete(0);
  end;
end;

procedure TExpParser.SetExpression(const Value: string);
begin
  FExpression := Trim(Value);
end;

function TExpParser.GetToken(Index: Integer): TExpToken;
begin
  Result := TExpToken(FTokens[Index]);
end;

function TExpParser.ReadFirstToken: TExpToken;
begin
  Clear;
  FPos := 1;
  Result := ReadNextToken;
end;

function GetTokenType(S: string; First: Boolean): TTokenType;
var
  Value: Double;
  P, Error: Integer;
begin
  if (S = '(') or (S = ')') then              //括號
    Result := ttParenthesis
  else if S = STR_PARAMDELIMITOR then         //變量分隔符
    Result := ttParamDelimitor
  else if (S = '[') or (S = ']') then         //變量
    Result := ttVariable
  else if Pos(S, STR_OPERATION) > 0 then      //操作符
    Result := ttOperation
  else if S = '@' then                        //引用
    Result := ttReference
  else if S = '%' then                        //系統內部變量
    Result := ttSysVariable
  else if S = #39 then                        //需要操作的字符串。#39是'號
    Result := ttStringValue
  else
  begin
    Val(S, Value, Error);
    if Error = 0 then
      Result := ttNumeric
    else
    begin
      if First then
        P := Pos(S, STR_STRING[0])
      else
        P := Pos(S, STR_STRING[1]);

      if P > 0 then
        Result := ttString
      else
        Result := ttNone;   //可能是非法字符,即未定義的字符。
    end;
  end;
end;

{讀下一個Token}
function TExpParser.ReadNextToken: TExpToken;
var
  Part, Ch: string;
  FirstType, NextType: TTokenType;
  Sci: Boolean;
begin
  Result := nil;
  if FPos > Length(FExpression) then
    Exit;
  Sci := False;

  {取下一個Token中第一個非空格字符}
  Part := '';
  repeat
    Ch := FExpression[FPos];
    Inc(FPos);
  until (Ch <> ' ') or (FPos > Length(FExpression));
  if FPos - 1 > Length(FExpression) then
    Exit;

  {判斷該字符屬于什么類型,在此時即確定一個Token的類型,以決定對其分解方法}
  FirstType := GetTokenType(Ch, True);
  if FirstType = ttNone then
  begin
    raise
      Exception.CreateFmt('Parse error: illegal character "%s" at position %d.',
      [Ch, FPos - 1]);
    Exit;
  end;

  {如果第一個字符標明Token是括號或者操作符則將該Token添加進Token集合中并返回}
  if FirstType in [ttParenthesis, ttOperation] then
  begin
    Result := TExpToken.Create;
    with Result do
    begin
      FText := Ch;
      FTokenType := FirstType;
    end;
    FTokens.Add(Result);
    Exit;
  end;

  {
   判斷是否是變量。如果不是變量則將第一個字符賦值給Part以便于將來合成為完整的Token。
   對于引用、系統內部變量等,都有前導特殊字符。其他的字符串,無論是函數、變量還是數
   字等,都沒有特殊標識。字符串用引號標識。

  }
  if FirstType <> ttVariable then
    Part := Ch;
  repeat
    //Ch := FExpression[FPos];
    if FPos <= Length(FExpression) then
      Ch := FExpression[FPos]
    else
      Ch := #0;
    NextType := GetTokenType(Ch, False);

    if (NextType = FirstType) and (FirstType <> ttVariable) or
       ((FirstType = ttVariable) and (NextType <> ttVariable)) or
      ((FirstType = ttString) and (NextType = ttNumeric)) or
      ((FirstType = ttNumeric) and (NextType = ttString) and (Ch = 'E') and
      (Sci = False)) or
      ((FirstType = ttNumeric) and (NextType = ttOperation) and (Ch = '-') and
      (Sci = True)) then
    begin
      Part := Part + Ch;
      if (FirstType = ttNumeric) and (NextType = ttString) and (Ch = 'E') then
        Sci := True;
    end
    else
    begin
      if (FirstType = ttVariable) and (NextType = ttVariable) then
        Inc(FPos);
      Result := TExpToken.Create;
      with Result do
      begin
        FText := Part;
        FTokenType := FirstType;
      end;
      FTokens.Add(Result);
      Exit;
    end;
    Inc(FPos);
  until FPos > Length(FExpression);

  Result := TExpToken.Create;
  with Result do
  begin
    FText := Part;
    FTokenType := FirstType;
  end;
  FTokens.Add(Result);
end;

end.

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品亚洲欧美一区| 久久综合色8888| 国产不卡在线播放| 国产乱子伦视频一区二区三区 | 国产在线日韩欧美| 视频一区视频二区在线观看| 午夜日韩在线观看| 性感美女久久精品| 久久精品国产免费看久久精品| 一区二区三区美女视频| 一区二区三区在线播放| 亚洲综合在线观看视频| 亚洲国产另类av| 天天操天天色综合| 国产一区二区三区免费播放| 国产一区二区三区蝌蚪| 波多野结衣中文字幕一区 | 国产精品免费观看视频| 中文字幕一区二| 亚洲香蕉伊在人在线观| 日韩黄色一级片| 国产精品99久久久久| 波多野结衣亚洲| 欧美日韩aaaaaa| 91福利小视频| 中文字幕中文字幕一区| 亚洲乱码国产乱码精品精的特点| 青青草原综合久久大伊人精品优势| 五月婷婷综合网| 国产精品一二三四| 在线观看国产精品网站| 日韩一二三四区| 国产精品久久久久久福利一牛影视| 亚洲欧洲综合另类| 久久精品国产精品亚洲红杏| 99麻豆久久久国产精品免费优播| 欧美视频三区在线播放| 久久蜜桃香蕉精品一区二区三区| 亚洲免费观看在线视频| 国产资源在线一区| 欧美亚洲高清一区| 久久久久97国产精华液好用吗| 一区二区不卡在线播放| 韩国av一区二区三区四区| 毛片av中文字幕一区二区| 日韩欧美一区二区不卡| 成人黄色一级视频| 欧美人伦禁忌dvd放荡欲情| 久久久综合网站| 一区二区久久久| 国产精品一区二区久激情瑜伽| 欧美亚洲国产bt| 国产欧美日本一区二区三区| 一区二区三区在线影院| 国产东北露脸精品视频| 日韩限制级电影在线观看| 成人欧美一区二区三区1314| 国产精品资源站在线| 欧美一区二区三区免费视频| 亚洲一区二区三区激情| 成人免费视频网站在线观看| 久久久久久久久久电影| 老司机精品视频线观看86| 在线播放中文一区| 亚洲精品久久久久久国产精华液| 国产91富婆露脸刺激对白| 欧美岛国在线观看| 久久精品国产99| 欧美精三区欧美精三区| 亚洲一区中文日韩| 色视频成人在线观看免| 亚洲日本在线观看| 99国产精品国产精品久久| 国产精品乱码妇女bbbb| 国产成人av自拍| wwwwxxxxx欧美| 国产精品99久久久久久有的能看 | 欧美三级三级三级爽爽爽| 亚洲男人天堂一区| 欧美主播一区二区三区| 亚洲成人中文在线| 欧美一区二区成人6969| 蜜桃精品视频在线| 精品少妇一区二区三区日产乱码 | 最新成人av在线| 91在线精品一区二区| 亚洲欧美日韩一区二区三区在线观看| 91亚洲精品一区二区乱码| 中文字幕五月欧美| 欧美中文字幕一区| 午夜久久久久久电影| 日韩一二三区不卡| 韩国女主播成人在线| 国产精品久久久一本精品| 91丨porny丨户外露出| 午夜精品福利一区二区三区蜜桃| 欧美日韩成人综合| 久久91精品久久久久久秒播| 国产午夜久久久久| 一本色道久久综合亚洲aⅴ蜜桃 | 91视频www| 视频一区二区三区在线| 精品久久久久久久久久久久久久久久久 | 欧美mv和日韩mv国产网站| 国产精品911| 亚洲尤物在线视频观看| 欧美一卡二卡在线观看| 国产大陆亚洲精品国产| 亚洲自拍偷拍av| 亚洲精品一区在线观看| 91麻豆免费视频| 蜜臀av一区二区| ...中文天堂在线一区| 日韩三级精品电影久久久 | 亚洲人成网站在线| 欧美一区二视频| 91麻豆国产福利在线观看| 蜜臀99久久精品久久久久久软件| 国产欧美视频一区二区| 欧美日韩国产123区| 成人动漫视频在线| 男女视频一区二区| 亚洲人成网站在线| 久久久美女毛片| 欧美一区二区日韩| 91麻豆6部合集magnet| 国产精品综合视频| 日韩国产欧美在线观看| 亚洲欧美综合在线精品| 欧美tk—视频vk| 欧美中文字幕一二三区视频| 国产精品亚洲专一区二区三区 | 国产精品天美传媒沈樵| 日韩久久久精品| 欧美精品久久久久久久久老牛影院| 成人福利电影精品一区二区在线观看| 青青草国产成人av片免费| 亚洲一区二区不卡免费| 亚洲天堂福利av| 亚洲精品在线免费播放| 欧美一区二区三区啪啪| 91 com成人网| 欧美日韩成人在线| 欧美日韩情趣电影| 91福利在线免费观看| 色吧成人激情小说| av一区二区三区黑人| 成人国产免费视频| 东方aⅴ免费观看久久av| 国产呦精品一区二区三区网站| 日本中文字幕一区二区有限公司| 午夜精品久久久久久久久久| 亚洲一区二区三区四区中文字幕| 亚洲激情六月丁香| 亚洲专区一二三| 亚洲高清在线视频| 婷婷六月综合亚洲| 肉丝袜脚交视频一区二区| 午夜成人免费电影| 肉色丝袜一区二区| 久久国产剧场电影| 国产综合色精品一区二区三区| 精品制服美女丁香| 国产在线看一区| 不卡的电影网站| 色综合天天综合在线视频| 色综合咪咪久久| 在线成人av网站| 久久老女人爱爱| 欧美国产亚洲另类动漫| ...中文天堂在线一区| 亚洲高清不卡在线观看| 三级久久三级久久| 国产精品一区二区三区乱码| 风流少妇一区二区| 91麻豆蜜桃一区二区三区| 欧美精三区欧美精三区| 26uuu亚洲婷婷狠狠天堂| 日本一区二区综合亚洲| 亚洲日本在线视频观看| 免费人成网站在线观看欧美高清| 美女视频一区在线观看| 成人国产一区二区三区精品| 欧美影院一区二区三区| 日韩视频一区二区三区| 国产精品三级在线观看| 亚洲v精品v日韩v欧美v专区| 国产精品一区久久久久| 一本久久a久久免费精品不卡| 91精品欧美一区二区三区综合在| 337p粉嫩大胆噜噜噜噜噜91av| 国产精品麻豆欧美日韩ww| 三级在线观看一区二区| 国产成人超碰人人澡人人澡| 欧美私人免费视频| 久久久久亚洲蜜桃| 五月天一区二区三区| 97成人超碰视| 精品91自产拍在线观看一区| 亚洲最大成人综合|