📄 synhighlighterpaxc.pas
字号:
begin
case FLine[Run] of
'.':
if FLine[Succ(Run)] = '.' then
Break
else
if (fTokenID <> tkHex) then
fTokenID := tkFloat
else // invalid
begin
fTokenID := tkUnknown;
Exit;
end;
'-', '+':
begin
if fTokenID <> tkFloat then // number <> float. an arithmetic operator
Exit;
if not (FLine[Pred(Run)] in ['e', 'E']) then
Exit; // number = float, but no exponent. an arithmetic operator
if not (FLine[Succ(Run)] in ['0'..'9', '+', '-']) then // invalid
begin
Inc(Run);
fTokenID := tkUnknown;
Exit;
end
end;
'0'..'7':
if (Run = Succ(idx1)) and (FLine[idx1] = '0') then // octal number
fTokenID := tkOctal;
'8', '9':
if (FLine[idx1] = '0') and
((fTokenID <> tkHex) and (fTokenID <> tkFloat)) then // invalid octal char
fTokenID := tkUnknown;
'a'..'d', 'A'..'D':
if fTokenID <> tkHex then // invalid char
Break;
'e', 'E':
if (fTokenID <> tkHex) then
if FLine[Pred(Run)] in ['0'..'9'] then // exponent
begin
for i := idx1 to Pred(Run) do
if FLine[i] in ['e', 'E'] then // too many exponents
begin
//Run := i;
fTokenID := tkUnknown;
Exit;
end;
if not (FLine[Succ(Run)] in ['0'..'9', '+', '-']) then
Break
else
fTokenID := tkFloat
end
else // invalid char
Break;
'f', 'F':
if fTokenID <> tkHex then
begin
for i := idx1 to Pred(Run) do
if FLine[i] in ['f', 'F'] then // declaration syntax error
begin
fTokenID := tkUnknown;
Exit;
end;
if fTokenID = tkFloat then
begin
if fLine[Pred(Run)] in ['l', 'L'] then // can't mix
Break;
end
else
fTokenID := tkFloat;
end;
'l', 'L':
begin
for i := idx1 to Pred(Run) do
if FLine[i] in ['l', 'L'] then // declaration syntax error
begin
fTokenID := tkUnknown;
Exit;
end;
if fTokenID = tkFloat then
if fLine[Pred(Run)] in ['f', 'F'] then // can't mix
Break;
end;
'u', 'U':
if fTokenID = tkFloat then // not allowed
Break
else
for i := idx1 to Pred(Run) do
if FLine[i] in ['u', 'U'] then // declaration syntax error
begin
fTokenID := tkUnknown;
Exit;
end;
'x', 'X':
if (Run = Succ(idx1)) and // 0x... 'x' must be second char
(FLine[idx1] = '0') and // 0x...
(FLine[Succ(Run)] in ['0'..'9', 'a'..'f', 'A'..'F']) then // 0x... must be continued with a number
fTokenID := tkHex
else // invalid char
begin
if (not Identifiers[fLine[Succ(Run)]]) and
(FLine[Succ(idx1)] in ['x', 'X']) then
begin
Inc(Run); // highlight 'x' too
fTokenID := tkUnknown;
end;
Break;
end;
end; // case
Inc(Run);
end; // while
if FLine[Run] in ['A'..'Z', 'a'..'z', '_'] then
fTokenID := tkUnknown;
end;
procedure TSynPaxCSyn.OrSymbolProc;
begin
fTokenID := tkSymbol;
case FLine[Run + 1] of
'=': {or assign}
begin
inc(Run, 2);
FExtTokenID := xtkIncOrAssign;
end;
'|': {logical or}
begin
inc(Run, 2);
FExtTokenID := xtkLogOr;
end;
else {or}
begin
inc(Run);
FExtTokenID := xtkIncOr;
end;
end;
end;
procedure TSynPaxCSyn.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 TSynPaxCSyn.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 TSynPaxCSyn.RoundCloseProc;
begin
inc(Run);
fTokenID := tkSymbol;
FExtTokenID := xtkRoundClose;
end;
procedure TSynPaxCSyn.RoundOpenProc;
begin
inc(Run);
FTokenID := tkSymbol;
FExtTokenID := xtkRoundOpen;
end;
procedure TSynPaxCSyn.SemiColonProc;
begin
inc(Run);
fTokenID := tkSymbol;
FExtTokenID := xtkSemiColon;
if fRange = rsAsm then fRange := rsUnknown;
end;
procedure TSynPaxCSyn.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 TSynPaxCSyn.SpaceProc;
begin
inc(Run);
fTokenID := tkSpace;
while FLine[Run] in [#1..#9, #11, #12, #14..#32] do inc(Run);
end;
procedure TSynPaxCSyn.SquareCloseProc;
begin
inc(Run);
fTokenID := tkSymbol;
FExtTokenID := xtkSquareClose;
end;
procedure TSynPaxCSyn.SquareOpenProc;
begin
inc(Run);
fTokenID := tkSymbol;
FExtTokenID := xtkSquareOpen;
end;
procedure TSynPaxCSyn.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 TSynPaxCSyn.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 TSynPaxCSyn.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 TSynPaxCSyn.TildeProc;
begin
inc(Run); {bitwise complement}
fTokenId := tkSymbol;
FExtTokenID := xtkBitComplement;
end;
procedure TSynPaxCSyn.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 TSynPaxCSyn.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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -