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

%%

program:
      declaration <%name DECLS *> sts <%name STS + ';' >
;
declaration:
      basictype declList ';' 
;
basictype:
      %name INT
      INT
    | %name FLOAT
      FLOAT
    | %name BOOLEAN
      BOOLEAN 
;
declList:
      VAR <%name VARS + ',' >
;
sts:
      %name PRINT
      PRINT leftvalue
    | %name BLOCK
      '{' sts <%name STS + ';' >'}'
    | %name IF
      IF '(' exp ')' sts %prec IF
    | %name IFELSE
      IF '(' exp ')' sts ELSE sts
    | %name WHILE
      WHILE '(' exp ')' sts
    | 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
    | %name LT
      exp '<' exp
    | %name LE
      exp '<=' exp
    | %name GT
      exp '>' exp
    | %name GE
      exp '>=' exp
    | %name EQ
      exp '==' exp
    | %name NE
      exp '!=' exp
    | %no bypass NEG
      '-' exp %prec NEG
    | '(' exp ')' 
;
leftvalue:
      %name VAR
      VAR 
;

%%