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

%defaultaction { "$_[1] $_[3] $_[2]" }
# example of incremental lexer
%lexer {
    if ($self->YYEndOfInput) {
      print "Asking for more input: ";
      my $file = $self->YYInputFile;
      $_ = <$file>;
      return ('', undef) unless $_;
    }
    m/\G[ \t]/gc;
    m/\G([0-9]+(?:\.[0-9]+)?)/gc and return('NUM',$1);
    m/\G([A-Za-z][A-Za-z0-9_]*)/gc and return('VAR',$1);
    m/\G(.)/gcs and return($1,$1);
}

%%
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] } 
;

%%