%token IF THEN ELSE END REPEAT UNTIL READ WRITE
%token ID NUM
%token ASSIGN EQ LT PLUS MINUS TIMES OVER LPARENT RPARENT SEMI
%token ERROR
%%
program: stmt_seq
;
stmt_seq:stmt_seq SEMI stmt
|stmt
;
stmt:if_stmt
|repeat_stmt
|assign_stmt
|read_stmt
|write_stmt
;
if_stmt:IF exp THEN stmt_seq END
|IF exp THEN stmt_seq ELSE stmt_seq END
;
repeat_stmt:REPEAT stmt_seq UNTIL exp
;
assign_stmt:ID ASSIGN exp
;
read_stmt:READ ID
;
write_stmt:WRITE exp
;
exp:simple_exp LT simple_exp
|simple_exp EQ simple_exp
|simple_exp
;
simple_exp:simple_exp PLUS term
|simple_exp MINUS term
|term
;
term:term TIMES factor
|term OVER factor
|factor
;
factor:LPARENT exp RPARENT
|NUM
|ID
;
%%