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 + -
显示快捷键?