Ada Source code modifications using ASIS(Ada Semantics接口规范)

Ada Source code modifications using ASIS(Ada Semantics interface specifications)

我正在开发一个工具来查找 Ada 源代码中的子类型范围溢出问题code.for这个目的我正在使用 ASIS 在 Ada 源代码中查找赋值语句并查找右侧变量的类型分配 expression.now 我想用赋值语句中变量类型的 'first, 'last 值替换赋值表达式的变量(不是记录类型),这样如果任何范围溢出我都会得到编译错误 happens.below 是我想传达的一个例子。

procedure Example is
   subtype A_Type is integer 1 .. 10;
   subtype B_Type is integer -5 .. 5;
   subtype C_Type is integer 1 .. 12;

   A : A_Type;
   B : B_Type;
   C : C_Type;
begin
   C := A + B;
end Example;

我想在源代码中将 C := A + B; 修改为 C := A_Type'Last + B_Type'LastC := A_Type'Last + B_Type'Last 赋值语句将在编译时收到警告或在 运行 期间收到约束错误。

是否可以使用 ASIS 进行上述修改?

ASIS 并非设计用于进行此类修改。但是,您可以查看 AdaCore 中的 libadalang,它支持这一点(并且适用于部分源代码,因此您不必预编译源代码)

GNAT 包括实用程序 gnat2xmlxml2gnatgnat2xml 基于 ASIS 生成源的表示,xml2gnat 将其转换回 Ada。您也许可以修改第一个的 XML 输出并将其反馈给第二个。

不是我推荐这个; XML 架构没有记录,而且很复杂。

出于您的目的,您不应重写您正在处理的源文本。您应该编写一个新程序,它只包含所需的声明和赋值。

所以输出应该是这样的:

with Type_Declarations;

procedure Test_Driver is
begin
   declare
      C : Type_Declarations.C_Type;
   begin
      C := Type_Declarations."+" (Type_Declarations.A_Type'First, Type_Declarations.B_Type'First);
      C := Type_Declarations."+" (Type_Declarations.A_Type'First, Type_Declarations.B_Type'Last);
      C := Type_Declarations."+" (Type_Declarations.A_Type'Last, Type_Declarations.B_Type'First);
      C := Type_Declarations."+" (Type_Declarations.A_Type'Last, Type_Declarations.B_Type'Last);
   end;
end Test_Driver;

如果您想要一个可以对 Ada 源代码应用修改的工具,您可能会对我们的 DMS Software Reengineering Toolkit 及其 Ada 前端感兴趣。

DMS 将源代码解析为 AST,并使这些 AST 可用于使用 DMS 的抽象语法树程序接口(直接攻击树节点)and/or DMS's rewrite rules (source-to-source transformations "if you see this replace it by that" written in [Ada] language surface syntax 进行修改,直接操作树.完成更改后,DMS 可以漂亮地打印源代码以重新生成有效的 Ada 源代码,甚至在那些未修改的地方保留注释和格式。