mwpassyn.pas
来自「本人买的<<VC++项目开发实例>>源代码配套光盘.」· PAS 代码 · 共 1,686 行 · 第 1/4 页
PAS
1,686 行
{+-----------------------------------------------------------------------------+
| Class: TmwPasSyn
| Created: 07.98 - 10.98
| Last change: 1999-10-27
| Author: Martin Waldenburg
| Description: A very fast SyntaxScanner for Pascal.
| Version: 0.68 (for version history see version.rtf)
| Copyright (c) 1998 Martin Waldenburg
| All rights reserved.
|
| Thanks to: Primoz Gabrijelcic, Andy Jeffries, Michael Trier, James Jacobson
|
| LICENCE CONDITIONS
|
| USE OF THE ENCLOSED SOFTWARE
| INDICATES YOUR ASSENT TO THE
| FOLLOWING LICENCE CONDITIONS.
|
|
|
| These Licence Conditions are exlusively
| governed by the Law and Rules of the
| Federal Republic of Germany.
|
| Redistribution and use in source and binary form, with or without
| modification, are permitted provided that the following conditions
| are met:
|
| 1. Redistributions of source code must retain the above copyright
| notice, this list of conditions and the following disclaimer.
| If the source is modified, the complete original and unmodified
| source code has to distributed with the modified version.
|
| 2. Redistributions in binary form must reproduce the above
| copyright notice, these licence conditions and the disclaimer
| found at the end of this licence agreement in the documentation
| and/or other materials provided with the distribution.
|
| 3. Software using this code must contain a visible line of credit.
|
| 4. If my code is used in a "for profit" product, you have to donate
| to a registered charity in an amount that you feel is fair.
| You may use it in as many of your products as you like.
| Proof of this donation must be provided to the author of
| this software.
|
| 5. If you for some reasons don't want to give public credit to the
| author, you have to donate three times the price of your software
| product, or any other product including this component in any way,
| but no more than $500 US and not less than $200 US, or the
| equivalent thereof in other currency, to a registered charity.
| You have to do this for every of your products, which uses this
| code separately.
| Proof of this donations must be provided to the author of
| this software.
|
|
| DISCLAIMER:
|
| THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS'.
|
| ALL EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
| THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
| PARTICULAR PURPOSE ARE DISCLAIMED.
|
| IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
| INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
| OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
| INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
| WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
| NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
| THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
| Martin.Waldenburg@T-Online.de
|
+----------------------------------------------------------------------------+}
{$I MWEDIT.INC}
unit mwPasSyn;
interface
uses
SysUtils, Windows, Messages, Classes, Controls, Graphics, Registry,
mwHighlighter,
mwLocalStr,
mwExport;
type
TtkTokenKind = (
tkAsm,
tkComment,
tkIdentifier,
tkKey,
tkNull,
tkNumber,
tkSpace,
tkString,
tkSymbol,
tkUnknown);
TRangeState = (rsANil, rsAnsi, rsAnsiAsm, rsAsm, rsBor, rsBorAsm, rsProperty, rsUnKnown);
// Do this in two parts with the type here and the array below
// this is required because the BCB header creater is buggy.
TProcTableProc = procedure of Object;
TIdentFuncTableFunc = function: TtkTokenKind of Object;
TmwPasSyn = Class(TmwCustomHighLighter)
private
fAsmStart: Boolean;
fRange: TRangeState;
fLine: PChar;
fLineNumber: Integer;
// Altered to use the above declared type
// this is required because the BCB header creater is buggy.
fProcTable: array[#0..#255] of TProcTableProc;
Run: LongInt;
Temp: PChar;
FRoundCount: Integer;
FSquareCount: Integer;
fStringLen: Integer;
fToIdent: PChar;
// Altered to use the above type
// this is required because the BCB header creater is buggy.
fIdentFuncTable: array[0..191] of TIdentFuncTableFunc;
fTokenPos: Integer;
FTokenID: TtkTokenKind;
fStringAttri: TmwHighLightAttributes;
fNumberAttri: TmwHighLightAttributes;
fKeyAttri: TmwHighLightAttributes;
fSymbolAttri: TmwHighLightAttributes;
fAsmAttri: TmwHighLightAttributes;
fCommentAttri: TmwHighLightAttributes;
fIdentifierAttri: TmwHighLightAttributes;
fSpaceAttri: TmwHighLightAttributes;
fD4syntax: boolean;
function KeyHash(ToHash: PChar): Integer;
function KeyComp(const aKey: String): Boolean;
function Func15: TtkTokenKind;
function Func19: TtkTokenKind;
function Func20: TtkTokenKind;
function Func21: TtkTokenKind;
function Func23: TtkTokenKind;
function Func25: TtkTokenKind;
function Func27: TtkTokenKind;
function Func28: TtkTokenKind;
function Func32: TtkTokenKind;
function Func33: TtkTokenKind;
function Func35: TtkTokenKind;
function Func37: TtkTokenKind;
function Func38: TtkTokenKind;
function Func39: TtkTokenKind;
function Func40: TtkTokenKind;
function Func41: TtkTokenKind;
function Func44: TtkTokenKind;
function Func45: TtkTokenKind;
function Func47: TtkTokenKind;
function Func49: TtkTokenKind;
function Func52: TtkTokenKind;
function Func54: TtkTokenKind;
function Func55: TtkTokenKind;
function Func56: TtkTokenKind;
function Func57: TtkTokenKind;
function Func59: TtkTokenKind;
function Func60: TtkTokenKind;
function Func61: TtkTokenKind;
function Func63: TtkTokenKind;
function Func64: TtkTokenKind;
function Func65: TtkTokenKind;
function Func66: TtkTokenKind;
function Func69: TtkTokenKind;
function Func71: TtkTokenKind;
function Func73: TtkTokenKind;
function Func75: TtkTokenKind;
function Func76: TtkTokenKind;
function Func79: TtkTokenKind;
function Func81: TtkTokenKind;
function Func84: TtkTokenKind;
function Func85: TtkTokenKind;
function Func87: TtkTokenKind;
function Func88: TtkTokenKind;
function Func91: TtkTokenKind;
function Func92: TtkTokenKind;
function Func94: TtkTokenKind;
function Func95: TtkTokenKind;
function Func96: TtkTokenKind;
function Func97: TtkTokenKind;
function Func98: TtkTokenKind;
function Func99: TtkTokenKind;
function Func100: TtkTokenKind;
function Func101: TtkTokenKind;
function Func102: TtkTokenKind;
function Func103: TtkTokenKind;
function Func105: TtkTokenKind;
function Func106: TtkTokenKind;
function Func117: TtkTokenKind;
function Func126: TtkTokenKind;
function Func129: TtkTokenKind;
function Func132: TtkTokenKind;
function Func133: TtkTokenKind;
function Func136: TtkTokenKind;
function Func141: TtkTokenKind;
function Func143: TtkTokenKind;
function Func166: TtkTokenKind;
function Func168: TtkTokenKind;
function Func191: TtkTokenKind;
function AltFunc: TtkTokenKind;
procedure InitIdent;
function IdentKind(MayBe: PChar): TtkTokenKind;
procedure MakeMethodTables;
procedure AddressOpProc;
procedure AsciiCharProc;
procedure AnsiProc;
procedure BorProc;
procedure BraceCloseProc;
procedure BraceOpenProc;
procedure ColonProc;
procedure CommaProc;
procedure CRProc;
procedure EqualProc;
procedure GreaterProc;
procedure IdentProc;
procedure IntegerProc;
procedure LFProc;
procedure LowerProc;
procedure MinusProc;
procedure NullProc;
procedure NumberProc;
procedure PlusProc;
procedure PointerSymbolProc;
procedure PointProc;
procedure RoundCloseProc;
procedure RoundOpenProc;
procedure SemiColonProc;
procedure SlashProc;
procedure SpaceProc;
procedure SquareCloseProc;
procedure SquareOpenProc;
procedure StarProc;
procedure StringProc;
procedure SymbolProc;
procedure UnknownProc;
procedure SetD4syntax(const Value: boolean);
protected
function GetIdentChars: TIdentChars; override;
function GetLanguageName: string; override;
function GetCapability: THighlighterCapability; override;
public
constructor Create(AOwner: TComponent); override;
procedure ExportNext;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 UseUserSettings(settingIndex: integer): boolean; override;
procedure EnumUserSettings(settings: TStrings); override;
property IdentChars;
published
property AsmAttri: TmwHighLightAttributes read fAsmAttri write fAsmAttri;
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 SymbolAttri: TmwHighLightAttributes read fSymbolAttri write fSymbolAttri;
property D4syntax: boolean read FD4syntax write SetD4syntax default true;
end;
var
mwPasLex: TmwPasSyn;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents(MWS_HighlightersPage, [TmwPasSyn]);
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 TmwPasSyn.InitIdent;
var
I: Integer;
begin
for I := 0 to 191 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;
32: fIdentFuncTable[I] := Func32;
33: fIdentFuncTable[I] := Func33;
35: fIdentFuncTable[I] := Func35;
37: fIdentFuncTable[I] := Func37;
38: fIdentFuncTable[I] := Func38;
39: fIdentFuncTable[I] := Func39;
40: fIdentFuncTable[I] := Func40;
41: fIdentFuncTable[I] := Func41;
44: fIdentFuncTable[I] := Func44;
45: fIdentFuncTable[I] := Func45;
47: fIdentFuncTable[I] := Func47;
49: fIdentFuncTable[I] := Func49;
52: fIdentFuncTable[I] := Func52;
54: fIdentFuncTable[I] := Func54;
55: fIdentFuncTable[I] := Func55;
56: fIdentFuncTable[I] := Func56;
57: fIdentFuncTable[I] := Func57;
59: fIdentFuncTable[I] := Func59;
60: fIdentFuncTable[I] := Func60;
61: fIdentFuncTable[I] := Func61;
63: fIdentFuncTable[I] := Func63;
64: fIdentFuncTable[I] := Func64;
65: fIdentFuncTable[I] := Func65;
66: fIdentFuncTable[I] := Func66;
69: fIdentFuncTable[I] := Func69;
71: fIdentFuncTable[I] := Func71;
73: fIdentFuncTable[I] := Func73;
75: fIdentFuncTable[I] := Func75;
76: fIdentFuncTable[I] := Func76;
79: fIdentFuncTable[I] := Func79;
81: fIdentFuncTable[I] := Func81;
84: fIdentFuncTable[I] := Func84;
85: fIdentFuncTable[I] := Func85;
87: fIdentFuncTable[I] := Func87;
88: fIdentFuncTable[I] := Func88;
91: fIdentFuncTable[I] := Func91;
92: fIdentFuncTable[I] := Func92;
94: fIdentFuncTable[I] := Func94;
95: fIdentFuncTable[I] := Func95;
96: fIdentFuncTable[I] := Func96;
97: fIdentFuncTable[I] := Func97;
98: fIdentFuncTable[I] := Func98;
99: fIdentFuncTable[I] := Func99;
100: fIdentFuncTable[I] := Func100;
101: fIdentFuncTable[I] := Func101;
102: fIdentFuncTable[I] := Func102;
103: fIdentFuncTable[I] := Func103;
105: fIdentFuncTable[I] := Func105;
106: fIdentFuncTable[I] := Func106;
117: fIdentFuncTable[I] := Func117;
126: fIdentFuncTable[I] := Func126;
129: fIdentFuncTable[I] := Func129;
132: fIdentFuncTable[I] := Func132;
133: fIdentFuncTable[I] := Func133;
136: fIdentFuncTable[I] := Func136;
141: fIdentFuncTable[I] := Func141;
143: fIdentFuncTable[I] := Func143;
166: fIdentFuncTable[I] := Func166;
168: fIdentFuncTable[I] := Func168;
191: fIdentFuncTable[I] := Func191;
else fIdentFuncTable[I] := AltFunc;
end;
end;
function TmwPasSyn.KeyHash(ToHash: PChar): Integer;
begin
Result := 0;
while ToHash^ in ['a'..'z', 'A'..'Z'] do
begin
inc(Result, mHashTable[ToHash^]);
inc(ToHash);
end;
if ToHash^ in ['_', '0'..'9'] then inc(ToHash);
fStringLen := ToHash - fToIdent;
end; { KeyHash }
function TmwPasSyn.KeyComp(const aKey: String): Boolean;
var
I: Integer;
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;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?