マクロ処理を使用するプログラムでは、マクロプロセッサは、入力スタックに配置されてワードスキャナによってトークン化されるテキストを生成できます。このセクションの例では、マクロプロセッサがどのようにマクロ変数を作成して置換するかを示します。コンパイラとマクロプロセッサがどのように連携するかを説明するために、次の図には、マクロプロセッサおよびマクロ変数シンボルテーブルを示しています。SASは、自動マクロ変数とグローバルマクロ変数の値を保持するために、SASセッションの開始時にシンボルテーブルを作成します。SASは、SASセッションの開始時に自動マクロ変数を作成します。説明の目的で、シンボルテーブルには、1つの自動マクロ変数(SYSDAY)のみを示しています。
ワードスキャナは、マクロのトリガを検出すると、その情報をマクロプロセッサに送信します。マクロのトリガは、アンパサンド(&)またはパーセント記号(%)の後に空白以外の文字を続けて表されます。前述の例と同様に、ワードスキャナは、入力スタックの先頭の文字を調べることで、このプログラムの処理を開始します。この場合、ワードスキャナは、パーセント記号(%)の後に空白以外の文字が続いているのを検出します。ワードスキャナは、これらの文字の組み合わせについてマクロ言語要素の可能性があると認識し、マクロプロセッサを起動して%とLETを調べます。
マクロプロセッサは、マクロ言語要素を認識すると、ワードスキャナとの連携を開始します。この場合、マクロプロセッサは、%LETステートメントを削除して、シンボルテーブルにエントリを書き込みます。これを次の図に示します。
ワードスキャナによってマクロプロセッサが起動されてから、マクロプロセッサのアクションが完了するまで、すべての処理はマクロプロセッサによって制御されます。マクロプロセッサが実行されている間は、ワードスキャナにもDATAステップコンパイラにも処理は発生しません。
マクロプロセッサが終了すると、ワードスキャナは次のトークン(この例では、DATAキーワード)を読み込んで、それをコンパイラに送信します。コンパイラがワードスキャナによって起動され、キューの先頭からトークンを取り出し始めます。これを次の図に示します。
各トークンが処理される際に、SASは、特殊文字とニーモニック演算子をマスクするためにマクロクォーティング関数が提供する保護を削除します。詳細については、
マクロクォーティングを参照してください。
ワードスキャナは、アンパサンドの後に空白以外の文字が続くトークンを検出すると、マクロプロセッサを起動して次のトークンを調べます。これを次の図に示します。
マクロプロセッサは、トークンを調べて、シンボルテーブルに存在するマクロ変数を認識します。マクロプロセッサは、入力スタックからマクロ変数名を削除して、それをシンボルテーブルのテキストで置き換えます。これを次の図に示します。
入力スタックがすべて読み込まれるまで、引き続きコンパイラはトークンを要求し、ワードスキャナはそれらを提供します。これを次の図に示します。
この例のように、入力スタックの末尾がDATAステップの境界である場合、DATAステップがコンパイラによってコンパイルされて実行されます。その後、SASがDATAステップのタスクを解放します。プログラムの実行中に作成されたマクロ変数は、すべてシンボルテーブルに残ります。入力スタックの末尾がDATAステップの境界でない場合、処理されたステートメントはコンパイラ内に残ります。さらにステートメントがサブミットされて入力スタックに送信されると、処理が再開します。