📄 fs_iparser.pas
字号:
end;
function TfsParser.GetWord: String;
begin
Result := Ident;
end;
function TfsParser.GetChar: String;
begin
if FText[FPosition] in ['!', '@', '#', '$', '%', '^', '&', '|', '\',
'.', ',', ':', ';', '?', '''', '"', '~', '`', '_', '[', ']', '{', '}',
'(', ')', '+', '-', '*', '/', '=', '<', '>'] then
begin
Result := FText[FPosition];
Inc(FPosition);
end
else
Result := '';
end;
function TfsParser.GetString: String;
var
Flag: Boolean;
Str: String;
FError: Boolean;
FCpp: Boolean;
function DoQuotedString: Boolean;
var
i, j: Integer;
begin
Result := False;
i := FPosition;
if FText[FPosition] = FStringQuotes[1] then
begin
repeat
Inc(FPosition);
if FCpp and (FText[FPosition] = '\') then
begin
case Lowercase(FText[FPosition + 1])[1] of
'n':
begin
Str := Str + #10;
Inc(FPosition);
end;
'r':
begin
Str := Str + #13;
Inc(FPosition);
end;
'x':
begin
Inc(FPosition, 2);
j := FPosition;
Result := DoHexDigitSequence;
if Result then
Str := Str + Chr(StrToInt('$' + Copy(FText, j, FPosition - j))) else
FPosition := j;
Dec(FPosition);
end
else
begin
Str := Str + FText[FPosition + 1];
Inc(FPosition);
end;
end;
end
else if FText[FPosition] = FStringQuotes[1] then
begin
if not FCpp and (FText[FPosition + 1] = FStringQuotes[1]) then
begin
Str := Str + FStringQuotes[1];
Inc(FPosition);
end
else
break
end
else
Str := Str + FText[FPosition];
until FText[FPosition] in [#0..#31] - [#9];
if FText[FPosition] = FStringQuotes[1] then
begin
Inc(FPosition);
Result := True;
end
else
FPosition := i;
end;
end;
function DoControlString: Boolean;
var
i: Integer;
begin
Result := False;
i := FPosition;
if FText[FPosition] = '#' then
begin
Inc(FPosition);
Result := DoUnsignedInteger;
if Result then
Str := Chr(StrToInt(Copy(FText, i + 1, FPosition - i - 1))) else
FPosition := i;
end;
end;
begin
Result := '';
if FSkipSpace then
SkipSpaces;
Flag := True;
FError := False;
FCpp := FStringQuotes = '"';
repeat
Str := '';
if DoQuotedString or DoControlString then
Result := Result + Str
else
begin
FError := Flag;
break;
end;
Flag := False;
until False;
if not FError then
Result := '''' + Result + '''';
end;
function TfsParser.DoDigitSequence: Boolean;
begin
Result := False;
if FText[FPosition] in ['0'..'9'] then
begin
while FText[FPosition] in ['0'..'9'] do
Inc(FPosition);
Result := True;
end;
end;
function TfsParser.DoHexDigitSequence: Boolean;
begin
Result := False;
if FText[FPosition] in ['0'..'9', 'a'..'f', 'A'..'F'] then
begin
while FText[FPosition] in ['0'..'9', 'a'..'f', 'A'..'F'] do
Inc(FPosition);
Result := True;
end;
end;
function TfsParser.DoUnsignedInteger: Boolean;
var
Pos1: Integer;
s: String;
begin
Pos1 := FPosition;
s := Copy(FText, FPosition, Length(FHexSequence));
if s = FHexSequence then
begin
Inc(FPosition, Length(s));
Result := DoHexDigitSequence;
end
else
Result := DoDigitSequence;
if not Result then
FPosition := Pos1;
end;
function TfsParser.DoUnsignedReal: Boolean;
var
Pos1, Pos2: Integer;
begin
Pos1 := FPosition;
Result := DoUnsignedInteger;
if Result then
begin
if FText[FPosition] = '.' then
begin
Inc(FPosition);
Result := DoDigitSequence;
end;
if Result then
begin
Pos2 := FPosition;
if not DoScaleFactor then
FPosition := Pos2;
end;
end;
if not Result then
FPosition := Pos1;
end;
function TfsParser.DoScaleFactor: Boolean;
begin
Result := False;
if FText[FPosition] in ['e', 'E'] then
begin
Inc(FPosition);
if FText[FPosition] in ['+', '-'] then
Inc(FPosition);
Result := DoDigitSequence;
end;
end;
function TfsParser.GetNumber: String;
var
Pos1: Integer;
begin
Result := '';
if FSkipSpace then
SkipSpaces;
Pos1 := FPosition;
if DoUnsignedReal or DoUnsignedInteger then
Result := Copy(FText, FLastPosition, FPosition - FLastPosition) else
FPosition := Pos1;
if FHexSequence <> '$' then
while Pos(FHexSequence, Result) <> 0 do
begin
Pos1 := Pos(FHexSequence, Result);
Delete(Result, Pos1, Length(FHexSequence));
Insert('$', Result, Pos1);
end;
end;
function TfsParser.GetFRString: String;
var
i, c: Integer;
fl1, fl2: Boolean;
begin
Result := '';
i := FPosition;
fl1 := True;
fl2 := True;
c := 1;
Dec(FPosition);
repeat
Inc(FPosition);
if FText[FPosition] in [#10, #13] then
begin
FPosition := i;
break;
end;
if fl1 and fl2 then
if FText[FPosition] = '<' then
Inc(c)
else if FText[FPosition] = '>' then
Dec(c);
if fl1 then
if FText[FPosition] = '"' then
fl2 := not fl2;
if fl2 then
if FText[FPosition] = '''' then
fl1 := not fl1;
until (c = 0) or (FPosition >= Length(FText));
Result := Copy(FText, i, FPosition - i);
end;
function TfsParser.GetXYPosition: String;
var
i, i0, i1, c, pos, X, Y: Integer;
begin
i0 := 0;
i1 := FYList.Count - 1;
while i0 <= i1 do
begin
i := (i0 + i1) div 2;
pos := Integer(FYList[i]);
if pos = FPosition then
c := 0
else if pos > FPosition then
c := 1
else
c := -1;
if c < 0 then
i0 := i + 1
else
begin
i1 := i - 1;
if c = 0 then
i0 := i;
end;
end;
X := 1;
Y := i0;
i := Integer(FYList[i0 - 1]) + 1;
while i < FPosition do
begin
Inc(i);
Inc(X);
end;
Result := IntToStr(Y) + ':' + IntToStr(X);
end;
function TfsParser.GetPlainPosition(pt: TPoint): Integer;
var
i: Integer;
begin
Result := -1;
i := pt.Y - 1;
if (i >= 0) and (i < FYList.Count) then
Result := Integer(FYList[i]) + pt.X;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -