The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
%whites /([ \t]+)/
%token NUM = /([0-9]+(?:\.[0-9]+)?)/
%token VAR = /([A-Za-z][A-Za-z0-9_]*)/

%right '='
%left   '-' '+'
%left   '*' '/'
%left   NEG

%defaultaction { "$_[1] $_[3] $_[2]" }

# example of incremental lexer
%incremental lexer  'Write an arithmetic expression: '

%%
input:                  {}
        |   input line  {}
;

line:     '\n'       {}
        | exp '\n'   { print "$_[1]\n" } 
        | error '\n'   {}
;

exp:        NUM                { $_[1] }
        |   VAR                { $_[1] }
        |   VAR '=' exp         
        |   exp '+' exp         
        |   exp '-' exp        
        |   exp '*' exp       
        |   exp '/' exp      
        |   '-' exp %prec NEG  { "$_[2] NEG" }
        |   '(' exp ')'        { $_[2] } 
;

%%