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