gpt4 book ai didi

delphi - 如何从DWScript上下文映射或符号表中获取可执行行的行号

转载 作者:行者123 更新时间:2023-12-02 02:41:29 25 4
gpt4 key购买 nike

我正在编写一个与 Delphi 一起使用的 IDE DWScript现在有了一个简单的可调试脚本。我现在想要突出显示源代码中的可执行行(如 Delphi 源代码左侧的蓝点)。挖掘示例/信息我发现有一个程序“SymbolDictionary”,我可以在其中调用“FindSymbolUsage(suReference)” - 这似乎给了我“被引用”符号的位置,我想我可以用“再次调用它” suImplementation' 来获取有分配的行。这让我意识到我可以理解 ContextMap 和 SymbolDictionary 的结构和用途。有人有列出脚本可执行行号的示例吗?

我的初出茅庐的代码复制如下,正在等待批判性分析:-)谢谢

  TExecutableLines = class( TObject )
constructor Create;
destructor Destroy; override;
PRIVATE
FLines : TBits;
function GetIsExecutable(ALineNumber: integer): boolean;
procedure SetIsExecutable(ALineNumber: integer; const Value: boolean);
PUBLIC
procedure Clear;

procedure Evaluate( AProgram : IdwsProgram; const AUnitName : string );

property IsExecutable[ALineNumber : integer] : boolean
read GetIsExecutable
write SetIsExecutable;
end;





{ TExecutableLines }

procedure TExecutableLines.Clear;
begin
FLines.Size := 0;
FLines.Size := 1024;
end;

constructor TExecutableLines.Create;
begin
inherited;

FLines := TBits.Create;
end;

destructor TExecutableLines.Destroy;
begin
FreeAndnil( FLines );
inherited;
end;

procedure TExecutableLines.Evaluate(AProgram: IdwsProgram; const AUnitName : string);
var
I : integer;
Pos : TSymbolPosition;
begin
Clear;
For I := 0 to AProgram.SymbolDictionary.Count-1 do
begin
Pos := AProgram.SymbolDictionary.FindSymbolPosList(
AProgram.SymbolDictionary[I].Symbol ).FindUsage( suReference);
if Pos <> nil then
If Pos.ScriptPos.IsMainModule then
IsExecutable[ Pos.ScriptPos.Line ] := True
else
if SameText( Pos.UnitName, AUnitName ) then
IsExecutable[ Pos.ScriptPos.Line ] := True
end;

end;

function TExecutableLines.GetIsExecutable(ALineNumber: integer): boolean;
begin
if ALineNumber = 0 then
raise Exception.Create('Lines numbers are 1..n' );

if ALineNumber < FLines.Size then
Result := FLines[ALineNumber]
else
Result := False;
end;

procedure TExecutableLines.SetIsExecutable(ALineNumber: integer;
const Value: boolean);
begin
if ALineNumber = 0 then
raise Exception.Create('Lines numbers are 1..n' );

if ALineNumber >= FLines.Size then
FLines.Size := ALineNumber+1;
FLines[ALineNumber] := Value;
end;

最佳答案

TdwsSymbolDictionary 有不同的用途,主要是了解在何处声明或使用符号(如果),以及简化重命名重构等操作(请参阅 http://delphitools.info/2011/02/19/spotlight-on-tsymboldictionary/ )。

TdwsSourceContextMap 用于了解源代码中代码“ block ”的位置(例如类声明在哪里开始和结束、函数实现在哪里开始和结束等),“跳转”到某个位置都很有用在代码中,或者以符号的形式了解光标所在的位置。

您需要的是另一个信息,即哪些行对应于已编译的表达式。为此,您需要查看编译的内容,TExprBase.SubExpr/SubExprCount 是您的主力,或者包装它们的实用程序函数 RecursiveEnumerateSubExprs。使用该函数,您可以查看程序中的所有表达式,从 TdwsProgram.Expr 和 TdwsProgram.InitExpr 开始(您可以将 IdwsProgram 转换为 TdwsProgram 以获取这些属性)。

这些是您可以设置断点的地方。

作为一个例子,假设你有

1.   function Dummy : Integer;
2. var i : Integer;
3. begin
4. while i<10 do begin
5. Inc(i);
6. if i>5 then
7. break;
8. end;
9. end;

如果我没记错的话(突然这样做):

  • 符号字典将在 1 处列出“Dummy”的声明,a在 1 和 2 处使用“Integer”,在 2 处声明“i”,在 2 处使用“i”4、5 和 6。

  • 上下文映射将有一个功能 block ,即主 block 和 while 循环。

  • 包含已编译表达式的行将为 2 (.InitExpr) 和 4, 5,6 & 7 (.Expr)

关于delphi - 如何从DWScript上下文映射或符号表中获取可执行行的行号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7267625/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com