Re: Feature wishlist for P::RD 2.0 ore perhaps 1.81

[email protected] (Karl Gaissmaier)
Newsgroups perl.recdescent
Message-ID <[email protected]>
Hi Damian,

Damian Conway schrieb:
> 
> Karl Gaissmaier wrote:
> 
> ...some suggestions for additional features of Parse::RecDescent, specifically
> the ability to specify "required alternatives" within a repeated subrule:
> 
>    > statement: A! | B! | C | D
> 
> and "mutually exclusive alternations":
> 
>    > rule     : A ^ B ^ C
> 
> The problem with these proposed features is that they are not *localized*.
> 
> That is, the presence of an A! doesn't affect the rule that the A! is in,
> it affects the rule that calls the rule that the A! is in. And that is difficult
> to implement in a recursive descent parser.
> 

as I feared already in my first mail about adding an additional state

> > But I think that P::RD is by far no way just a CFG ParserGenerator, it's a beast.
> 
> <grin> I should quote you in the documentation. ;-)

you're welcome

> 
> > I stumbled so many times over these two missing features (mandatory and xor)
> > and my "feeling" tells me, there must be a gentler(general) solution
> > than just doing this in action codes.
> 
> Clearly this has been a problem for you. But I would have solved it like so:
> 
>         $grammar = << 'EOGRAMMAR';
>         contact   : statement(s)
>                                                 { $return = { map %$_ @{$item[-1]} } }
>                     <reject: do{!($return->{email} && $return->{name})) >
>         statement : email | name |  phone | fax
>         email     : 'email' '=' value  {{email=>$item[-1]}}
>         name      : 'name' '=' value   {{name=>$item[-1]}}
>         phone     : 'phone' '=' value  {{phone=>$item[-1]}}
>         fax       : 'fax' '=' value    {{fax=>$item[-1]}}
>          value     : /".*?"/
>         EOGRAMMAR
> 
> Since you needed to collect the data anyway, the actions would have had to be
> there no matter what. So the overhead for the requirements testing is just the single
> <reject> directive.

again it's just a question of maintainance. If I introduce a different
subrule in statement: I have to change action code logic. I think
therefore you introduced for example the %item hash, because we are
always not perfect. My stupid thinking:

Everything already done very well by Damian Conway will not hurt
me any more by my imperfection :-)

> 
> Likewise, if (for example) phone and fax were mutually exclusive, you could
> just extend that to:
> 
>         $grammar = << 'EOGRAMMAR';
>         contact   : statement(s)
>                                                 { $return = { map %$_ @{$item[-1]} } }
>                     <reject: do{!($return->{email} && $return->{name})} >
>                     <reject: do{  $return->{phone} && $return->{fax}  } >
>         statement : email | name |  phone | fax
>         email     : 'email' '=' value  {{email=>$item[-1]}}
>         name      : 'name' '=' value   {{name=>$item[-1]}}
>         phone     : 'phone' '=' value  {{phone=>$item[-1]}}
>         fax       : 'fax' '=' value    {{fax=>$item[-1]}}
>          value     : /".*?"/
>         EOGRAMMAR
> 

sure, the same comments as before.

> > Perhaps Damian can bring some light in the darkness.
> 
> Perhaps. But I doubt it. ;-)
> 
> However, since you've taken the trouble to mention (and obviously think about)
> this problem, I will certainly devote some time to it myself and see if I can
> develop a better solution; one that's consistent with a recursive descent implementation.
> 

thanks in advance, even if P::RD stays at it is already!

Best Regards
	Charly
-- 
Karl Gaissmaier          Computing Center,University of Ulm,Germany
Email:[email protected]          Network Administration
Tel.: ++49 731 50-22499
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.