Ref: Your note of Mon, 26 Feb 2024 08:22:00 -0500
The difficult of inserting a length in a relocatable operand
using macro logic depends on how sophisticated you want to make
your code. The key point is to start from the last character
of the operand value, that is '&FIELD1'(K'&FIELD1,1).
The general approach is:
1. If rightmost character of first operand is not ")",
append "(2)".
2. Otherwise, assume that it ends with a base register, so scan
back looking for "(" and insert "2," after it.
To allow for bad input, remember to check whether the substring
position is still positive before looking at that position.
That covers all the normal cases, but if you need to cope with
expressions like "A+(B-C*(D+E))" then you need a more complex
algorithm, where the backscan keeps count of the nesting level
and scans back to the parenthesis matching the last one, and you
then need to look before it to see if there is an operator as
the next character, in which case it is not a base register in
parentheses.
That gets more complicated if you need to allow for location
counter references, that is "*", or even worse to the length of
the location counter, "L'*", in which case you need to check for
the previous character before the asterisk being an operator or
apostrophe.
If you want to support expressions containing character terms
with embedded parentheses, such as "A+(C'B('-C)", then you're
probably beyond help!
Jonathan Scott, HLASM
IBM Hursley, UK