The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
%right  '='
%left   '-' '+'
%left   '*' '/'
%left   NEG
%tree

%lexer {
  s/^\s+//;

  s/^([0-9]+(?:\.[0-9]+)?)// and return('NUM',$1);
  s/^([A-Za-z][A-Za-z0-9_]*)// and return('VAR',$1);
  s/^(.)//s and return($1,$1);
}

%%
line: exp  { $_[1] } 
;

exp:      %name NUM   
            NUM 
	| %name VAR  
          VAR 
	| %name ASSIGN        
          VAR '=' exp 
	| %name PLUS 
          exp '+' exp 
	| %name MINUS       
          exp '-' exp 
	| %name TIMES   
          exp '*' exp 
	| %name DIV     
          exp '/' exp 
	| %name UMINUS
          '-' exp %prec NEG 
        |   '(' exp ')'  { $_[2] } /* Let us simplify a bit the tree */
;

%%