Hello, Monks!
I'm working with Parse::RecDescent and I'm facing a problem. At the first glance it seems like this problem was already covered in the official FAQ: How to commit in the optional subrule.
However, it doesn't seem to me like this trick does its job done. Here's the code to show what's wrong:
#!/usr/bin/perl use Parse::RecDescent; my $grammar = q( myrule : <rulevar: local $failed> myrule : 'stuff' mysubrule(?) <reject:$failed> | <error> mysubrule: 'ID' <commit> '[' ']' | <error?> { $failed++ } ); my $text = "stuff ID something"; my $parser = Parse::RecDescent->new($grammar) or die "hi"; my $tree = $parser->myrule($text); print $tree;
In this case parsing succeeds: mysubrule is committed, error directive is triggered but error message is never shown because mysubrule is optional in myrule.
If I change the $text variable to "stuff something", parsing fails: mysubrule isn't commited, error is not triggered, $failed is increased, and finally reject is triggered.
However from where I'm standing there's no sense in such behavior. What I'm trying to get it the opposite behavior where
I thought to ask the FAQ maintainer but its git repository is about two years old so I assume it is not maintained anymore. Thanks for your help and sorry for my English.
In reply to Parse::Recdescent optional subrule commit by campugnatus
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |