Thank you for this great tutorial. This was a very helpful introduction.
I tried to play a bit with your example. In the following code I do not get the Error "Bad Expression" for my second expression although it is not valid.
use strict;
use warnings;
use Parse::RecDescent ();
my $grammar = <<'__END_OF_GRAMMAR__';
{
use strict;
use warnings;
}
{
sub eval_sum {
my $acc = shift(@_);
while (@_) {
my $op = shift(@_);
if ($op eq '+') { $acc += shift(@_); }
elsif ($op eq '-') { $acc -= shift(@_); }
}
return $acc;
}
}
sum : NUM sum_ { eval_sum( ($item[1], @{$item[2]}) ) }
sum_: /[+-]/ NUM sum_ { $return = [$item[1], $item[2], @{$item[3]}]
+}
| { $return = [] }
NUM : /\d+/ { $return = $item[1] }
__END_OF_GRAMMAR__
my $parser = Parse::RecDescent->new($grammar)
or die("Bad grammar\n");
foreach my $expr ('4-5+6-2','4*5')
{
my $sum = $parser->sum($expr) or die "Bad expression";
print "$sum" . "\n";
}
Why do I not get the "Bad expression" error for my second expression?
Thank you
Dirk
-
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.
|