📄 psvcplusplus.pas
字号:
procedure TpsvCppRTF.BraceOpenProc;
begin
inc(Run);
fTokenId := tkSymbol;
FExtTokenID := xtkBraceOpen;
if fRange = rsAsm then
begin
fRange := rsAsmBlock;
fAsmStart := True;
end;
end;
procedure TpsvCppRTF.CRProc;
begin
fTokenID := tkSpace;
Inc(Run);
if fLine[Run + 1] = #10 then Inc(Run);
end;
procedure TpsvCppRTF.ColonProc;
begin
fTokenID := tkSymbol;
Case FLine[Run + 1] of
':': {scope resolution operator}
begin
inc(Run, 2);
FExtTokenID := xtkScopeResolution;
end;
else {colon}
begin
inc(Run);
FExtTokenID := xtkColon;
end;
end;
end;
procedure TpsvCppRTF.CommaProc;
begin
inc(Run);
fTokenID := tkSymbol;
FExtTokenID := xtkComma;
end;
procedure TpsvCppRTF.DirectiveProc; // dj, rewritten to support multiline directives properly
begin
if Trim(fLine)[1] <> '#' then // '#' is not first char on the line, treat it as an invalid char
begin
fTokenID := tkUnknown;
Inc(Run);
Exit;
end;
fTokenID := tkDirective;
repeat
if fLine[Run] = '/' then // comment?
begin
if fLine[Run + 1] = '/' then // is end of directive as well
begin
fRange := rsUnknown; //ek 2000-04-25
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 TpsvCppRTF.DirectiveEndProc; // dj, added to support multiline directives properly
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; //ek 2000-04-25
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 TpsvCppRTF.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 TpsvCppRTF.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 TpsvCppRTF.QuestionProc;
begin
fTokenID := tkSymbol; {conditional}
FExtTokenID := xtkQuestion;
inc(Run);
end;
procedure TpsvCppRTF.IdentProc;
begin
fTokenID := IdentKind((fLine + Run));
inc(Run, fStringLen);
while Identifiers[fLine[Run]] do inc(Run);
end;
procedure TpsvCppRTF.LFProc;
begin
fTokenID := tkSpace;
inc(Run);
end;
procedure TpsvCppRTF.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 TpsvCppRTF.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 TpsvCppRTF.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 TpsvCppRTF.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 TpsvCppRTF.NullProc;
begin
fTokenID := tkNull;
end;
procedure TpsvCppRTF.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
//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 TpsvCppRTF.OrSymbolProc;
begin
fTokenID := tkSymbol;
case FLine[Run + 1] of
'=': {or assign}
begin
inc(Run, 2);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -