Aldo Calpini writes:
> I've taken this bison example (an RPN calculator, stripped down version 
> from http://www.gnu.org/software/bison/manual/html_node/Rpcalc-Rules.html):
> 
>  input:    /* empty */
>          | input line
>  ;
> 
>  line:     '\n'
>          | exp '\n'
>  ;
> 
>  exp:      NUM
>          | exp exp '+'
>          | exp exp '-'
>          | exp exp '*'
>          | exp exp '/'
>  ;
>  %%
> 
> and this is my attempt at a "port" to Perl6:
> 
>  grammar RPN {
>      rule input { <line>* }
>      rule line { <exp>? \n }
>      rule exp {
>          [ NUM
>          | <exp> <exp> <'+'>
>          | <exp> <exp> <'-'>
>          | <exp> <exp> <'*'>
>          | <exp> <exp> <'/'>
>          ]
>      }
> 
>      rule NUM { \d+ } # could be more complex, I know :-)
>  }
> 
>  if $data ~~ RPN.input { say "valid RPN data" }
> 
> am I missing something obvious here? will the above code work in Perl6?
> do you have perhaps a better example, or just an idea about what to show?

Looks good.  This doesn't grok whitespace, so it will accept:

    3+4*5

But not

    3 + 4 * 5

So you need to add a C<:w> modifier to your C<exp> rule.

Also, if this is going to be an explanation rather than just a picture,
I suggest you go with Perl's usual versatile power, and store the
operators in a declarative data source.

    grammar RPN {
        my @operator = << + - * / >>;

        rule input { <line>* }
        rule line  { <exp>? \n }
        rule exp :w{ <NUM> | <@operator> }
        
        rule NUM   { \d+ }
    }
    
    if $data ~~ /<RPN.input>/ { say "valid expression" }

Luke

Reply via email to