2012-03-30 4 views
2

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 

답변

4

, 하지만 당신이 준 것은 입니다. (자식) Statement에 대한 포인터. 당신은 아마 그런데, 그것은 파견 매개 변수를 먼저 확인하는 것이 좋습니다, 스타일의 문제로

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

를 원하는; 당신이 다음 (2005 에이다에서)

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

참조 말할 수도 [* 2.3 접두사 표기법 *을 (http://www.adaic.org/resources/add_content/standards/05rat/html/Rat-2- 3.html). – trashgod

+0

굉장! 그게 효과가 있었어. 고마워요. –

+0

@deuteros - 그 경우,이 답변 옆에있는 체크 표시의 개요를 클릭하여 모든 사람에게 알리고 (부수적으로 Mr. Wright에게) 알리시기 바랍니다. 그것은이 대답을 받아 들일 것입니다. –