前のページ|次のページ

マクロプロセッサによるコンパイル済みマクロの実行方法

マクロの実行は、マクロプロセッサによってSASMACRカタログを開き、該当するマクロエントリを読み込むことから開始されます。マクロプロセッサは、マクロエントリ内のコンパイル済み命令を実行する際に、一連の単純な反復アクションを実行します。マクロプロセッサは、マクロの実行中に次を実行します。
  • コンパイル済みマクロプログラム命令を実行します。
  • コンパイル対象外の定数テキストを入力スタックに配置します。
  • 生成されたテキストをワードスキャナが処理するのを待機します。
  • コンパイル済みマクロプログラム命令の実行を再開します。
前のセクションの例を引き続き実行するために、次の図に、マクロプロセッサによってAPPマクロ定義がコンパイルされた後に入力スタックに残された行を示します。
入力スタック内のマクロ呼び出し
入力スタック内のマクロ呼び出し
ワードスキャナは、入力スタックを調べ、%の後に空白以外の文字が続いているのを最初のトークンで検出します。これによってマクロプロセッサが起動され、そのトークンを調べます。
ワードキューに入力されるマクロ呼び出し
ワードキューに入力されるマクロ呼び出し
マクロプロセッサは、マクロ呼び出しを認識し、次のようにしてAPPマクロの実行を開始します。
  1. マクロプロセッサは、このマクロ用のローカルシンボルテーブルを作成します。マクロプロセッサは、このマクロのコンパイル済み定義を調べます。マクロ定義にパラメータ、変数宣言、または計算済みのGOTOステートメントが存在する場合、マクロプロセッサは、パラメータや変数のエントリを新規作成のローカルシンボルテーブルに追加します。
  2. マクロプロセッサは、このマクロのパラメータについて、コンパイル済みマクロ定義をさらに調べます。マクロ定義にパラメータが定義されていない場合、マクロプロセッサはマクロのコンパイル済み命令の実行を開始します。マクロ定義にパラメータが含まれている場合、マクロプロセッサは入力スタックからトークンを削除して、位置パラメータの値とデフォルト以外のキーワードパラメータの値を取得します。入力スタックで検出されたパラメータの値は、ローカルシンボルテーブル内の該当するエントリに配置されます。
    注: マクロプロセッサは、コンパイル済み命令を実行する前に、ユーザーによって入力されたマクロ呼び出しに関係するすべてのトークンが削除されたことを確認するため、それに必要なトークンのみを入力スタックから削除します。
  3. マクロプロセッサは、コンパイル済み%IF命令を検出し、次の項目が条件を含むテキストであることを認識します。
  4. マクロプロセッサは、テキスト&sysday=Fridayを、入力スタックのプログラムのその他のテキストの前に配置します。(次の図を参照。)マクロプロセッサは、生成されたテキストをワードスキャナがトークン化するのを待機します。
入力スタックの%IF条件のテキスト
入力スタックの%IF条件のテキスト
  1. ワードスキャナは、生成されたテキストのトークン化を開始し、アンパサンドの後に空白以外の文字が続くのを最初のトークンで認識して、マクロプロセッサを起動します。
  2. マクロプロセッサは、トークンを調べて、マクロ変数参照である可能性のある&SYSDAYを検出します。マクロプロセッサは、SYSDAYと一致するエントリを見つけるため、まずAPPのローカルシンボルテーブルを検索し、次にグローバルシンボルテーブルを検索します。マクロプロセッサは、グローバルシンボルテーブル内で一致するエントリを検出すると、入力スタック内のマクロ変数をそのエントリの値Fridayで置き換えます。(次の図を参照。)
  3. マクロプロセッサは停止し、生成されたテキストをワードスキャナがトークン化するのを待機します。
マクロ変数参照が置換された後の入力スタック
マクロ変数参照が置換された後の入力スタック
  1. 次に、ワードスキャナは、入力スタックからFriday=Fridayを読み込みます。
  2. マクロプロセッサは、式Friday=Fridayを評価し、評価結果がtrueであるため、%THEN命令と%DO命令に進みます。
マクロプロセッサでの条件の受信
マクロプロセッサでの条件の受信
  1. マクロプロセッサは、コンパイル済み%DO命令を実行し、次の項目がテキストであることを認識します。
  2. マクロプロセッサは、このテキストを入力スタックの先頭に配置し、ワードスキャナがトークン化を開始するのを待機します。
  3. ワードスキャナは、生成されたテキストを入力スタックから読み込み、それをトークン化します。
  4. ワードスキャナは、DATAステップの開始を認識し、コンパイラを起動してトークンの受け取りを開始させます。ワードスキャナは、トークンをスタックの先頭からコンパイラに転送します。
入力スタックの先頭に生成されたテキスト
入力スタックの先頭に生成されたテキスト
  1. ワードスキャナは、&の後ろに空白以外の文字(マクロ変数参照&GOAL)が続いているのを検出すると、マクロプロセッサを起動します。
  2. マクロプロセッサは、APPのローカルシンボルテーブルを検索し、マクロ変数参照&GOALを10000に置換します。マクロプロセッサは、その値を、入力スタックの先頭、つまりプログラムのその他のテキストの前に配置します。
ワードスキャナによる生成されたテキストの読み込み
ワードスキャナによる生成されたテキストの読み込み
  1. ワードスキャナは、トークン化を再開します。生成されたテキストのトークン化が完了すると、マクロプロセッサが起動されます。
  2. マクロプロセッサは、コンパイル済みマクロ命令の処理を再開します。マクロプロセッサは、%END命令で%DOグループの終了を認識し、%MENDに進みます。
  3. マクロプロセッサは、%MEND命令を実行し、APPのローカルシンボルテーブルを削除します。これにより、APPマクロの実行が停止します。
  4. マクロプロセッサは、トークン化を再開するためにワードスキャナを起動します。
  5. ワードスキャナは、入力スタックの最初のトークン(PROC)を読み込んでステップの境界の開始を認識し、DATAステップコンパイラを起動します。
  6. コンパイル済みDATAステップが実行され、DATAステップコンパイラがクリアされます。
  7. ワードスキャナは、PRINTプロシジャ(独立して実行され、図には示されていません)に信号を送ります。PRINTプロシジャは、残りのトークンを取り出します。
残りのステートメントのコンパイルと実行
残りのステートメントのコンパイルと実行
前のページ|次のページ|ページの先頭へ