Macro Processing
In this post, i am going to
explain how the macro's are compiled and executed in SAS.
When a piece of code is
selected and executed, that piece of code is moved to "Input Stack".
Once the piece of code is in Input Stack, SAS transforms the code into
Individual tokens. This process of converting the code into tokens is called "Tokenization"
and it is done by "Word Scanner". Here, the Word Scanner starts from
the first character of Input Stack and assembles the them into different types
of tokens.
There are 4 types of tokens:
1. Literal :- A string of
characters enclosed in quotation marks.
2. Number :- Digits, Date
Values, Time Values, Hexadecimal Numbers.
3. Name :- A string of
characters beginning with an underscore or a letter.
4. Special :- Any character
or group of character which has special meaning to SAS. For ex., * / + - ** ; $ () , % = etc.
Below is the code used for
explanation.
The first SAS statement has eight tokens. When
the Word Scanner finds a blank or the beginning of the next token, it removes
the token and transfers to the bottom of the queue. In this example, when the
word scanner pulls the first token, it recognizes the token as the beginning of
a new data step and triggers the Data Step Compiler. The Data Step Compiler now
start requesting for the tokens, and Word Scanner pulls tokens from the top and
provides it to the Compiler.
The compiler continues to request the tokens until word scanner recognizes
the end of Data Step.
How SAS processes statements with macro
activity??
SAS creates symbol table at the beginning of the session to hold the values
of automatic and global macro variables. SAS creates the automatic macro
variables at the beginning of the SAS session. Here, for the sake of example,
we have shown only SYSDAY variable.
Whenever the word scanner encounters a macro trigger, it sends the
information to macro processor. A macro trigger is either & or % followed
by non blank character. The word scanner begins to process the program by
examining the first character of input stack. In this case, the word scanner
finds a % sign followed by a non blank character and triggers the macro processor.
When a macro processor recognizes the macro language
element, it begins to work with the word scanner. In this case, the macro
processor removes the % LET statement and writes an entry in the symbol table
as shown below.
From the time word scanner triggers the macro processor
until the macro processor action is complete, the macro processor controls the
activity. While macro processor is active, no action occurs in word scanner or
Data Step Compiler.
When Macro processor is finished, the word scanner reads the
next token (DATA) and sends it to Data Step Compiler, which begins to pull the
tokens from the top of the queue.
As it processes each token, the word scanner finds an &
followed by non blank character in a token and it triggers the macro processor
to examine the next token.
The macro processor examines the next token and recognizes a
macro variable that exists in the symbol table. The macro processor removes the
macro variable name in the input stack and replaces it with the value of the macro
variable.
Once the macro processor completes its action, Data Step
Compilers continues to request for the tokens until all the tokens are read. If
the end of the word scanner is a data step boundary, the compiler executes the
step.
No comments:
Post a Comment