When I'm testing a template I usually use variable names so it's easier to 
follow what's happening; feel free to change them to periods.

trace i;parse var parm  kw '(' dsn '(' mem ')' ')'
    95 *-*           parse var parm  kw '(' dsn '(' mem ')' ')'
       >V>             "INDSN(DSNAME(MEMBER))"
       >L>             "("
       >>>             "("
       >>>             "INDSN"
       >L>             "("
       >>>             "("
       >>>             "DSNAME"
       >L>             ")"
       >>>             ")"
       >>>             "MEMBER"
       >L>             ")"
       >>>             ")"
    96 *-*           trace 'Off'                    /* Don't trace rexxtry.
 */
  ................................................ REXXTRY.CMD on OS/2
say dsn mem
DSNAME MEMBER



--
Shmuel (Seymour J.) Metz
http://mason.gmu.edu/~smetz3

________________________________________
From: IBM Mainframe Discussion List [[email protected]] on behalf of 
David Crayford [[email protected]]
Sent: Wednesday, February 26, 2020 7:01 AM
To: [email protected]
Subject: Re: Rexx parse using period as placeholder

I've got a REXX parse puzzle to solve and I would like suggestions on
how to solve it.

Syntax:

     INDSN(DSNAM(MEMBER))

     The code is simple. It uses the parse instruction with a template.

        parse var parm . '(' val ')'


       *-* parm = 'INDSN(DSNAME(MEMBER))'
       >L>   "INDSN(DSNAME(MEMBER))"
       *-* parse var parm . '(' val ')'
       >.>   "INDSN"
       >>>   "DSNAME(MEMBER"

Unfortunately the value is truncated because "parse" has no way to
anchor to the end of the string.

Using a regex this is very simple "\((.*)\)$"

Most modern languages have PEG libraries (parsing expression grammers)
which are much more powerful that regex. They can be called recursively
and used to implement real parsers.

Even a simple scripting like Lua (which runs on z/OS) has a library
which can be used to implement a C99 parser in 500 lines of code
https://secure-web.cisco.com/1-qpVukWY5CQ__uk-jb69c-vU9oQiHr0QYGSPlCeoZgyD2_0Vr7rZvCFOZMHJg7zk3VOksBvTUY8MLW1evN4UV9cNBh-pn9n-5F9_X82JabsK-ab5tZgKrsgKaJaEaxaxX5DQT-npVqFY2v_bsph_x8TPP0FtlXCodigNSekdfPE7jkgJNBmS59AWuMpG8X-Uk87HGTSjWom-rjWZ2cck7YmxwA8YD0v-eN-AL17ABCPz1J03MFZeG5DTXPPIQZDHjFYyC1zarF945-8oyYAd868yq1R6J7tuZO3LwSG-nXLyxFjuFhxAFLZjb5wzxr9ud0_gAOZpFtSdNUpsdux1AoWvZREOg5L4JMcfEVubG-1nO2eSTtdsuvL3IPGSGD4-HEKFuhCLSVZQb4nT1RtVUgxxwK-lTjuUgN8iE103myJE9v-kJevMwsdsZ3jGRYmT/https%3A%2F%2Fgithub.com%2Ftitan-lang%2Fc-parser%2Fblob%2Fmaster%2Fc99.lua.


On 2020-02-26 11:41 AM, Paul Gilmartin wrote:
> On 2020-02-24, at 13:43:52, Ambros, Thomas wrote:
>> A trivial item, but this surprised me.
>>
>> I wanted to parse out the string 'word3' using the period as a place holder. 
>>  The input could have a blank delimited string containing an embedded period 
>> before the one I wanted to parse out.  The Parse Var as coded didn't work.  
>> ...
>>
>> myVar = 'word1 word2 9.12 word3.ext'
>> Parse Var myVar . . . myVal '.' .
>>      ...
>> Say 'myVal=' myVal
>>      ...
> The simple answer to the elliptically stated problem is:
>      MyVal = 'word3'
>
> A more general solution, using regex is:
> 556 $ echo 'word1 word2 9.12 word3.ext' | sed 's/.* \([^.]*\).*/\1/'
> word3
> 557 $
> This finds the last substring in the subject preceded by a space
> and followed by a period.
>
> Full disclosure, for Tony to gloat:
> o It's easier to code than to review.
> o I got it right on the third try.
> o I haven't fuzz tested.
>
> -- gil
>
> ----------------------------------------------------------------------
> For IBM-MAIN subscribe / signoff / archive access instructions,
> send email to [email protected] with the message: INFO IBM-MAIN

----------------------------------------------------------------------
For IBM-MAIN subscribe / signoff / archive access instructions,
send email to [email protected] with the message: INFO IBM-MAIN

----------------------------------------------------------------------
For IBM-MAIN subscribe / signoff / archive access instructions,
send email to [email protected] with the message: INFO IBM-MAIN

Reply via email to