これは私の質問hereへのフォローアップです。
今の体制ではこれ以上先に進めないと感じたところまでプログラムを進めていたので、何度も書き直しました。Statement
型はもはや抽象的ではなく、 の各サブタイプはの変数のStatement
独自のインスタンスを作成します。Statement
また、コンパイラがそれを気に入らなかったため、Statements パッケージから抽象execute
関数を削除しました (各サブタイプには独自のexecute
メソッドがあります)。受信ステートメント タイプを変更する必要があるため、execute
関数はプロシージャに変更されました。statementFactory
(旧 createStatement) をStatement
パッケージに移動しました。
ここに私が得ているエラーがあります:
statements-compoundstatements.adb:15:29: expected type "CompoundStatement" defined at statements-compoundstatements.ads:11
statements-compoundstatements.adb:15:29: found type "Statement'Class" defined at statements.ads:6
私は Ada の初心者ですが、execute
プロシージャが(Statement の "サブクラス" である) にあるため、Statementの別の "サブクラス" のメソッドCompoundStatements
を参照することはできないと思います。execute
私が考えることができる唯一の解決策は、execute
プロシージャを呼び出すすべてのプロシージャをexecute
パッケージにダンプするStatement
ことですが、それは望ましくないようです。しかし、 がで作成された型ではなくstmt.all
型として使用されている理由はまだ説明されていません。Statement'Class
statementFactory
新しいコードは次のとおりです。
package Statements is
type Statement is tagged private;
type Statement_Access is access all Statement'Class;
ParserException : Exception;
procedure createStatement(tokens : Vector; S : out Statement);
procedure statementFactory(S: in out Statement; stmt: out Statement_Access);
--.....A bunch of other procedures and functions.....
private
type Statement is tagged
record
tokens : Vector;
executedtokens : Vector;
end record;
end Statements;
procedure createStatement(tokens : Vector; S : out Statement) is
begin
S.tokens := tokens;
end createStatement;
procedure statementFactory(S: in out Statement; stmt: out Statement_Access) is
currenttoken : Unbounded_String;
C : CompoundStatement;
A : AssignmentStatement;
P : PrintStatement;
begin
currenttoken := getCurrentToken(S);
if currenttoken = "begin" then
createStatement(S.tokens, C);
stmt := new CompoundStatement;
stmt.all := Statement'Class(C);
elsif isVariable(To_String(currenttoken)) then
createStatement(S.tokens, A);
stmt := new AssignmentStatement;
stmt.all := Statement'Class(A);
elsif currenttoken = "print" then
createStatement(S.tokens, P);
stmt := new PrintStatement;
stmt.all := Statement'Class(P);
end statementFactory;
package body Statements.CompoundStatements is
procedure execute(skip: in Boolean; C: in out CompoundStatement; reset: out Integer) is
stmt: Statement_Access;
tokensexecuted: Integer;
currenttoken : Unbounded_String;
begin
match(C, "begin");
currenttoken := getCurrentToken(C);
while(currenttoken /= "end") loop
statementFactory(C, stmt);
execute(skip, stmt.all, tokensexecuted); //ERROR OCCURS HERE