juerchen has asked for the wisdom of the Perl Monks concerning the following question:

I'd like to parse a pseudo code. Its simple text and its syntax is very simple and structured like this: keyword keyword .. keyword but 'keyword' can be a structure like: expression{keyword keyword .. keyword} My thougth was to store information in a list, where elements can be ref's to a list. My problem is to recon the the matching closing brace of this statement. Is there a regular expression what can teare the string into 'keyword' s or do I have to crawl the string char by char?

Replies are listed 'Best First'.
(jeffa) Re: recursive re
by jeffa (Bishop) on Apr 03, 2001 at 19:43 UTC
    Sounds like you need Parse::RecDescent

    Jeff

    R-R-R--R-R-R--R-R-R--R-R-R--R-R-R--
    L-L--L-L--L-L--L-L--L-L--L-L--L-L--
    
Re: recursive re
by juerchen (Initiate) on Apr 04, 2001 at 04:31 UTC
    ThanX folks,
    but I have found a rather time-eating but simple solution: I match the string inside out;
    I changed the syntax of each string to: .. text {expression&125; text ..
    where expression can be an simple statement (in pseudo code!) like {variable?true_text|false_text} or a loop and so on. The tricky thing is, that these text's can contain expressions itself.
    Matching the sting for simple 'expressions' and substitude them and then mathching the extended ones by adding them inbetween the simple ones is, imho the simplest algo.
    Maybe I have to remove formerly added text due to a 'if' statement, but that's OK.
    $this->{_template}=~s/{(\w+)}/ref($this->{$1})?$this->{$1}->show():$th +is->{$1}/eg; $this->{_template}=~s/{(\w+)\?([^{}]*)\|([^{}]*)}/$this->{$1}?$2:$3/eg +;