The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
%{
=head1 SYNOPSIS

Compile it with:

    eyapp -C dynamicgrammar0.eyp 

and see the C<dynamicgrammar.output> file. 
By default, right associativity is always chosen. Run it with

    $ ./dynamicgrammar0.pm -f input_for_dynamicgrammar.txt 

=head1 SEE ALSO 

    This grammar has a conflict that is solved in file
    C<examples/debuggintut/dynamicgrammar.eyp>

=cut

my $reduce = 1;
%}

%lexer {
    m{\G(\s*)(?:#.*)?(\s*)}gc and $self->tokenline("$1$2" =~ tr{\n}{});
    m{\G(LEFT|RIGHT)\b}gic         and return (uc($1), uc($1));
    m{\G([0-9]+)}gc                and return ('NUM', $1);
    m{\G(.)}gc                     and return ($1,    $1);
}

%%
p:  
      /* empty */     {}
    | p c             {}
;

c:
      $expr { print "$expr\n" }
    | RIGHT { $reduce = 0}
    | LEFT  { $reduce = 1}

;

expr: 
      '(' $expr ')'  { $expr } 
    | %name :MINUS
      expr.left  '-' expr.right   
         { $left - $right }

    | NUM
;

%%