Statement라는 추상 유형과 execute()라는 추상 함수가있는 Statements라는 패키지가 있습니다. 다른 패키지에서 나는 유형 Statement 인 CompoundStatement 유형을 가지고 있으며 execute() 함수를 구현합니다.Ada에서 액세스 유형으로 추상 함수 구현
저는 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;
내가이 오류 :
execute
에 세 번째 매개 변수는
Statement
A (의 하위) 될 것으로 예상된다
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
참조 말할 수도 [* 2.3 접두사 표기법 *을 (http://www.adaic.org/resources/add_content/standards/05rat/html/Rat-2- 3.html). – trashgod
굉장! 그게 효과가 있었어. 고마워요. –
@deuteros - 그 경우,이 답변 옆에있는 체크 표시의 개요를 클릭하여 모든 사람에게 알리고 (부수적으로 Mr. Wright에게) 알리시기 바랍니다. 그것은이 대답을 받아 들일 것입니다. –