📄 synhighlightercpp.pas
字号:
begin
if fLine[Run + 1] = '/' then // is end of directive as well
begin
fRange := rsUnknown;
Exit;
end
else
if fLine[Run + 1] = '*' then // might be embedded only
begin
fRange := rsDirectiveComment;
Exit;
end;
end;
if (fLine[Run] = '\') and (fLine[Run +1 ] = #0) then // a multiline directive
begin
Inc(Run);
fRange := rsMultiLineDirective;
Exit;
end;
Inc(Run);
until fLine[Run] in [#0, #10, #13];
end;
procedure TSynCppSyn.DirectiveEndProc;
begin
fTokenID := tkDirective;
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;
'/': // comment?
begin
case fLine[Run + 1] of
'/': // is end of directive as well
begin
fRange := rsUnknown;
Exit;
end;
'*': // might be embedded only
begin
fRange := rsDirectiveComment;
Exit;
end;
end;
end;
'\': // yet another line?
begin
if fLine[Run + 1] = #0 then
begin
Inc(Run);
fRange := rsMultiLineDirective;
Exit;
end;
end;
end;
Inc(Run);
until fLine[Run] in [#0, #10, #13];
end;
procedure TSynCppSyn.EqualProc;
begin
fTokenID := tkSymbol;
case FLine[Run + 1] of
'=': {logical equal}
begin
inc(Run, 2);
FExtTokenID := xtkLogEqual;
end;
else {assign}
begin
inc(Run);
FExtTokenID := xtkAssign;
end;
end;
end;
procedure TSynCppSyn.GreaterProc;
begin
fTokenID := tkSymbol;
Case FLine[Run + 1] of
'=': {greater than or equal to}
begin
inc(Run, 2);
FExtTokenID := xtkGreaterThanEqual;
end;
'>':
begin
if FLine[Run + 2] = '=' then {shift right assign}
begin
inc(Run, 3);
FExtTokenID := xtkShiftRightAssign;
end
else {shift right}
begin
inc(Run, 2);
FExtTokenID := xtkShiftRight;
end;
end;
else {greater than}
begin
inc(Run);
FExtTokenID := xtkGreaterThan;
end;
end;
end;
procedure TSynCppSyn.QuestionProc;
begin
fTokenID := tkSymbol; {conditional}
FExtTokenID := xtkQuestion;
inc(Run);
end;
procedure TSynCppSyn.IdentProc;
begin
fTokenID := IdentKind((fLine + Run));
inc(Run, fStringLen);
while Identifiers[fLine[Run]] do inc(Run);
end;
procedure TSynCppSyn.LFProc;
begin
fTokenID := tkSpace;
inc(Run);
end;
procedure TSynCppSyn.LowerProc;
begin
fTokenID := tkSymbol;
case FLine[Run + 1] of
'=': {less than or equal to}
begin
inc(Run, 2);
FExtTokenID := xtkLessThanEqual;
end;
'<':
begin
if FLine[Run + 2] = '=' then {shift left assign}
begin
inc(Run, 3);
FExtTokenID := xtkShiftLeftAssign;
end
else {shift left}
begin
inc(Run, 2);
FExtTokenID := xtkShiftLeft;
end;
end;
else {less than}
begin
inc(Run);
FExtTokenID := xtkLessThan;
end;
end;
end;
procedure TSynCppSyn.MinusProc;
begin
fTokenID := tkSymbol;
case FLine[Run + 1] of
'=': {subtract assign}
begin
inc(Run, 2);
FExtTokenID := xtkSubtractAssign;
end;
'-': {decrement}
begin
inc(Run, 2);
FExtTokenID := xtkDecrement;
end;
'>': {arrow}
begin
inc(Run, 2);
FExtTokenID := xtkArrow;
end;
else {subtract}
begin
inc(Run);
FExtTokenID := xtkSubtract;
end;
end;
end;
procedure TSynCppSyn.ModSymbolProc;
begin
fTokenID := tkSymbol;
case FLine[Run + 1] of
'=': {mod assign}
begin
inc(Run, 2);
FExtTokenID := xtkModAssign;
end;
else {mod}
begin
inc(Run);
FExtTokenID := xtkMod;
end;
end;
end;
procedure TSynCppSyn.NotSymbolProc;
begin
fTokenID := tkSymbol;
case FLine[Run + 1] of
'=': {not equal}
begin
inc(Run, 2);
FExtTokenID := xtkNotEqual;
end;
else {not}
begin
inc(Run);
FExtTokenID := xtkLogComplement;
end;
end;
end;
procedure TSynCppSyn.NullProc;
begin
fTokenID := tkNull;
end;
procedure TSynCppSyn.NumberProc;
var
idx1: Integer; // token[1]
i: Integer;
begin
idx1 := Run;
Inc(Run);
fTokenID := tkNumber;
while FLine[Run] in
['0'..'9', 'A'..'F', 'a'..'f', '.', 'u', 'U', 'l', 'L', 'x', 'X', '-', '+'] do
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
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 Run - 2 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 TSynCppSyn.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 TSynCppSyn.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 TSynCppSyn.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 TSynCppSyn.RoundCloseProc;
begin
inc(Run);
fTokenID := tkSymbol;
FExtTokenID := xtkRoundClose;
end;
procedure TSynCppSyn.RoundOpenProc;
begin
inc(Run);
FTokenID := tkSymbol;
FExtTokenID := xtkRoundOpen;
end;
procedure TSynCppSyn.SemiColonProc;
begin
inc(Run);
fTokenID := tkSymbol;
FExtTokenID := xtkSemiColon;
if fRange = rsAsm then fRange := rsUnknown;
end;
procedure TSynCppSyn.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
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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -