mwgeneralsyn.pas
来自「本人买的<<VC++项目开发实例>>源代码配套光盘.」· PAS 代码 · 共 792 行 · 第 1/2 页
PAS
792 行
{Created by mwSynGen}
{+--------------------------------------------------------------------------+
| Unit: mwGeneralSyn
| Created: 12.98
| Last change: 1999-11-11
| Author: Martin Waldenburg
| Copyright 1998, No rights reserved.
| Description: A general HighLighter for Use with mwCustomEdit.
| The KeyWords in the string list KeyWords have to be UpperCase and sorted.
| Version: 0.73
| Status Public Domain
| DISCLAIMER: This is provided as is, expressly without a warranty of any kind.
| You use it at your own risc.
|
| Thanks to: Primoz Gabrijelcic, James Jacobson, Kees van Spelde, Andy Jeffries
|
| Version history: see version.rtf
|
+--------------------------------------------------------------------------+}
unit mwGeneralSyn;
interface
uses
SysUtils, Windows, Messages, Classes, Controls, Graphics, Registry,
mwHighlighter, mwLocalStr,
mwExport;
Type
TtkTokenKind = (
tkComment,
tkIdentifier,
tkKey,
tkNull,
tkNumber,
tkSpace,
tkString,
tkSymbol,
tkUnknown);
TCommentStyle = (csAnsiStyle, csPasStyle, csCStyle, csAsmStyle, csBasStyle);
CommentStyles = Set of TCommentStyle;
TRangeState = (rsANil, rsAnsi, rsPasStyle, rsCStyle, rsUnKnown);
TStringDelim = (sdSingleQuote, sdDoubleQuote);
TProcTableProc = procedure of Object;
type
TmwGeneralSyn = class(TmwCustomHighLighter)
private
fRange: TRangeState;
fLine: PChar;
fProcTable: array[#0..#255] of TProcTableProc;
Run: LongInt;
fTokenPos: Integer;
fTokenID: TtkTokenKind;
fLineNumber : Integer;
fStringAttri: TmwHighLightAttributes;
fSymbolAttri: TmwHighLightAttributes;
fKeyAttri: TmwHighLightAttributes;
fNumberAttri: TmwHighLightAttributes;
fCommentAttri: TmwHighLightAttributes;
fSpaceAttri: TmwHighLightAttributes;
fIdentifierAttri: TmwHighLightAttributes;
fKeyWords: TStrings;
fComments: CommentStyles;
fStringDelimCh: char;
fIdentChars: TIdentChars;
procedure AsciiCharProc;
procedure BraceOpenProc;
procedure PointCommaProc;
procedure CRProc;
procedure IdentProc;
procedure IntegerProc;
procedure LFProc;
procedure NullProc;
procedure NumberProc;
procedure RoundOpenProc;
procedure SlashProc;
procedure SpaceProc;
procedure StringProc;
procedure UnknownProc;
procedure MakeMethodTables;
function IsKeyWord(aToken: String): Boolean;
procedure AnsiProc;
procedure PasStyleProc;
procedure CStyleProc;
procedure SetKeyWords(const Value: TStrings);
procedure SetComments(Value: CommentStyles);
function GetStringDelim: TStringDelim;
procedure SetStringDelim(const Value: TStringDelim);
function GetIdentifierChars: string;
procedure SetIdentifierChars(const Value: string);
protected
function GetLanguageName: string; override;
function GetIdentChars: TIdentChars; override;
function GetCapability: THighlighterCapability; override;
public
constructor Create(AOwner: TComponent); override;
procedure ExportNext;override;
destructor Destroy; 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 SetLineForExport(NewValue: String); override;
procedure SetRange(Value: Pointer); override;
procedure ReSetRange; override;
function SaveToRegistry(RootKey: HKEY; Key: string): boolean; override;
function LoadFromRegistry(RootKey: HKEY; Key: string): boolean; override;
published
property Comments: CommentStyles read fComments write SetComments;
property CommentAttri: TmwHighLightAttributes read fCommentAttri write fCommentAttri;
property IdentifierAttri: TmwHighLightAttributes read fIdentifierAttri write fIdentifierAttri;
property IdentifierChars: string read GetIdentifierChars write SetIdentifierChars;
property KeyAttri: TmwHighLightAttributes read fKeyAttri write fKeyAttri;
property KeyWords: TStrings read fKeyWords write SetKeyWords;
property NumberAttri: TmwHighLightAttributes read fNumberAttri write fNumberAttri;
property SpaceAttri: TmwHighLightAttributes read fSpaceAttri write fSpaceAttri;
property StringAttri: TmwHighLightAttributes read fStringAttri write fStringAttri;
property SymbolAttri: TmwHighLightAttributes read fSymbolAttri write fSymbolAttri;
property StringDelim: TStringDelim read GetStringDelim write SetStringDelim
default sdSingleQuote;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents(MWS_HighlightersPage, [TmwGeneralSyn]);
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;
function TmwGeneralSyn.IsKeyWord(aToken: String): Boolean;
var
First, Last, I, Compare: Integer;
Token: String;
begin
First := 0;
Last := fKeywords.Count - 1;
Result := False;
Token := UpperCase(aToken);
while First <= Last do
begin
I := (First + Last) shr 1;
Compare := CompareStr(fKeywords[i], Token);
if Compare = 0 then
begin
Result := True;
break;
end
else
if Compare < 0 then First := I + 1 else Last := I - 1;
end;
end; { IsKeyWord }
procedure TmwGeneralSyn.MakeMethodTables;
var
I: Char;
begin
for I := #0 to #255 do
case I of
'#': fProcTable[I] := AsciiCharProc;
'{': fProcTable[I] := BraceOpenProc;
';': fProcTable[I] := PointCommaProc;
#13: fProcTable[I] := CRProc;
'A'..'Z', 'a'..'z', '_': fProcTable[I] := IdentProc;
'$': fProcTable[I] := IntegerProc;
#10: fProcTable[I] := LFProc;
#0: fProcTable[I] := NullProc;
'0'..'9': fProcTable[I] := NumberProc;
'(': fProcTable[I] := RoundOpenProc;
'/': fProcTable[I] := SlashProc;
#1..#9, #11, #12, #14..#32: fProcTable[I] := SpaceProc;
else fProcTable[I] := UnknownProc;
end;
fProcTable[fStringDelimCh] := StringProc;
end;
function TmwGeneralSyn.GetCapability: THighlighterCapability;
begin
Result := inherited GetCapability + [hcExportable];
end;
constructor TmwGeneralSyn.Create(AOwner: TComponent);
begin
fKeyWords := TStringList.Create;
TStringList(fKeyWords).Sorted := True;
TStringList(fKeyWords).Duplicates := dupIgnore;
fCommentAttri := TmwHighLightAttributes.Create(MWS_AttrComment);
fCommentAttri.Style := [fsItalic];
fIdentifierAttri := TmwHighLightAttributes.Create(MWS_AttrIdentifier);
fKeyAttri := TmwHighLightAttributes.Create(MWS_AttrReservedWord);
fKeyAttri.Style := [fsBold];
fNumberAttri := TmwHighLightAttributes.Create(MWS_AttrNumber);
fSpaceAttri := TmwHighLightAttributes.Create(MWS_AttrSpace);
fStringAttri := TmwHighLightAttributes.Create(MWS_AttrString);
fSymbolAttri := TmwHighLightAttributes.Create(MWS_AttrSymbol);
inherited Create(AOwner);
AddAttribute(fCommentAttri);
AddAttribute(fIdentifierAttri);
AddAttribute(fKeyAttri);
AddAttribute(fNumberAttri);
AddAttribute(fSpaceAttri);
AddAttribute(fStringAttri);
AddAttribute(fSymbolAttri);
SetAttributesOnChange(DefHighlightChange);
fStringDelimCh := '''';
fIdentChars := inherited GetIdentChars;
MakeMethodTables;
fRange := rsUnknown;
end; { Create }
destructor TmwGeneralSyn.Destroy;
begin
fKeyWords.Free;
inherited Destroy;
end; { Destroy }
procedure TmwGeneralSyn.SetLine(NewValue: String; LineNumber:Integer);
begin
fLine := PChar(NewValue);
Run := 0;
fLineNumber := LineNumber;
Next;
end; { SetLine }
procedure TmwGeneralSyn.AnsiProc;
begin
fTokenID := tkComment;
case FLine[Run] of
#0:
begin
NullProc;
exit;
end;
#10:
begin
LFProc;
exit;
end;
#13:
begin
CRProc;
exit;
end;
end;
while fLine[Run] <> #0 do
case fLine[Run] of
'*':
if fLine[Run + 1] = ')' then
begin
fRange := rsUnKnown;
inc(Run, 2);
break;
end else inc(Run);
#10: break;
#13: break;
else inc(Run);
end;
end;
procedure TmwGeneralSyn.PasStyleProc;
begin
fTokenID := tkComment;
case FLine[Run] of
#0:
begin
NullProc;
exit;
end;
#10:
begin
LFProc;
exit;
end;
#13:
begin
CRProc;
exit;
end;
end;
while FLine[Run] <> #0 do
case FLine[Run] of
'}':
begin
fRange := rsUnKnown;
inc(Run);
break;
end;
#10: break;
#13: break;
else inc(Run);
end;
end;
procedure TmwGeneralSyn.CStyleProc;
begin
fTokenID := tkComment;
case FLine[Run] of
#0:
begin
NullProc;
exit;
end;
#10:
begin
LFProc;
exit;
end;
#13:
begin
CRProc;
exit;
end;
end;
while fLine[Run] <> #0 do
case fLine[Run] of
'*':
if fLine[Run + 1] = '/' then
begin
fRange := rsUnKnown;
inc(Run, 2);
break;
end else inc(Run);
#10: break;
#13: break;
else inc(Run);
end;
end;
procedure TmwGeneralSyn.AsciiCharProc;
begin
fTokenID := tkString;
inc(Run);
while FLine[Run] in ['0'..'9'] do inc(Run);
end;
procedure TmwGeneralSyn.BraceOpenProc;
begin
if csPasStyle in fComments then
begin
fTokenID := tkComment;
fRange := rsPasStyle;
inc(Run);
while FLine[Run] <> #0 do
case FLine[Run] of
'}':
begin
fRange := rsUnKnown;
inc(Run);
break;
end;
#10: break;
#13: break;
else inc(Run);
end;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?