📄 psvcplusplus.pas
字号:
FExtTokenID := xtkIncOrAssign;
end;
'|': {logical or}
begin
inc(Run, 2);
FExtTokenID := xtkLogOr;
end;
else {or}
begin
inc(Run);
FExtTokenID := xtkIncOr;
end;
end;
end;
procedure TpsvCppRTF.PlusProc;
begin
fTokenID := tkSymbol;
case FLine[Run + 1] of
'=': {add assign}
begin
inc(Run, 2);
FExtTokenID := xtkAddAssign;
end;
'+': {increment}
begin
inc(Run, 2);
FExtTokenID := xtkIncrement;
end;
else {add}
begin
inc(Run);
FExtTokenID := xtkAdd;
end;
end;
end;
procedure TpsvCppRTF.PointProc;
begin
fTokenID := tkSymbol;
if (FLine[Run + 1] = '.') and (FLine[Run + 2] = '.') then
begin {ellipse}
inc(Run, 3);
FExtTokenID := xtkEllipse;
end
else
if FLine[Run + 1] in ['0'..'9'] then // float
begin
Dec(Run); // numberproc must see the point
NumberProc;
end
else {point}
begin
inc(Run);
FExtTokenID := xtkPoint;
end;
end;
procedure TpsvCppRTF.RoundCloseProc;
begin
inc(Run);
fTokenID := tkSymbol;
FExtTokenID := xtkRoundClose;
end;
procedure TpsvCppRTF.RoundOpenProc;
begin
inc(Run);
FTokenID := tkSymbol;
FExtTokenID := xtkRoundOpen;
end;
procedure TpsvCppRTF.SemiColonProc;
begin
inc(Run);
fTokenID := tkSymbol;
FExtTokenID := xtkSemiColon;
if fRange = rsAsm then fRange := rsUnknown;
end;
procedure TpsvCppRTF.SlashProc;
begin
case FLine[Run + 1] of
'/': {c++ style comments}
begin
fTokenID := tkComment;
inc(Run, 2);
while not (fLine[Run] in [#0, #10, #13]) do Inc(Run);
end;
'*': {c style comments}
begin
fTokenID := tkComment;
if fRange = rsAsm then
fRange := rsAnsiCAsm
else if fRange = rsAsmBlock then
fRange := rsAnsiCAsmBlock
else if fRange <> rsDirectiveComment then
fRange := rsAnsiC;
inc(Run, 2);
while fLine[Run] <> #0 do
case fLine[Run] of
'*':
if fLine[Run + 1] = '/' then
begin
inc(Run, 2);
if fRange = rsDirectiveComment then
fRange := rsMultiLineDirective //dj
else if fRange = rsAnsiCAsm then
fRange := rsAsm
else
begin
if fRange = rsAnsiCAsmBlock then
fRange := rsAsmBlock
else
fRange := rsUnKnown;
end;
break;
end else inc(Run);
#10, #13:
begin
if fRange = rsDirectiveComment then
fRange := rsAnsiC;
break;
end;
else inc(Run);
end;
end;
'=': {divide assign}
begin
inc(Run, 2);
fTokenID := tkSymbol;
FExtTokenID := xtkDivideAssign;
end;
else {divide}
begin
inc(Run);
fTokenID := tkSymbol;
FExtTokenID := xtkDivide;
end;
end;
end;
procedure TpsvCppRTF.SpaceProc;
begin
inc(Run);
fTokenID := tkSpace;
while FLine[Run] in [#1..#9, #11, #12, #14..#32] do inc(Run);
end;
procedure TpsvCppRTF.SquareCloseProc;
begin
inc(Run);
fTokenID := tkSymbol;
FExtTokenID := xtkSquareClose;
end;
procedure TpsvCppRTF.SquareOpenProc;
begin
inc(Run);
fTokenID := tkSymbol;
FExtTokenID := xtkSquareOpen;
end;
procedure TpsvCppRTF.StarProc;
begin
fTokenID := tkSymbol;
case FLine[Run + 1] of
'=': {multiply assign}
begin
inc(Run, 2);
FExtTokenID := xtkMultiplyAssign;
end;
else {star}
begin
inc(Run);
FExtTokenID := xtkStar;
end;
end;
end;
procedure TpsvCppRTF.StringProc;
begin
fTokenID := tkString;
repeat
if fLine[Run] = '\' then begin
case fLine[Run + 1] of
#34, '\':
Inc(Run);
#00:
begin
Inc(Run);
fRange := rsMultilineString;
Exit;
end;
end;
end;
inc(Run);
until fLine[Run] in [#0, #10, #13, #34];
if FLine[Run] = #34 then
inc(Run);
end;
procedure TpsvCppRTF.StringEndProc;
begin
fTokenID := tkString;
case FLine[Run] of
#0:
begin
NullProc;
Exit;
end;
#10:
begin
LFProc;
Exit;
end;
#13:
begin
CRProc;
Exit;
end;
end;
fRange := rsUnknown;
repeat
case FLine[Run] of
#0, #10, #13: Break;
'\':
begin
case fLine[Run + 1] of
#34, '\':
Inc(Run);
#00:
begin
Inc(Run);
fRange := rsMultilineString;
Exit;
end;
end;
end;
#34: Break;
end;
inc(Run);
until fLine[Run] in [#0, #10, #13, #34];
if FLine[Run] = #34 then
inc(Run);
end;
procedure TpsvCppRTF.TildeProc;
begin
inc(Run); {bitwise complement}
fTokenId := tkSymbol;
FExtTokenID := xtkBitComplement;
end;
procedure TpsvCppRTF.XOrSymbolProc;
begin
fTokenID := tkSymbol;
Case FLine[Run + 1] of
'=': {xor assign}
begin
inc(Run, 2);
FExtTokenID := xtkXorAssign;
end;
else {xor}
begin
inc(Run);
FExtTokenID := xtkXor;
end;
end;
end;
procedure TpsvCppRTF.UnknownProc;
begin
{$IFDEF SYN_MBCSSUPPORT}
if FLine[Run] in LeadBytes then // if FLine[Run] is the leadbyte of MBCS char,then jump 2 chars.
Inc(Run,2)
else
{$ENDIF}
Inc(Run);
fTokenID := tkUnknown;
end;
procedure TpsvCppRTF.Next;
begin
fAsmStart := False;
fTokenPos := Run;
case fRange of
rsAnsiC, rsAnsiCAsm,
rsAnsiCAsmBlock, rsDirectiveComment: AnsiCProc;
rsMultiLineDirective: DirectiveEndProc; // dj
rsMultilineString: StringEndProc; //ek 2001-08-02
else
begin
fRange := rsUnknown;
fProcTable[fLine[Run]];
end;
end;
end;
function TpsvCppRTF.GetEol: Boolean;
begin
Result := fTokenID = tkNull;
end;
function TpsvCppRTF.GetRange: Pointer;
begin
Result := Pointer(fRange);
end;
function TpsvCppRTF.GetToken: String;
var
Len: LongInt;
begin
Len := Run - fTokenPos;
SetString(Result, (FLine + fTokenPos), Len);
end;
function TpsvCppRTF.GetTokenID: TtkTokenKind;
begin
Result := fTokenId;
if ((fRange = rsAsm) or (fRange = rsAsmBlock)) and not fAsmStart
and not (fTokenId in [tkComment, tkSpace, tkNull])
then
Result := tkAsm;
end;
function TpsvCppRTF.GetExtTokenID: TxtkTokenKind;
begin
Result := FExtTokenID;
end;
function TpsvCppRTF.GetTokenAttribute: integer;
begin
case fTokenID of
tkAsm: Result := 1;
tkComment: Result := 2;
tkDirective: Result := 3;
tkIdentifier: Result := 4;
tkKey: Result := 5;
tkNumber: Result := 6;
tkFloat: Result := 7;
tkHex: Result := 8;
tkOctal: Result := 9;
tkSpace: Result := 10;
tkString: Result := 11;
tkChar: Result := 12;
tkSymbol: Result := 13;
tkUnknown: Result := 14;
else Result := 15;
end;
end;
function TpsvCppRTF.GetTokenKind: integer;
begin
Result := Ord(GetTokenID);
end;
function TpsvCppRTF.GetTokenPos: Integer;
begin
Result := fTokenPos;
end;
procedure TpsvCppRTF.ReSetRange;
begin
fRange:= rsUnknown;
end;
procedure TpsvCppRTF.SetRange(Value: Pointer);
begin
fRange := TRangeState(Value);
end;
procedure TpsvCppRTF.PrepareToken(var AToken : string);
var St : string;
begin
St := AToken;
St := StringReplace(St,'\','\\',[rfReplaceAll]);
St := StringReplace(St,'{','\{',[rfReplaceAll]);
St := StringReplace(St,'}','\}',[rfReplaceAll]);
AToken := St;
end;
function TpsvCPPRTF.PrepareOutput(Attr: integer; AToken : string): string;
begin
case Attr of
2 : Result := '\cf2 \i '+ AToken +'\i0 ';
5 : Result := '\cf5 \b '+ AToken +'\b0 ';
else
Result := Format('\cf%d %s',[Attr,AToken]);
end;
end;
procedure TpsvCppRTF.SetupDefaultColors;
begin
CreateColorTable(
[clBlack, //1 tkAsm
clGreen, //2 tkComment
clBlack, //3 tkDirective
clBlack, //4 tkIdentifier
clBlue, //5 tkKey
clBlue, //6 tkNumber
clBlack, //7 tkFloat
clBlack, //8 tkHex
clBlack, //9 tkOctal
clBlack, //10 tkSpace
clBlack, //11 tkString
clBlack, //12 tkChar
clBlack, //13 tkSymbol
clBlack, //14 tkUnknown
clBlack] //15 else
);
end;
initialization
MakeIdentTable;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -