BookmarkSubscribeRSS Feed
PvH
Calcite | Level 5 PvH
Calcite | Level 5

Hello, 

 

I was just recently using a quite large macro which is used for calculating ratios. After running the macro, I got the following syntax error message: 

 

ERROR 22-322: Syntax error, expecting one of the following: !, !!, &, (, *, **, +, ',', -, /, <, <=, <>, =, >, ><, >=, AND, EQ, GE, 
              GT, IN, LE, LT, MAX, MIN, NE, NG, NL, NOTIN, OR, [, ^=, {, |, ||, ~=.  

The code inside the macro where the error occurs is the following: 

 

 

%let p_gen = _p1;
data new;
set old;
...
w725000&p_gen = sum(0, w240000&p_gen, -w239000&p_gen, w239010&p_gen);
...
run; 

Basically what happens is that SAS does not translate the macro variable properly and adds whitespace before the macro variable. 

What SAS should do: w240000_p1

What SAS does:  w240000 p1

And obviously that does not really work. 

 

Please tell me the reason behind this strange bug, since the workaround can be quite tedious. 

Btw I am working in SAS EG 7.1.

Thanks a lot and kind regards 

 

Paul 

2 REPLIES 2
Kurt_Bremser
Super User

This can happen if you used any macro quoting for the variable. With a simple content like

_p1

this should not be necessary.

 

See this piece of reference code:

options symbolgen;

%let p_gen = _p1;

data test;
xxx&p_gen.yyy = 1;
run;

You can see that you do not get blanks, in the log (no ERROR) and in the dataset.

 

So it is essential to know what happens between the %LET and the use of the macro variable in the data step.

jimbarbour
Meteorite | Level 14

It looks more like the underscore is being changed to a blank.  It does not look like SAS is pre-pending a blank.

 

It's not normal behavior for SAS to change underscores to blanks.  Can you post more of your code?  The point at which you have ". . ." may have something going on in it.

 

How are you determining that SAS is converting the underscore to a space?  This isn't normally what SAS does, so I'm wonder if this is really what is happening.  Maybe the error message is somehow misleading. 

 

This in particular looks odd to me:  

 -w239000&p_gen

What is the negative sign doing there?  If w239000&p_gen is a variable name, then I would think you would want something like:

(-1 * w239000&p_gen)

 

Jim

How to Concatenate Values

Learn how use the CAT functions in SAS to join values from multiple variables into a single value.

Find more tutorials on the SAS Users YouTube channel.

SAS Training: Just a Click Away

 Ready to level-up your skills? Choose your own adventure.

Browse our catalog!

Discussion stats
  • 2 replies
  • 1007 views
  • 0 likes
  • 3 in conversation