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

hackathon24-white-horiz.png

The 2025 SAS Hackathon has begun!

It's finally time to hack! Remember to visit the SAS Hacker's Hub regularly for news and updates.

Latest Updates

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
  • 956 views
  • 0 likes
  • 3 in conversation