When the score is settled, each character of the text can only be matched by two rules if one rule is a production of another.
text: struct { int foo ; int bar ; }
------ - --- --- - --- --- - -
IDENT "{" IDENT IDENT ";" IDENT IDENT ";" "}"
--- --- --- ---
type var type var
--------- ---------
decl decl
-------------------------
decl_list
---------------------------------------------
struct
---------------------------------------------
parse
But in reaching that state, a rule can match, then be unmatched by a backtrack. For example, given the grammar
parse : foo1 foo2
| bar1 bar2
foo1 could matched, but PRD will backtrack if it can't follow with a foo2 match. It will then try bar1.
I'm guessing one of your productions has side-effects, so you falsely believed it has matched even though a backtrack unmatched it. I could very well be wrong because I have very little data to go on.
Update: In the following example, you'll see foo1 on the screen even though it wasn't matched.
use strict;
use warnings;
use Parse::RecDescent qw( );
my $grammar = <<'__EOI__';
{
use strict;
use warnings;
}
parse : foo1 foo2 /\Z/ { [ @item[0,1,2] ] }
| bar1 bar2 /\Z/ { [ @item[0,1,2] ] }
foo1 : "X" { print("$item[0]\n"); [ @item[0,1] ] }
foo2 : "Y" { print("$item[0]\n"); [ @item[0,1] ] }
bar1 : "X" { print("$item[0]\n"); [ @item[0,1] ] }
bar2 : "Z" { print("$item[0]\n"); [ @item[0,1] ] }
__EOI__
Parse::RecDescent->Precompile($grammar, 'Grammar')
or die("Bad grammar\n");
use strict;
use warnings;
use Data::Dumper qw( Dumper );
use Grammar qw( );
my $parser = Grammar->new();
my $matches = $parser->parse('XZ')
or die("Bad input\n");
print("\n");
print(Dumper($matches));
foo1
bar1
bar2
$VAR1 = [
'parse',
[
'bar1',
'X'
],
[
'bar2',
'Z'
]
];
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.