#%semantic token '*' '='
%right  '='     
%left   '-' '+' 
%left   '*' '/' 
%left   NEG    

%lexer  {
    m{\G[ \t]*}gc;
    m{\G(\n)+}gc                    and $self->tokenline($1 =~ tr/\n//);
    m{\G([0-9]+(?:\.[0-9]+)?)}gc    and return ('NUM',   $1);
    m{\Gprint}gc                    and return ('PRINT', 'PRINT');
    m{\G([A-Za-z_][A-Za-z0-9_]*)}gc and return ('VAR',   $1);
    m{\G(.)}gc                      and return ($1,      $1);
  }

#%tree 
%tree  bypass

%%
line: 
  sts <%name EXPS + ';'>  
;

sts: 
    %name PRINT 
    PRINT leftvalue
  | exp 
;

exp:
    %name NUM    
      NUM            
  | %name VAR    
      VAR         
  | %name ASSIGN 
      leftvalue '=' exp 
  | %name PLUS   
      exp '+' exp    
  | %name MINUS  
      exp '-' exp 
  | %name TIMES  
      exp '*' exp 
  | %name DIV    
      exp '/' exp 
  | %no bypass NEG 
 #| %name NEG 
    '-' exp                  %prec NEG 
  |   '(' exp ')'  
;

leftvalue : %name VAR VAR
;
%%