cxregexpr.pas

来自「胜天进销存源码,国产优秀的进销存」· PAS 代码 · 共 2,586 行 · 第 1/5 页

PAS
2,586
字号
{********************************************************************}
{                                                                    }
{       Developer Express Visual Component Library                   }
{       ExpressEditors                                               }
{                                                                    }
{       Copyright (c) 1998-2008 Developer Express Inc.               }
{       ALL RIGHTS RESERVED                                          }
{                                                                    }
{   The entire contents of this file is protected by U.S. and        }
{   International Copyright Laws. Unauthorized reproduction,         }
{   reverse-engineering, and distribution of all or any portion of   }
{   the code contained in this file is strictly prohibited and may   }
{   result in severe civil and criminal penalties and will be        }
{   prosecuted to the maximum extent possible under the law.         }
{                                                                    }
{   RESTRICTIONS                                                     }
{                                                                    }
{   THIS SOURCE CODE AND ALL RESULTING INTERMEDIATE FILES            }
{   (DCU, OBJ, DLL, ETC.) ARE CONFIDENTIAL AND PROPRIETARY TRADE     }
{   SECRETS OF DEVELOPER EXPRESS INC. THE REGISTERED DEVELOPER IS    }
{   LICENSED TO DISTRIBUTE THE EXPRESSEDITORS AND ALL                }
{   ACCOMPANYING VCL CONTROLS AS PART OF AN EXECUTABLE PROGRAM ONLY. }
{                                                                    }
{   THE SOURCE CODE CONTAINED WITHIN THIS FILE AND ALL RELATED       }
{   FILES OR ANY PORTION OF ITS CONTENTS SHALL AT NO TIME BE         }
{   COPIED, TRANSFERRED, SOLD, DISTRIBUTED, OR OTHERWISE MADE        }
{   AVAILABLE TO OTHER INDIVIDUALS WITHOUT EXPRESS WRITTEN CONSENT   }
{   AND PERMISSION FROM DEVELOPER EXPRESS INC.                       }
{                                                                    }
{   CONSULT THE END USER LICENSE AGREEMENT FOR INFORMATION ON        }
{   ADDITIONAL RESTRICTIONS.                                         }
{                                                                    }
{********************************************************************}
unit cxRegExpr;

{$I cxVer.inc}

interface

uses
  SysUtils, Classes, cxClasses, cxEdit, cxEditConsts;

type
  { TcxRegExprError }

  TcxRegExprError = class
  private
    FChar: Integer;
    FLine: Integer;
    FMessage: string;
    function GetFullMessage: string;
  public
    constructor Create(ALine: Integer; AChar: Integer; AMessage: string);
    function Clone: TcxRegExprError;
    property Char: Integer read FChar;
    property FullMessage: string read GetFullMessage;
    property Line: Integer read FLine;
    property Message: string read FMessage; 
  end;

  { TcxRegExprErrors }

  TcxRegExprErrors = class
  private
    FErrors: TList;
    function GetCount: Integer;
    function GetItems(Index: Integer): TcxRegExprError;
  public
    constructor Create;
    destructor Destroy; override;
    procedure Add(AError: TcxRegExprError);
    procedure Clear;
    function Clone: TcxRegExprErrors;
    property Count: Integer read GetCount;
    property Items[Index: Integer]: TcxRegExprError read GetItems; default;
  end;

  { EcxRegExprError }

  EcxRegExprError = class(EcxEditError)
  private
    FErrors: TcxRegExprErrors;
  public
    constructor Create(AErrors: TcxRegExprErrors);
    property Errors: TcxRegExprErrors read FErrors;
  end;

  { TcxLexem }

  TcxLexem = record
    Char: Integer;
    Code: Integer;
    Line: Integer;
    Value: string;
  end;
  PcxLexem = ^TcxLexem;

  { TcxRegExprLexemCode }

  TcxRegExprLexemCode =
  (
    relcSymbol,
    relcSpecial,
    relcInteger,
    relcAll,
    relcId,
    relcNotId,
    relcDigit,
    relcNotDigit,
    relcSpace,
    relcNotSpace,
    relcReference,
    relcDateSeparator,
    relcTimeSeparator
  );

  { TcxLexems }

  TcxLexems = class
  private
    FLexems: TList;
    function GetCount: Integer;
    function GetItems(Index: Integer): TcxLexem;
  public
    constructor Create;
    destructor Destroy; override;
    procedure Add(ALexem: TcxLexem);
    procedure Clear;
    property Count: Integer read GetCount;
    property Items[Index: Integer]: TcxLexem read GetItems; default;
  end;

  { TcxRegExprItem }

  TcxRegExprItem = class
  public
    function Check(var AToken: Char; ACaseInsensitive: Boolean): Boolean; virtual; abstract;
    function Clone: TcxRegExprItem; virtual; abstract;
  end;

  { TcxRegExprSymbol }

  TcxRegExprSymbol = class(TcxRegExprItem)
  private
    FValue: Char;
  public
    constructor Create(AValue: Char);
    function Check(var AToken: Char; ACaseInsensitive: Boolean): Boolean; override;
    function Clone: TcxRegExprItem; override;
  end;

  { TcxRegExprTimeSeparator }

  TcxRegExprTimeSeparator = class(TcxRegExprItem)
  public
    function Check(var AToken: Char; ACaseInsensitive: Boolean): Boolean; override;
    function Clone: TcxRegExprItem; override;
    function Value: Char;
  end;

  { TcxRegExprDateSeparator }

  TcxRegExprDateSeparator = class(TcxRegExprItem)
  public
    function Check(var AToken: Char; ACaseInsensitive: Boolean): Boolean; override;
    function Clone: TcxRegExprItem; override;
    function Value: Char;    
  end;

  { TcxRegExprSubrange }

  TcxRegExprSubrange = class(TcxRegExprItem)
  private
    FStartValue: Char;
    FFinishValue: Char;
  public
    constructor Create(AStartValue: Char; AFinishValue: Char);
    function Check(var AToken: Char; ACaseInsensitive: Boolean): Boolean; override;
    function Clone: TcxRegExprItem; override;
  end;

  { TcxRegExprEnumeration }

  TcxRegExprEnumeration = class(TcxRegExprItem)
  private
    FInverse: Boolean;
  public
    constructor Create(AInverse: Boolean = False);
  end;

  { TcxRegExprUserEnumeration }

  TcxRegExprUserEnumeration = class(TcxRegExprEnumeration)
  private
    FItems: TList;
    function Item(AIndex: Integer): TcxRegExprItem;
  public
    constructor Create(AInverse: Boolean = False);
    destructor Destroy; override;
    procedure Add(AItem: TcxRegExprItem);
    function Check(var AToken: Char; ACaseInsensitive: Boolean): Boolean; override;
    function Clone: TcxRegExprItem; override;
  end;

  { TcxRegExprDigit }

  TcxRegExprDigit = class(TcxRegExprEnumeration)
  public
    constructor Create(AInverse: Boolean = False);
    function Check(var AToken: Char; ACaseInsensitive: Boolean): Boolean; override;
    function Clone: TcxRegExprItem; override;
  end;

  { TcxRegExprIdLetter }

  TcxRegExprIdLetter = class(TcxRegExprEnumeration)
  public
    constructor Create(AInverse: Boolean = False);
    function Check(var AToken: Char; ACaseInsensitive: Boolean): Boolean; override;
    function Clone: TcxRegExprItem; override;
  end;

  { TcxRegExprSpace }

  TcxRegExprSpace = class(TcxRegExprEnumeration)
  public
    constructor Create(AInverse: Boolean = False);
    function Check(var AToken: Char; ACaseInsensitive: Boolean): Boolean; override;
    function Clone: TcxRegExprItem; override;
  end;

  { TcxRegExprAll }

  TcxRegExprAll = class(TcxRegExprItem)
  public
    function Check(var AToken: Char; ACaseInsensitive: Boolean): Boolean; override;
    function Clone: TcxRegExprItem; override;
  end;

  TcxRegExprStates = class;

  { TcxRegExprState }

  TcxRegExprState = class
  protected
    FStates: TcxRegExprStates;
  public
    constructor Create;
    destructor Destroy; override;
    procedure Add(AState: TcxRegExprState); overload;
    procedure Add(AStates: TcxRegExprStates); overload;
    function Check(var AToken: Char; ACaseInsensitive: Boolean): TcxRegExprStates; virtual;
    function Clone: TcxRegExprState; virtual;
    function GetAllNextStates: TcxRegExprStates;
    function GetSelf: TcxRegExprStates; virtual;
    function Next(var AToken: Char; ACaseInsensitive: Boolean): TcxRegExprStates;
    property States: TcxRegExprStates read FStates;
  end;

  { TcxRegExprSimpleState }

  TcxRegExprSimpleState = class(TcxRegExprState)
  private
    FIsFinal: Boolean;
    FValue: TcxRegExprItem;
  public
    constructor Create(AValue: TcxRegExprItem);
    destructor Destroy; override;
    function Check(var AToken: Char; ACaseInsensitive: Boolean): TcxRegExprStates; override;
    function Clone: TcxRegExprState; override;
    function GetSelf: TcxRegExprStates; override;
    procedure SetFinal;
    property IsFinal: Boolean read FIsFinal;
  end;

  { TcxRegExprBlockState }

  TcxRegExprBlockState = class(TcxRegExprState)
  public
    function Check(var AToken: Char; ACaseInsensitive: Boolean): TcxRegExprStates; override;
    function Clone: TcxRegExprState; override;
    function GetSelf: TcxRegExprStates; override;
  end;

  { TcxRegExprStates }

  TcxRegExprStates = class
  private
    FStates: TList;
    function GetCount: Integer;
    function GetState(AIndex: Integer): TcxRegExprState;
  public
    constructor Create;
    destructor Destroy; override;
    procedure Add(AState: TcxRegExprState); overload;
    procedure Add(AStates: TcxRegExprStates); overload;
    procedure Clear;
    function Equ(var ASymbol: Char): Boolean;
    function GetAllNextStates: TcxRegExprStates;
    function IsFinal: Boolean;
    function Next(var AToken: Char; ACaseInsensitive: Boolean): TcxRegExprStates;
    property Count: Integer read GetCount;
    property State[AIndex: Integer]: TcxRegExprState read GetState; default;
  end;

  TcxRegExprParserAlts = class;
  TcxRegExpr = class;

  { TcxRegExprAutomat }

  TcxRegExprAutomat = class
  private
    FCurrentStates: TcxRegExprStates;
    FExpr: TcxRegExprParserAlts;
    FHistory: TList;
    FOwner: TcxRegExpr;
    FStartState: TcxRegExprSimpleState;
    function GetAllNextStates: TcxRegExprStates;
    function Pop: TcxRegExprStates;
    procedure Push(AStates: TcxRegExprStates);
  public
    constructor Create(AExpr: TcxRegExprParserAlts; AOwner: TcxRegExpr);
    destructor Destroy; override;
    function IsFinal: Boolean;
    function IsStart: Boolean;
    function Next(var AToken: Char; ACaseInsensitive: Boolean): Boolean;
    function Prev: Boolean;
    function Print: string;
    procedure Reset;
    procedure ReUpdate;
    procedure Update;
  end;

  { TcxRegExprQuantifier }

  TcxRegExprQuantifier = class
  public
    function CanMissing: Boolean; virtual; abstract;
    function CanRepeat: Boolean; virtual; abstract;
    function Clone: TcxRegExprQuantifier; virtual; abstract;
    function Print: string; virtual; abstract;
  end;

  { TcxRegExprSimpleQuantifier }

  TcxRegExprSimpleQuantifier = class(TcxRegExprQuantifier) // missing quantifier
  public
    function CanMissing: Boolean; override;
    function CanRepeat: Boolean; override;
    function Clone: TcxRegExprQuantifier; override;
    function Print: string; override;
  end;

  { TcxRegExprQuestionQuantifier }

  TcxRegExprQuestionQuantifier = class(TcxRegExprQuantifier) // ?
  public
    function CanMissing: Boolean; override;
    function CanRepeat: Boolean; override;
    function Clone: TcxRegExprQuantifier; override;
    function Print: string; override;
  end;

  { TcxRegExprStarQuantifier }

  TcxRegExprStarQuantifier = class(TcxRegExprQuantifier) // *
  public
    function CanMissing: Boolean; override;
    function CanRepeat: Boolean; override;
    function Clone: TcxRegExprQuantifier; override;
    function Print: string; override;
  end;

  { TcxRegExprPlusQuantifier }

  TcxRegExprPlusQuantifier = class(TcxRegExprQuantifier) // +
  public
    function CanMissing: Boolean; override;
    function CanRepeat: Boolean; override;
    function Clone: TcxRegExprQuantifier; override;
    function Print: string; override;
  end;

  { TcxRegExprParserItem }

  TcxRegExprParserItem = class
  private
    FQuantifier: TcxRegExprQuantifier;
  public
    constructor Create(AQuantifier: TcxRegExprQuantifier = nil);
    destructor Destroy; override;
    function CanEmpty: Boolean; virtual; abstract;
    function CanMissing: Boolean;
    function CanRepeat: Boolean;
    function Clone: TcxRegExprParserItem; virtual; abstract;
    function NotQuantifier: Boolean;
    function Print: string; virtual; abstract;
    procedure SetFinal; virtual; abstract;
    procedure SetQuantifier(AQuantifier: TcxRegExprQuantifier);
  end;

  { TcxRegExprParserSimpleItem }

  TcxRegExprParserSimpleItem = class(TcxRegExprParserItem)
  private
    FState: TcxRegExprState;
  public
    constructor Create(AState: TcxRegExprState; AQuantifier: TcxRegExprQuantifier = nil);
    destructor Destroy; override;
    function CanEmpty: Boolean; override;
    function Clone: TcxRegExprParserItem; override;
    function Print: string; override;
    procedure SetFinal; override;
    property State: TcxRegExprState read FState;
  end;

  TcxRegExprParserAlt = class;

  { TcxRegExprParserBlockItem }

  TcxRegExprParserBlockItem = class(TcxRegExprParserItem)
  private
    FAlts: TcxRegExprParserAlts;
    FFinishState: TcxRegExprState;
    FStartState: TcxRegExprState;
  public
    constructor Create(AQuantifier: TcxRegExprQuantifier = nil);
    destructor Destroy; override;
    function CanEmpty: Boolean; override;
    procedure CreateConnections;
    procedure AddAlt(AAlt: TcxRegExprParserAlt);
    procedure AddAlts(AAlts: TcxRegExprParserAlts);
    function Clone: TcxRegExprParserItem; override;
    function Print: string; override;
    procedure SetFinal; override;
    property Alts: TcxRegExprParserAlts read FAlts;
    property FinishState: TcxRegExprState read FFinishState;
    property StartState: TcxRegExprState read FStartState;
  end;

  { TcxRegExprParserAlt }

  TcxRegExprParserAlt = class
  private
    FItems: TList;
    function GetCount: Integer;
    function GetFirstItem: TcxRegExprParserItem;
    function GetItem(AIndex: Integer): TcxRegExprParserItem;
    function GetLastItem: TcxRegExprParserItem;
    procedure SetLastItem(AItem: TcxRegExprParserItem);
  public
    constructor Create;
    destructor Destroy; override;
    procedure Add(AItem: TcxRegExprParserItem);
    function CanEmpty: Boolean;
    function CanMissing: Boolean;
    function Clone: TcxRegExprParserAlt;
    procedure CreateConnections;
    procedure CreateFinalStates;
    function GetStartConnections: TcxRegExprStates;
    function Print: string;
    procedure SetFinishConnection(AFinishState: TcxRegExprState);
    property Count: Integer read GetCount;
    property FirstItem: TcxRegExprParserItem read GetFirstItem;
    property Item[AIndex: Integer]: TcxRegExprParserItem read GetItem; default;
    property LastItem: TcxRegExprParserItem read GetLastItem write SetLastItem;
  end;

  { TcxRegExprParserAlts }

  TcxRegExprParserAlts = class
  private
    FAlts: TList;
    function GetAlt(AIndex: Integer): TcxRegExprParserAlt;
    function GetCount: Integer;
    function GetLastAlt: TcxRegExprParserAlt;
  public
    constructor Create;
    destructor Destroy; override;
    procedure Add(AAlt: TcxRegExprParserAlt);
    procedure AddAlt;
    function CanEmpty: Boolean;
    procedure CreateConnections;
    procedure CreateFinalStates;
    function Clone: TcxRegExprParserAlts;
    function GetStartConnections: TcxRegExprStates;
    function Print: string;
    procedure SetFinishConnections(AFinishState: TcxRegExprState);
    function StartStateIsFinal: Boolean;
    function ThereIsEmptyAlt: Boolean;
    property Alt[AIndex: Integer]: TcxRegExprParserAlt read GetAlt; default;
    property Count: Integer read GetCount;
    property LastAlt: TcxRegExprParserAlt read GetLastAlt;
  end;

  TcxSymbolDeleteEvent = procedure of object;
  TcxSymbolUpdateEvent = procedure(ASymbol: Char) of object;

  { TcxRegExpr }
  
  TcxRegExpr = class
  private
    FAutomat: TcxRegExprAutomat;
    FBlocks: TList;
    FChar: Integer;
    FCaseInsensitive: Boolean;
    FCompiled: Boolean;
    FErrors: TcxRegExprErrors;
    FFirstExpr: Boolean;
    FIndex: Integer;
    FLexemIndex: Integer;
    FLexems: TcxLexems;
    FLine: Integer;
    FOnSymbolDelete: TcxSymbolDeleteEvent;
    FOnSymbolUpdate: TcxSymbolUpdateEvent;
    FStream: TMemoryStream;
    FUpdateOn: Boolean;
    procedure Clear;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?