13-07.CLangProjectプロジェクト側

 Bisonの定義ファイルCLangProject.yからはCLangProjectプロジェクト側で定義された、式クラス文クラスのオブジェクトを構築します。
 構築作業を担うのはStackMachineクラスです。マネージャーのような役割を持っていて、起動時にインスタンスが構築されています。
 そのオブジェクトにBisonの定義ファイルからアクセスするには
clg::StackMachine::get();
 です。これでStackMachineクラスのインスタンスのポインタにアクセスできます。
 実際に式や文などのオブジェクトの構築は、このポインタ経由で
clg::StackMachine::get()->createIntLiteralExp(yytext);
 のように記述します。この例ではint型のリテラル式が構築されます。パラメータにyytextを渡していますが、これは50などの整数リテラル文字列です。

クラス階層

 このように式や文は階層化されたクラスとして定義されていますが、その第一階層は以下のようになっています。

 

 

図130701

Expressionクラス

 Expressionクラスは、様々な式のクラスの親クラスです。Expressionクラスを直接構築することはなく、派生クラスを構築します。
 Expressionの派生クラスは以下です。今後、まだまだいろんな式クラスが増える予定です。

 

図130702

 

IntLiteralExpクラス

 int型のリテラル式です。たとえば50というソースファイル上の記述は5という文字0という文字が並んだものです。これを50という整数に変換をかける式int型のリテラル式です。

IdentifierExpクラス

 Identifier識別子です。変数名や関数名など、プログラムには様々な識別子が存在します。IdentifierExpクラスは、それをとして構築したものです。

FunctionCallExpクラス

 関数呼び出しです。まだ、戻り値を返す処理は実装してませんが、return文によって戻り値が返るように実装していきます。

Statementクラス

 Statementクラスの派生クラスは以下です。

 

図130703

 

DumpStmクラス

 デバッグ出力用の文クラスです。実装が進んだら、printf関数呼び出しで出力できるようにします。

ExpressionStmクラス

 式文といわれる文です。式を実行します。プログラムは大部分がこの式文と言われています。

Declarationクラス

 Declarationクラスの派生クラスは以下です。
 Declarationというのは宣言や定義です。実行されるわけではありません。宣言は例えば変数の宣言とか。定義関数定義とか。関数が記述されていても、関数呼び出しが行われなければ、実行されませんが、定義は作成する必要があります。

 

図130704

 

IntFunctionDeclarationクラス

 int型を返す関数の定義です。しかし、まだreturn文を実装してませんので何も返しません。

そのほかのクラス

 そのほかのDeclarationListクラス、StatementListクラス、ParameterListクラスはそれぞれ複数のオブジェクトを1つにまとめるクラスです。
 例えばStatementList複数の文の集合クラスです。最終的に関数内のプログラム本体はStatementListにまとめられます。

 さて、このようにして、オブジェクト化されたプログラムコードですが、実行はmain関数から始まります。解説は次項で行います。