wmsqlsyn.pas

来自「本人买的<<VC++项目开发实例>>源代码配套光盘.」· PAS 代码 · 共 1,397 行 · 第 1/3 页

PAS
1,397
字号
{+-----------------------------------------------------------------------------+
 | Class:       TmwSQLSyn
 | Created:     not known
 | Last change: 1999-11-11
 | Author:      Willo van der Merwe [willow@billcad.co.za]
 | Description: SQL syntax highliter
 | Version:     0.54
 | Copyright (c) 1999 Willo van der Merwe
 | All rights reserved.
 | Portions Copyright Martin Waldenburg.
 | Initially Created with mwSynGen by Martin Waldenburg.
 |
 | Thanks to: Primoz Gabrijelcic, Andy Jeffries
 |
 | Version history: see version.rtf
 |
 +----------------------------------------------------------------------------+}

unit wmSQLSyn;

interface

uses
  SysUtils, Windows, Messages, Classes, Controls, Graphics, Registry,
  mwHighlighter, mwLocalStr,
  mwExport;

Type
  TwmTokenKind = (
    wmComment,
    wmIdentifier,
    wmKey,
    wmNull,
    wmNumber,
    wmString,
    wmSymbol,
    wmUnknown);

  TRangeState = (rsANil, rsAnsiC, rsUnKnown);

  TProcTableProc = procedure of Object;
  TIdentFuncTableFunc = function: TwmTokenKind of Object;

type
  TwmSQLSyn = class(TmwCustomHighLighter)
  private
    fRange: TRangeState;
    fLine: PChar;
    fProcTable: array[#0..#255] of TProcTableProc;
    Run: LongInt;
    FRoundCount: Integer;
    FSquareCount: Integer;
    fStringLen: Integer;
    fLineNumber : Integer;
    fToIdent: PChar;
    fTokenPos: Integer;
    FTokenID: TwmTokenKind;
    fEol: Boolean;
    fIdentFuncTable: array[0..156] of TIdentFuncTableFunc;
    fStringAttri: TmwHighLightAttributes;
    fSymbolAttri: TmwHighLightAttributes;
    fKeyAttri: TmwHighLightAttributes;
    fNumberAttri: TmwHighLightAttributes;
    fCommentAttri: TmwHighLightAttributes;
    fIdentifierAttri: TmwHighLightAttributes;
    function KeyHash(ToHash: PChar): Integer;
    function KeyComp(const aKey: String): Boolean;
    function Func15:TwmTokenKind;
    function Func19:TwmTokenKind;
    function Func20:TwmTokenKind;
    function Func21:TwmTokenKind;
    function Func23:TwmTokenKind;
    function Func25:TwmTokenKind;
    function Func27:TwmTokenKind;
    function Func28:TwmTokenKind;
    function Func29:TwmTokenKind;
    function Func30:TwmTokenKind;
    function Func31:TwmTokenKind;
    function Func33:TwmTokenKind;
    function Func35:TwmTokenKind;
    function Func37:TwmTokenKind;
    function Func39:TwmTokenKind;
    function Func40:TwmTokenKind;
    function Func41:TwmTokenKind;
    function Func43:TwmTokenKind;
    function Func44:TwmTokenKind;
    function Func47:TwmTokenKind;
    function Func48:TwmTokenKind;
    function Func49:TwmTokenKind;
    function Func50:TwmTokenKind;
    function Func51:TwmTokenKind;
    function Func52:TwmTokenKind;
    function Func53:TwmTokenKind;
    function Func55:TwmTokenKind;
    function Func56:TwmTokenKind;
    function Func57:TwmTokenKind;
    function Func58:TwmTokenKind;
    function Func59:TwmTokenKind;
    function Func60:TwmTokenKind;
    function Func61:TwmTokenKind;
    function Func62:TwmTokenKind;
    function Func63:TwmTokenKind;
    function Func64:TwmTokenKind;
    function Func66:TwmTokenKind;
    function Func67:TwmTokenKind;
    function Func69:TwmTokenKind;
    function Func70:TwmTokenKind;
    function Func73:TwmTokenKind;
    function Func74:TwmTokenKind;
    function Func76:TwmTokenKind;
    function Func77:TwmTokenKind;
    function Func78:TwmTokenKind;
    function Func79:TwmTokenKind;
    function Func83:TwmTokenKind;
    function Func84:TwmTokenKind;
    function Func85:TwmTokenKind;
    function Func87:TwmTokenKind;
    function Func91:TwmTokenKind;
    function Func94:TwmTokenKind;
    function Func96:TwmTokenKind;
    function Func97:TwmTokenKind;
    function Func98:TwmTokenKind;
    function Func99:TwmTokenKind;
    function Func100:TwmTokenKind;
    function Func102:TwmTokenKind;
    function Func103:TwmTokenKind;
    function Func105:TwmTokenKind;
    function Func106:TwmTokenKind;
    function Func111:TwmTokenKind;
    function Func112:TwmTokenKind;
    function Func114:TwmTokenKind;
    function Func115:TwmTokenKind;
    function Func116:TwmTokenKind;
    function Func117:TwmTokenKind;
    function Func122:TwmTokenKind;
    function Func133:TwmTokenKind;
    function Func134:TwmTokenKind;
    function Func137:TwmTokenKind;
    function Func156:TwmTokenKind;
    procedure AndSymbolProc;
    procedure BackslashProc;
    procedure CRProc;
    procedure ColonProc;
    procedure CommaProc;
    procedure CommentProc;
    procedure EqualProc;
    procedure GreaterProc;
    procedure IdentProc;
    procedure LFProc;
    procedure LowerProc;
    procedure MinusProc;
    procedure NullProc;
    procedure NumberProc;
    procedure OrSymbolProc;
    procedure PlusProc;
    procedure QuestionProc;
    procedure RoundCloseProc;
    procedure RoundOpenProc;
    procedure SemiColonProc;
    procedure SlashProc;
    procedure SpaceProc;
    procedure SquareCloseProc;
    procedure SquareOpenProc;
    procedure StarProc;
    procedure StringInterpProc;
    procedure StringLiteralProc;
    procedure XOrSymbolProc;
    procedure UnknownProc;
    procedure AnsiCProc;
    function AltFunc: TwmTokenKind;
    procedure InitIdent;
    function IdentKind(MayBe: PChar): TwmTokenKind;
    procedure MakeMethodTables;
  protected
    function GetLanguageName: string; override;
    function GetCapability: THighlighterCapability; override;
  public
    constructor Create(AOwner: TComponent); override;

    procedure ExportNext; override;
    function UseUserSettings(settingIndex: integer): boolean; override;
    procedure EnumUserSettings(settings: TStrings); override;

    function GetEol: Boolean; override;
    function GetRange: Pointer; override;
    function GetTokenID: TwmTokenKind;
    procedure SetLine(NewValue : string; LineNumber : Integer);override;
    function GetToken: String; override;
    function GetTokenAttribute: TmwHighLightAttributes; override;
    function GetTokenKind: integer; override;
    function GetTokenPos: Integer; override;
    procedure Next; override;
    procedure SetLineForExport(NewValue: String); override;
    procedure SetRange(Value: Pointer); override;
    procedure ReSetRange; override;
  published
    property CommentAttri: TmwHighLightAttributes read fCommentAttri write fCommentAttri;
    property IdentifierAttri: TmwHighLightAttributes read fIdentifierAttri write fIdentifierAttri;
    property KeyAttri: TmwHighLightAttributes read fKeyAttri write fKeyAttri;
    property NumberAttri: TmwHighLightAttributes read fNumberAttri write fNumberAttri;
    property StringAttri: TmwHighLightAttributes read fStringAttri write fStringAttri;
    property SymbolAttri: TmwHighLightAttributes read fSymbolAttri write fSymbolAttri;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents(MWS_HighlightersPage, [TwmSQLSyn]);
end;

var
  Identifiers: array[#0..#255] of ByteBool;
  mHashTable: array[#0..#255] of Integer;

procedure MakeIdentTable;
var
  I,J: Char;
begin
  for I := #0 to #255 do
  begin
    Case I of
      '_', '0'..'9', 'a'..'z', 'A'..'Z': Identifiers[I] := True;
    else Identifiers[I] := False;
    end;
    J := UpperCase(I)[1];
    Case I of
      'a'..'z', 'A'..'Z', '_': mHashTable[I] := Ord(J) - 64;
    else mHashTable[Char(I)] := 0;
    end;
  end;
end;

procedure TwmSQLSyn.InitIdent;
var
  I: Integer;
begin
  for I := 0 to 156 do
    Case I of
      15: fIdentFuncTable[I] := Func15;
      19: fIdentFuncTable[I] := Func19;
      20: fIdentFuncTable[I] := Func20;
      21: fIdentFuncTable[I] := Func21;
      23: fIdentFuncTable[I] := Func23;
      25: fIdentFuncTable[I] := Func25;
      27: fIdentFuncTable[I] := Func27;
      28: fIdentFuncTable[I] := Func28;
      29: fIdentFuncTable[I] := Func29;
      30: fIdentFuncTable[I] := Func30;
      31: fIdentFuncTable[I] := Func31;
      33: fIdentFuncTable[I] := Func33;
      35: fIdentFuncTable[I] := Func35;
      37: fIdentFuncTable[I] := Func37;
      39: fIdentFuncTable[I] := Func39;
      40: fIdentFuncTable[I] := Func40;
      41: fIdentFuncTable[I] := Func41;
      43: fIdentFuncTable[I] := Func43;
      44: fIdentFuncTable[I] := Func44;
      47: fIdentFuncTable[I] := Func47;
      48: fIdentFuncTable[I] := Func48;
      49: fIdentFuncTable[I] := Func49;
      50: fIdentFuncTable[I] := Func50;
      51: fIdentFuncTable[I] := Func51;
      52: fIdentFuncTable[I] := Func52;
      53: fIdentFuncTable[I] := Func53;
      55: fIdentFuncTable[I] := Func55;
      56: fIdentFuncTable[I] := Func56;
      57: fIdentFuncTable[I] := Func57;
      58: fIdentFuncTable[I] := Func58;
      59: fIdentFuncTable[I] := Func59;
      60: fIdentFuncTable[I] := Func60;
      61: fIdentFuncTable[I] := Func61;
      62: fIdentFuncTable[I] := Func62;
      63: fIdentFuncTable[I] := Func63;
      64: fIdentFuncTable[I] := Func64;
      66: fIdentFuncTable[I] := Func66;
      67: fIdentFuncTable[I] := Func67;
      69: fIdentFuncTable[I] := Func69;
      70: fIdentFuncTable[I] := Func70;
      73: fIdentFuncTable[I] := Func73;
      74: fIdentFuncTable[I] := Func74;
      76: fIdentFuncTable[I] := Func76;
      77: fIdentFuncTable[I] := Func77;
      78: fIdentFuncTable[I] := Func78;
      79: fIdentFuncTable[I] := Func79;
      83: fIdentFuncTable[I] := Func83;
      84: fIdentFuncTable[I] := Func84;
      85: fIdentFuncTable[I] := Func85;
      87: fIdentFuncTable[I] := Func87;
      91: fIdentFuncTable[I] := Func91;
      94: fIdentFuncTable[I] := Func94;
      96: fIdentFuncTable[I] := Func96;
      97: fIdentFuncTable[I] := Func97;
      98: fIdentFuncTable[I] := Func98;
      99: fIdentFuncTable[I] := Func99;
      100: fIdentFuncTable[I] := Func100;
      102: fIdentFuncTable[I] := Func102;
      103: fIdentFuncTable[I] := Func103;
      105: fIdentFuncTable[I] := Func105;
      106: fIdentFuncTable[I] := Func106;
      111: fIdentFuncTable[I] := Func111;
      112: fIdentFuncTable[I] := Func112;
      114: fIdentFuncTable[I] := Func114;
      115: fIdentFuncTable[I] := Func115;
      116: fIdentFuncTable[I] := Func116;
      117: fIdentFuncTable[I] := Func117;
      122: fIdentFuncTable[I] := Func122;
      133: fIdentFuncTable[I] := Func133;
      134: fIdentFuncTable[I] := Func134;
      137: fIdentFuncTable[I] := Func137;
      156: fIdentFuncTable[I] := Func156;
    else fIdentFuncTable[I] := AltFunc;
    end;
end;

function TwmSQLSyn.KeyHash(ToHash: PChar): Integer;
begin
  Result := 0;
  while ToHash^ in ['_', '0'..'9', 'a'..'z', 'A'..'Z'] do
  begin
    inc(Result, mHashTable[ToHash^]);
    inc(ToHash);
  end;
  fStringLen := ToHash - fToIdent;
end; { KeyHash }

function TwmSQLSyn.KeyComp(const aKey: String): Boolean;
var
  I: Integer;
  Temp: PChar;
begin
  Temp := fToIdent;
  if Length(aKey) = fStringLen then
  begin
    Result := True;
    for i := 1 to fStringLen do
    begin
      if mHashTable[Temp^] <> mHashTable[aKey[i]] then
      begin
        Result := False;
        break;
      end;
      inc(Temp);
    end;
  end else Result := False;
end; { KeyComp }

function TwmSQLSyn.Func15: TwmTokenKind;
begin
  if KeyComp('IF') then Result := wmKey else Result := wmIdentifier;
end;

function TwmSQLSyn.Func19: TwmTokenKind;
begin
  if KeyComp('AND') then Result := wmKey else
    if KeyComp('DO') then Result := wmKey else Result := wmIdentifier;
end;

function TwmSQLSyn.Func20: TwmTokenKind;
begin
  if KeyComp('AS') then Result := wmKey else
    if KeyComp('CACHE') then Result := wmKey else Result := wmIdentifier;
end;

function TwmSQLSyn.Func21: TwmTokenKind;
begin
  if KeyComp('AT') then Result := wmKey else
    if KeyComp('OF') then Result := wmKey else Result := wmIdentifier;
end;

function TwmSQLSyn.Func23: TwmTokenKind;
begin
  if KeyComp('END') then Result := wmKey else
    if KeyComp('IN') then Result := wmKey else
      if KeyComp('ASC') then Result := wmKey else Result := wmIdentifier;
end;

function TwmSQLSyn.Func25: TwmTokenKind;
begin
  if KeyComp('ALL') then Result := wmKey else Result := wmIdentifier;
end;

function TwmSQLSyn.Func27: TwmTokenKind;
begin
  if KeyComp('BY') then Result := wmKey else Result := wmIdentifier;
end;

function TwmSQLSyn.Func28: TwmTokenKind;
begin
  if KeyComp('READ') then Result := wmKey else
    if KeyComp('IS') then Result := wmKey else Result := wmIdentifier;
end;

function TwmSQLSyn.Func29: TwmTokenKind;
begin
  if KeyComp('NO') then Result := wmKey else
    if KeyComp('ON') then Result := wmKey else Result := wmIdentifier;
end;

function TwmSQLSyn.Func30: TwmTokenKind;
begin
  if KeyComp('CHECK') then Result := wmKey else Result := wmIdentifier;
end;

function TwmSQLSyn.Func31: TwmTokenKind;
begin
  if KeyComp('DESC') then Result := wmKey else Result := wmIdentifier;
end;

function TwmSQLSyn.Func33: TwmTokenKind;
begin
  if KeyComp('OR') then Result := wmKey else Result := wmIdentifier;
end;

function TwmSQLSyn.Func35: TwmTokenKind;
begin
  if KeyComp('TO') then Result := wmKey else Result := wmIdentifier;
end;

function TwmSQLSyn.Func37: TwmTokenKind;
begin
  if KeyComp('LIKE') then Result := wmKey else
    if KeyComp('BEGIN') then Result := wmKey else Result := wmIdentifier;
end;

function TwmSQLSyn.Func39: TwmTokenKind;
begin
  if KeyComp('FOR') then Result := wmKey else
    if KeyComp('DEBUG') then Result := wmKey else Result := wmIdentifier;
end;

function TwmSQLSyn.Func40: TwmTokenKind;
begin
  if KeyComp('ANY') then Result := wmKey else
    if KeyComp('TABLE') then Result := wmKey else Result := wmIdentifier;
end;

function TwmSQLSyn.Func41: TwmTokenKind;
begin
  if KeyComp('ELSE') then Result := wmKey else
    if KeyComp('KEY') then Result := wmKey else Result := wmIdentifier;
end;

function TwmSQLSyn.Func43: TwmTokenKind;
begin
  if KeyComp('LEFT') then Result := wmKey else
    if KeyComp('CAST') then Result := wmKey else
      if KeyComp('PLAN') then Result := wmKey else Result := wmIdentifier;
end;

function TwmSQLSyn.Func44: TwmTokenKind;
begin
  if KeyComp('SET') then Result := wmKey else Result := wmIdentifier;
end;

function TwmSQLSyn.Func47: TwmTokenKind;
begin
  if KeyComp('THEN') then Result := wmKey else Result := wmIdentifier;
end;

function TwmSQLSyn.Func48: TwmTokenKind;
begin
  if KeyComp('MERGE') then Result := wmKey else
    if KeyComp('DECLARE') then Result := wmKey else

⌨️ 快捷键说明

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