Реализация абстрактной функции с типами доступа в Аде - PullRequest
2 голосов
/ 30 марта 2012

У меня есть пакет под названием Statements с абстрактным типом с именем Statement и абстрактной функцией execute (). В другом пакете у меня есть тип CompoundStatement, который является оператором типа, и он реализует функцию execute ().

У меня есть функция с именем createStatement (). Его цель - оценить токен типа Unbounded_String и определить, какое ключевое слово оно содержит. Затем на основе этого ключевого слова будет создан тип доступа на основе этого ключевого слова.

Пока все хорошо.

Но я не могу понять, как это сделать, это вызвать правильный метод execute. Сейчас у меня есть только одно ключевое слово, потому что оно еще не работает.

Извините, если мое описание звучит запутанно.

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

1 Ответ

4 голосов
/ 31 марта 2012

Третий параметр execute должен быть (дочерний элемент) Statement, но вы дали ему указатель на a (дочерний элемент) Statement.Вы, вероятно, захотите

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

В стиле, кстати, обычно лучше сделать параметр диспетчеризации первым;тогда вы могли бы (в Аде 2005) сказать

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