Проблема здесь - Орегон. Его сокращение - ИЛИ, которое также является зарезервированным словом (упс!). Помните, что язык макросов - это просто текст, который затем анализируется как обычно - поэтому, когда он находит & ST и переводит в OR, он видит это как
%do %while (or ^= )
, что приводит его в замешательство, так как он не видит ничего для использования с или.
Здесь вы можете использовать макро-кавычки, чтобы SAS не воспринимал это как логический оператор. %SUPERQ
мне подходит, но некоторые из них должны работать.
Вот пример. Я добавил еще кое-что для сканирования, чтобы справиться с паренами.
%let states=AK,AZ,CA,HI,ID,NV,OR,WA;
%macro DTCNT() / parmbuff;
%let i=1;
%put &=syspbuff.;
%let ST=%scan(&SYSPBUFF,&I,%str(%(%),));
%put &=st.;
%do %while (%superq(ST)^=);
%put &=st;
%let i=%eval(&i.+1);
%let ST=%scan(&SYSPBUFF,&I,%str(%(%),));
%end;
%mend DTCNT;
%DTCNT(&STATES);