cwcacsyn.pas
来自「本人买的<<VC++项目开发实例>>源代码配套光盘.」· PAS 代码 · 共 1,112 行 · 第 1/3 页
PAS
1,112 行
{
Class: TcwCACSyn
Created: 1998-12-27
Last change: 1999-10-27
Author: Carlos Wijders (ctfbs@sr.net)
Description: CA-Clipper syntax highliter
Version: 0.25
Copyright (c) 1999 Carlos Wijders
All rights reserved.
Thanks to: Primoz Gabrijelcic, Andy Jeffries
Version history: see version.rtf
}
unit cwCACSyn;
interface
uses
SysUtils, Windows, Messages, Classes, Controls, Graphics, Registry,
mwHighlighter, mwLocalStr;
type
TtkTokenKind = (
tkComment,
tkDirective,
tkIdentifier,
tkKey,
tkNull,
tkNumber,
tkSpace,
tkString,
tkOperator,
tkUnknown);
TRangeState = (rsANil, rsCStyle, rsUnKnown);
TProcTableProc = procedure of object;
TIdentFuncTableFunc = function: TtkTokenKind of object;
TcwCACSyn = class(TmwCustomHighLighter)
private
fRange: TRangeState;
fLine: PChar;
fProcTable: array[#0..#255] of TProcTableProc;
Run: LongInt;
fStringLen: Integer;
fToIdent: PChar;
fTokenPos: Integer;
FTokenID: TtkTokenKind;
fEol: Boolean;
fLineNumber: Integer;
fStringAttri: TmwHighLightAttributes;
fOperatorAttri: TmwHighLightAttributes;
fKeyAttri: TmwHighLightAttributes;
fNumberAttri: TmwHighLightAttributes;
fCommentAttri: TmwHighLightAttributes;
fSpaceAttri: TmwHighLightAttributes;
fIdentifierAttri: TmwHighLightAttributes;
fDirecAttri: TmwHighLightAttributes;
fIdentFuncTable: array[0..124] of TIdentFuncTableFunc;
function KeyHash(ToHash: PChar): Integer;
function KeyComp(const aKey: string): Boolean;
function Func10: TtkTokenKind;
function Func15: TtkTokenKind;
function Func19: TtkTokenKind;
function Func21: TtkTokenKind;
function Func22: TtkTokenKind;
function Func23: TtkTokenKind;
function Func24: TtkTokenKind;
function Func26: TtkTokenKind;
function Func28: TtkTokenKind;
function Func29: TtkTokenKind;
function Func30: TtkTokenKind;
function Func31: TtkTokenKind;
function Func32: TtkTokenKind;
function Func33: TtkTokenKind;
function Func34: TtkTokenKind;
function Func35: TtkTokenKind;
function Func36: TtkTokenKind;
function Func37: TtkTokenKind;
function Func38: TtkTokenKind;
function Func39: TtkTokenKind;
function Func40: TtkTokenKind;
function Func41: TtkTokenKind;
function Func42: TtkTokenKind;
function Func43: TtkTokenKind;
function Func44: TtkTokenKind;
function Func45: TtkTokenKind;
function Func46: TtkTokenKind;
function Func47: TtkTokenKind;
function Func48: TtkTokenKind;
function Func49: TtkTokenKind;
function Func51: TtkTokenKind;
function Func52: TtkTokenKind;
function Func53: TtkTokenKind;
function Func54: TtkTokenKind;
function Func55: TtkTokenKind;
function Func56: TtkTokenKind;
function Func57: TtkTokenKind;
function Func58: TtkTokenKind;
function Func59: TtkTokenKind;
function Func60: TtkTokenKind;
function Func63: TtkTokenKind;
function Func64: TtkTokenKind;
function Func65: TtkTokenKind;
function Func66: TtkTokenKind;
function Func67: TtkTokenKind;
function Func68: TtkTokenKind;
function Func69: TtkTokenKind;
function Func70: TtkTokenKind;
function Func72: TtkTokenKind;
function Func73: TtkTokenKind;
function Func74: TtkTokenKind;
function Func76: TtkTokenKind;
function Func77: TtkTokenKind;
function Func78: TtkTokenKind;
function Func79: TtkTokenKind;
function Func80: TtkTokenKind;
function Func81: TtkTokenKind;
function Func86: TtkTokenKind;
function Func87: TtkTokenKind;
function Func89: TtkTokenKind;
function Func91: TtkTokenKind;
function Func94: TtkTokenKind;
function Func96: TtkTokenKind;
function Func98: TtkTokenKind;
function Func99: TtkTokenKind;
function Func100: TtkTokenKind;
function Func101: TtkTokenKind;
function Func102: TtkTokenKind;
function Func105: TtkTokenKind;
function Func116: TtkTokenKind;
function Func124: TtkTokenKind;
procedure StarProc;
procedure CRProc;
procedure IdentProc;
procedure LFProc;
procedure NullProc;
procedure NumberProc;
procedure SlashProc;
procedure SpaceProc;
procedure SymbolProc;
procedure StringProc;
procedure DirectiveProc;
procedure UnknownProc;
function AltFunc: TtkTokenKind;
procedure InitIdent;
function IdentKind(MayBe: PChar): TtkTokenKind;
procedure MakeMethodTables;
procedure CStyleProc;
protected
function GetLanguageName: string; override;
public
constructor Create(AOwner: TComponent); override;
function GetEol: Boolean; override;
function GetRange: Pointer; override;
function GetTokenID: TtkTokenKind;
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 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 SpaceAttri: TmwHighLightAttributes read fSpaceAttri write fSpaceAttri;
property StringAttri: TmwHighLightAttributes read fStringAttri write fStringAttri;
property OperatorAttri: TmwHighLightAttributes read fOperatorAttri write fOperatorAttri;
property DirecAttri: TmwHighLightAttributes read fDirecAttri write fDirecAttri;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents(MWS_HighlightersPage, [TcwCACSyn]);
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 in ['_', 'a'..'z', 'A'..'Z'] of
True: mHashTable[I] := Ord(J) - 64
else mHashTable[I] := 0;
end;
end;
end;
procedure TcwCACSyn.InitIdent;
var
I: Integer;
begin
for I := 0 to 124 do
case I of
10: fIdentFuncTable[I] := Func10;
15: fIdentFuncTable[I] := Func15;
19: fIdentFuncTable[I] := Func19;
21: fIdentFuncTable[I] := Func21;
22: fIdentFuncTable[I] := Func22;
23: fIdentFuncTable[I] := Func23;
24: fIdentFuncTable[I] := Func24;
26: fIdentFuncTable[I] := Func26;
28: fIdentFuncTable[I] := Func28;
29: fIdentFuncTable[I] := Func29;
30: fIdentFuncTable[I] := Func30;
31: fIdentFuncTable[I] := Func31;
32: fIdentFuncTable[I] := Func32;
33: fIdentFuncTable[I] := Func33;
34: fIdentFuncTable[I] := Func34;
35: fIdentFuncTable[I] := Func35;
36: fIdentFuncTable[I] := Func36;
37: fIdentFuncTable[I] := Func37;
38: fIdentFuncTable[I] := Func38;
39: fIdentFuncTable[I] := Func39;
40: fIdentFuncTable[I] := Func40;
41: fIdentFuncTable[I] := Func41;
42: fIdentFuncTable[I] := Func42;
43: fIdentFuncTable[I] := Func43;
44: fIdentFuncTable[I] := Func44;
45: fIdentFuncTable[I] := Func45;
46: fIdentFuncTable[I] := Func46;
47: fIdentFuncTable[I] := Func47;
48: fIdentFuncTable[I] := Func48;
49: fIdentFuncTable[I] := Func49;
51: fIdentFuncTable[I] := Func51;
52: fIdentFuncTable[I] := Func52;
53: fIdentFuncTable[I] := Func53;
54: fIdentFuncTable[I] := Func54;
55: fIdentFuncTable[I] := Func55;
56: fIdentFuncTable[I] := Func56;
57: fIdentFuncTable[I] := Func57;
58: fIdentFuncTable[I] := Func58;
59: fIdentFuncTable[I] := Func59;
60: fIdentFuncTable[I] := Func60;
63: fIdentFuncTable[I] := Func63;
64: fIdentFuncTable[I] := Func64;
65: fIdentFuncTable[I] := Func65;
66: fIdentFuncTable[I] := Func66;
67: fIdentFuncTable[I] := Func67;
68: fIdentFuncTable[I] := Func68;
69: fIdentFuncTable[I] := Func69;
70: fIdentFuncTable[I] := Func70;
72: fIdentFuncTable[I] := Func72;
73: fIdentFuncTable[I] := Func73;
74: fIdentFuncTable[I] := Func74;
76: fIdentFuncTable[I] := Func76;
77: fIdentFuncTable[I] := Func77;
78: fIdentFuncTable[I] := Func78;
79: fIdentFuncTable[I] := Func79;
80: fIdentFuncTable[I] := Func80;
81: fIdentFuncTable[I] := Func81;
86: fIdentFuncTable[I] := Func86;
87: fIdentFuncTable[I] := Func87;
89: fIdentFuncTable[I] := Func89;
91: fIdentFuncTable[I] := Func91;
94: fIdentFuncTable[I] := Func94;
96: fIdentFuncTable[I] := Func96;
98: fIdentFuncTable[I] := Func98;
99: fIdentFuncTable[I] := Func99;
100: fIdentFuncTable[I] := Func100;
101: fIdentFuncTable[I] := Func101;
102: fIdentFuncTable[I] := Func102;
105: fIdentFuncTable[I] := Func105;
116: fIdentFuncTable[I] := Func116;
124: fIdentFuncTable[I] := Func124;
else fIdentFuncTable[I] := AltFunc;
end;
end;
function TcwCACSyn.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 TcwCACSyn.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 TcwCACSyn.Func10: TtkTokenKind;
begin
if KeyComp('AADD') then Result := tkKey else Result := tkIdentifier;
end;
function TcwCACSyn.Func15: TtkTokenKind;
begin
if KeyComp('IF') then Result := tkKey else Result := tkIdentifier;
end;
function TcwCACSyn.Func19: TtkTokenKind;
begin
if KeyComp('AND') then Result := tkKey else Result := tkIdentifier;
end;
function TcwCACSyn.Func21: TtkTokenKind;
begin
if KeyComp('AT') then Result := tkKey else Result := tkIdentifier;
end;
function TcwCACSyn.Func22: TtkTokenKind;
begin
if KeyComp('GO') then Result := tkKey else
if KeyComp('ABS') then Result := tkKey else Result := tkIdentifier;
end;
function TcwCACSyn.Func23: TtkTokenKind;
begin
if KeyComp('BOF') then Result := tkKey else
if KeyComp('ASC') then Result := tkKey else Result := tkIdentifier;
end;
function TcwCACSyn.Func24: TtkTokenKind;
begin
if KeyComp('IIF') then Result := tkKey else Result := tkIdentifier;
end;
function TcwCACSyn.Func26: TtkTokenKind;
begin
if KeyComp('EOF') then Result := tkKey else Result := tkIdentifier;
end;
function TcwCACSyn.Func28: TtkTokenKind;
begin
if KeyComp('READ') then Result := tkKey else
if KeyComp('CALL') then Result := tkKey else Result := tkIdentifier;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?