sas macro宏编译原理

我们提交的SAS程序都先到input stack的地方,然后SAS就将这些程序转换成单个的token,这些token分为四类:

Literal:主要是注释用的字符串

Number:数字,时间,日期,十六进制数字

Name:变量名

Special:符号,例如& % + - 等

SAS有四类处理这些token的编译器:

Data step compiler:处理数据步(或过程步?)

SCL compiler:处理Sas Component Language

Macro compiler:处理宏

Command compiler:处理命令(具体不清楚,可能类似X命令吧,直接调用Windows Dos命令)


[img]http://dl.iteye.com/upload/attachment/144123/930d6348-1e74-3f47-a5ff-de10357b8ff6.jpg[/img]

图里面还有一个word scanner没介绍到,就是把input stack里的程序,逐行读取每一行的token,然后根据规则把这些token放到相应的编译器compiler里。



介绍完了图里的内容,然后开始看看SAS如何编译没有宏的数据步程序:

Word scanner读取Input Stack里的第一行程序,这里可以读到4个Name(data sales drop lastyr)和4个Special((=);)。Word scanner读到的第一个非空token是Data,SAS就知道这个一个数据步的起点,然后将这些token放到Data step compiler里。Word Scanner继续读取token,直到读到Run,SAS就知道这是这个数据步的终点。然后在data set compiler里对刚才读到的程序进行编译。

这里提一下,进入编译器的程序,SAS都会自动转换为大写,这也是为什么SAS对变量名不进行大小写区分的原因。



接下来介绍SAS宏编译:

首先介绍一下Symbol table,这是放宏变量的一个表,在sashelp.vmacro这张表里。当有新的宏变量时,就会记录在这张表中。

当word scanner扫到%或&开头,且后面为非空字符时,word scanner就将扫到的input stack里的程序放到Macro compiler里。


[img]http://dl.iteye.com/upload/attachment/144125/33ac438d-b182-3427-abf0-e9b2123e36cd.jpg[/img]

如图所示,第一行 %let file=in1;这里,SAS宏编译器就将把file放入symbol table里,其宏变量为file,值为in1。只要宏编译器在处理宏,那么data step compiler将不会进行编译。当宏编译完成后,word scanner继续读取下一行的token。当读取以&开头且后面为非空字符(token)时,宏编译器就检查这个token是否在symbol table中,然后用symbol table里的值代替这个token。最后读到这个数据步的终点,进行编译。
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值