( Moritz: Thanks. Thursday, I grabbed a copy of the book and moved to the latest rakudo release. I didn't find the .perl method yet; so I'll just salivate for a while more. I will look again at the book--that was helpful. )
This is going slow as I have little time (and lots of ignorance) but I will keep scratching away.
#!/home/rir/rakudo/parrot_install/bin/perl6
{
grammar Calc {
token TOP { <expression> }
rule expression { <lhs> <op> <rhs> }
token lhs { <numeric> }
token rhs { <numeric> }
token numeric { \d+[\.\d*]? }
token op { '-' | '+' | '*' | '/' | 'x' }
}
class Calc::Actions {
method TOP($/) { make $<expression>.ast }
method expression($/) { make eval "$/<lhs> $/<op>.ast() $/<rhs
+>" }
method lhs($/) { make $/ }
method rhs($/) { make $/ }
method numeric($/) { make $/ }
method op($/) { if ( $/ eq 'x') { make '*'; } else {make $/; }
+ }
}
my $m = Calc.parse( "8.8 x 5.0 - 2", :actions( Calc::Actions));
die "dying no match" unless $m;
say "$m<expression> = $m.ast()";
}
Ok, I have retrenched. I grabbed Rakudo's/Pug's spectest
and found some grammars that compile out of the box.
The above is built up from t/spec/S05-grammarr/action-stubs.t .
(Running spectest was less onerous than I expected.)
The above is meant to model a cheap calculator.
Questions:
-
Is the string eval reasonable here?
-
Can the expression rule be handled without the separate
naming of the lhs and rhs? Is there a way to
access each numeric in something like:
rule expression { <numeric> <op> <numeric> }
-
The above can easily be extended by changing the rhs token
line to
token rhs { <numeric> | <expression> }
But this destroys the
calculator's left associativity and equal precedence. I suppose
this could be addressed by changing the rule expression
line to:
rule expression { <lhs> ( <op> <rhs> )+ }
but I'm getting lost here.
Be well, rir
-
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.
|