在 Ada 中实现具有访问类型的抽象函数

2023-12-30

我有一个名为 Statements 的包,其中包含一个名为 Statement 的抽象类型和一个名为execute() 的抽象函数。在另一个包中,我有一个CompoundStatement 类型,它是一个Statement 类型,它实现了execute() 函数。

我有一个名为 createStatement() 的函数。它的目的是评估 Unbounded_String 类型的标记并确定它包含什么关键字。然后根据这个关键字它会生成一个基于这个关键字的访问类型。

到目前为止,一切都很好。

但我不知道如何调用正确的执行方法。我现在只编码了一个关键字,因为它尚未起作用。

抱歉,如果我的描述听起来很复杂。

package Statements is

   type Statement is abstract tagged private;
   type Statement_Access is access all Statement'Class;

   function execute(skip: in Boolean; T: in TokenHandler; S: in Statement) return Integer is abstract;

private
   type Statement is abstract tagged
      record
         tokens: Vector;
      end record;

end Statements;

   procedure createStatement(T : in TokenHandler; stmt: out Statement_Access) is
      currenttoken : Unbounded_String;
      C            : CompoundStatement;

   begin
      currenttoken := To_Unbounded_String(TokenHandlers.getCurrentToken(T));
      if currenttoken = "begin" then
         createCompoundStatement(T, C);
         stmt := new CompoundStatement;
         stmt.all := Statement'Class(C);
      end if;
   end createStatement;

   procedure createCompoundStatement(T : in TokenHandler; C: out CompoundStatement) is
   begin
      C.tokens := T.tokens;
   end createCompoundStatement;

   function execute(skip: in Boolean; T: in TokenHandler; C: in CompoundStatement) return Integer is
      TK: TokenHandler := T;
      stmt: Statement_Access;
      tokensexecuted: Integer;
      currenttoken : Unbounded_String;
   begin
      TokenHandlers.match("begin", TK);
      currenttoken := To_Unbounded_String(TokenHandlers.getCurrentToken(TK));
      while(currenttoken /= "end") loop
         Put(To_String(currenttoken));
         createStatement(T, stmt);
         tokensexecuted := execute(skip, TK, stmt);  //ERROR OCCURS HERE
         TokenHandlers.moveAhead(tokensexecuted, TK);
         currenttoken := To_Unbounded_String(TokenHandlers.getCurrentToken(TK));
      end loop;
      TokenHandlers.match("end", TK);
      return TokenHandlers.resetTokens(TK);      
   end execute;

当我编译时,我得到这个错误:

statements-statementhandlers.adb:35:28: no candidate interpretations match the actuals:
statements-statementhandlers.adb:35:46: expected type "CompoundStatement" defined at statements-statementhandlers.ads:14
statements-statementhandlers.adb:35:46: found type "Statement_Access" defined at statements.ads:6
statements-statementhandlers.adb:35:46:   ==> in call to "execute" at statements-statementhandlers.ads:10
statements-statementhandlers.adb:35:46:   ==> in call to "execute" at statements.ads:8

第三个参数为execute预计是(的孩子)Statement,但你给它的是一个指向一个(的孩子)Statement。你可能想要

tokensexecuted := execute(skip, TK, stmt.all);

顺便说一下,作为一种风格问题,通常最好将调度参数放在第一个;那么你可以(在 Ada 2005 中)说

tokensexecuted := stmt.execute(skip, TK);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Ada 中实现具有访问类型的抽象函数 的相关文章

  • 将大块位图转换为 3 维位图

    Problem 我需要这个大量的数据作为输入 对于基于C的arduino 这是上面示例中所需格式的大量数据 const byte bitmap 8 8 0xFF 0x81 0x81 0x81 0x81 0x81 0x81 0xFF 0x81
  • 在 Ada 中定义通用标量类型包

    我想通过制作一个用于操作多项式的 Ada 包来测试编写 Ada 包的水 可以为多种代数结构定义多项式 因此为了反映这一点 我想使该包通用 以便它可以与浮点数 整数或其他数字子类型一起使用 我现在想说 我对 Ada 的类型系统如何工作或者它的
  • 确定 .NET 类型的序列化大小和非托管内存效率

    我的问题是是否可以确定引用类型的序列化大小 以字节为单位 情况如下 我使用 BinaryFormatter 类来序列化基本 NET 类型 例如 Serializable public class Foo public string Foo1
  • 在 C/C++ 中使用单个初始化来初始化具有相同值的多个指针

    我想在 C C 中使用单个赋值运算符声明两个或多个具有相同值的指针 以下代码是一个示例 List a NULL List b NULL List c NULL 一行中是否有等效项 编辑 为了澄清 我正在寻找两种语言的答案 我使用 斜杠 来区
  • 删除队列对象数组

    我正在研究一个包含数组的对象queues数组长度在调用构造函数之前才确定 基本上看起来像下面这样 include
  • 在C中更改函数内的数组

    我正在学习 C 并且很困惑为什么在 main 中创建的数组不会在函数内部更改 我假设传递的数组是一个指针 并且更改指针应该更改数组 对吧 有人可以解释这种情况下发生了什么吗 谢谢你的帮助 int main int i length 10 i
  • 调用不通过空指针访问成员的非静态方法是否合法/定义良好的 C++?

    我最近遇到了以下代码 class Foo public void bar other stuff void Foo bar if this do some stuff without accessing any data members r
  • 指向成员函数的指针的大小疯狂变化

    有一个非常微妙的问题 得到一个用 MS VS 2013 c 编译器编译的类 对于 32 位平台 大小为 4 个字节 函数指针的大小为 4 个字节 但是 当这个类使用相同的编译器编译但包含到不同的项目中以生成库时 也针对 32 位平台 则该类
  • 从 []byte 到 char*

    我想包装一个 C 函数 它需要一个char 指向非空字节缓冲区 的第一个元素 我正在尝试使用 CGo 将其包装在 Go 函数中 以便我可以将其传递给 byte 但我不知道如何进行转换 C 函数签名的简化版本是 void foo char c
  • static_cast 和对指针的引用

    谁能告诉我为什么这不能编译 struct A struct B public A int main B b A a b B b1 static cast
  • 设计抽象类时是否应该考虑序列化问题?

    一般来说这个问题来自Eclipse建议在抽象类上添加串行版本UID 由于该类是抽象类 因此该类的实例永远不会存在 因此它们永远不会被序列化 只有派生类才会被序列化 所以我的问题是放置一个安全 SuppressWarnings serial
  • c中的数组名到底是什么?

    我很难理解 C 中数组名称的类型和使用 这可能看起来很长 但请耐心等待 我理解以下声明声明a属于类型int i e 整数数组 int a 30 While a还指向数组的第一个元素以及诸如此类的东西 a 2 是有效的 因此 使得a看起来像一
  • 指针数组和数组指针的区别?

    char string1 3 4 koo kid kav This is a 2D array char string 3 koo kid kav This is an array of 3 pointers pointing to 1D
  • 获取数组变量的地址是什么意思?

    今天我读到了一段让我很困惑的 C 代码片段 include
  • C 中带有指针的结构的内存开销[重复]

    这个问题在这里已经有答案了 我意识到当我的结构包含指针时 它们会产生内存开销 这里有一个例子 typedef struct int num1 int num2 myStruct1 typedef struct int p int num2
  • Cython:如何在结构中公开 void* 和函数指针?

    我有一个 C 标头 typedef struct
  • 为什么我无法访问打字稿类的构造函数中的抽象属性

    abstract class Route abstract readonly name string protected abstract pattern string public constructor Do something wit
  • 如何在Delphi中将对象方法作为参数传递,然后调用它?

    我担心这可能是一个有点愚蠢的问题 但这让我很难过 我正在寻找将对象的方法传递到过程中的最简单的方法 以便过程可以调用对象的方法 例如 超时后 或者可能在不同的线程中 所以基本上我想 捕获对对象方法的引用 将该引用传递给过程 使用该引用 从过
  • CLI/C++:void* 到 System::Object

    这是一个类似的问题这个帖子 https stackoverflow com questions 1154929 void to object in c cli 我一直无法用它来解决我的问题 我在这里包含了一些代码 希望能帮助某人了解其他帖子
  • Python 2.6、3个抽象基类的误解

    当我使用 ABCMeta 和 Abstractmethod 时 我没有看到我所期望的结果 这在 python3 中工作得很好 from abc import ABCMeta abstractmethod class Super metacl

随机推荐

  • 将网页内容分享到 Instagram 故事

    我正在开发一个网络应用程序 其中一些内容以文本形式生成 并且很快也将包括图像 我想添加一个分享按钮 允许用户将此内容添加到他们的 Instagram 故事中 所以这个流程将是 用户在网站上执行某些操作 网站根据用户输入生成一些内容 用户点击
  • 如何禁用 vue 组件中的链接?

    我的html是这样的 div a class btn btn danger href add a div 我的 JavaScript 是这样的 var vue new Vue el app methods add event event t
  • QTP - 浏览器/页面标题更改时进行测试

    我试图进行简单的测试 但失败了 因为我不知道如何处理测试期间更改的浏览器标题 简单的例子 谷歌 gt 查找 blabol 完成后 QTP 中的浏览器标题将更名为 Google 结果 当搜索文本是一个在迭代之间变化的变量时 这显然是个问题 因
  • Spring Boot 找不到处理程序方法

    我有一个基本的 Spring Boot 应用程序 使用 Spring Initializr 嵌入式 Tomcat Thymeleaf 模板引擎 并打包为可执行 JAR 文件 这是主要课程 SpringBootApplication publ
  • 我如何获取服务器端的 HTML5 本地存储值

    我是一名 Net开发人员 我知道HTM5本地存储是客户端存储技术 我想获取服务器端本地存储的数据 为了从服务器端获取 cookie 值 我们有Request Cookie在 ASP NET 中 有没有类似的解决方案可以直接在服务器端获取本地
  • Angular MatPaginator 未初始化

    我有 2 个组件 两者都有 mat table 和分页器 分页适用于一个组件 但不适用于另一组件 尽管代码相似 下面是我的html div class mat elevation z8 div
  • 确定平均课程成绩的程序[关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 该程序应该将包含学生测验成绩的文本文件写入另一个包含学生姓名的文件中 并为学生分配成绩 include
  • Google 帐户身份验证器在运行时请求许可

    我使用服务中的 AccountManager getAuthToken 来访问 Googledocs 和 Spreadsheet API 由于我是从后台执行此操作并且不想中断 user 因此我允许 accountManager 在需要用户交
  • Firebase minInstances 被忽略

    我们的目标是为 Firebase 云功能设置最小实例数 以便能够处理意外的流量突发 我们已经关注了这些说明 https firebase google com docs functions manage functions reduce t
  • 如何在特定条件下删除重复项

    我有一个 mysql 表 我想在特定条件下删除重复项 如果名称 cl 1 cl 2 cl 3 cl 4 cl 5 cl 6 完全相同 我想删除 否则如果其中一个不同且其他列相同 则无需删除 例如我想删除第 1 行和第 4 行而不是第 7 行
  • SQL 使用内连接将不存在的行的聚合值设为 0

    我正在使用 SQL Server 查询这三个表 它们看起来像 有一些额外的列 但不那么相关 客户 gt ID 姓名 地址 gt ID 街道 StreetNo CustomerId 销售 gt 地址 ID 周 总计 我想获得每周和客户的总销售
  • 将tinyint映射为布尔休眠

    我在 MySQL 表 TINYINT 1 中有一个 BOOLEAN 类型 并且我试图在实体中映射布尔字段 但这会生成异常 org hibernate HibernateException Wrong column type in maegu
  • SQL Server 存储过程转换为 SSIS 包

    问题 目前我们有大量的存储过程 很长 长达 10 000 行 这些存储过程是由不同的开发人员在过去 10 年中根据不同的需求编写的 现在管理那些复杂 长的存储过程 没有适当的文档 变得很困难 我们计划将这些存储过程移至 SSIS ETL 包
  • PostgreSQL:当将整数转换为非整数类型以强制 PostgreSQL 中的浮点除法时,我应该使用哪种数字类型?

    我知道StackOverflow上有很多整数除法问题 但我没有看到这个 与许多编程语言类似 如果两个操作数都是整数 PostgreSQL 就会执行整数除法 如果一个人有 SELECT s id AS student id COUNT DIS
  • 我的 ASP.NET MVC SelectList 有什么问题?

    我正在尝试使用 SelectList 我的视图之一 但它只是未正确填充 它获得了正确数量的条目 4 但它们都读取了System Web Mvc SelectListItem 我启动了代码调试器 发现发生了一些奇怪的事情 我一定做错了什么 但
  • 如何获得 R 时间序列中下一行和上一行之间的差异?

    我有一个相当大的时间序列 包含 4 个变量的大约 14k 个观察值 date x y z 我怎样才能 与功能相反diff df vector lag 1 它计算当前值之间的差值 t 和上一个 t 1 计算每个值与下一个值 t 1 和之前的值
  • 从 DllMain() 锁定时,Visual Studio 2012 中的 C++11 std::mutex 死锁

    我看到了僵局std mutex当互斥体被锁定时DllMain 下面是一个最小的 DLL 测试用例 它向我展示了这个问题 我的实际代码执行互斥锁定 因为它使用的成员函数也可以在正常函数期间在初始化之外使用 我认为问题是调度程序之间的死锁 如调
  • 模仿 Python 产量的惯用 Clojure 方式

    我正在迭代一个列表 边走边建立状态 偶尔当我遇到某个哨兵时 我会返回一个结果 如果我用 Python 来做这件事 我会懒惰地yield结果 跟踪函数本地范围内的状态 this is simplified for illustration d
  • 计算列表差异[重复]

    这个问题在这里已经有答案了 在Python中 计算两个列表之间差异的最佳方法是什么 example A 1 2 3 4 B 2 5 A B 1 3 4 B A 5 If 顺序并不重要 您可以简单地计算集合差 gt gt gt set 1 2
  • 在 Ada 中实现具有访问类型的抽象函数

    我有一个名为 Statements 的包 其中包含一个名为 Statement 的抽象类型和一个名为execute 的抽象函数 在另一个包中 我有一个CompoundStatement 类型 它是一个Statement 类型 它实现了exe