list: stmt [{ ';' stmt }];
prog:     stmts;
stmt: sum;
stmts:    stmt [{ ';' stmt }];
sum: 'let' Name '=' sum | product [{ add | subtract }];
stmt:     assign | print | loop | select;

        
assign:   Name '=' sum;

        
print:    'print' sums;

        
sums:     sum [{ ',' sum }];

        
loop:     While cmp Do stmts 'od';

        
While:    'while';

        
Do:       'do';

        
select:   'if' cmp Then stmts [ Else stmts ] 'fi';

        
Then:     'then';

        
Else:     'else';

        
cmp:      sum rel;

        
rel:      eq | ne | gt | ge | lt | le;

        
eq:       '=' sum;

        
ne:       '<>' sum;

        
gt:       '>' sum;

        
ge:       '>=' sum;

        
lt:       '<' sum;

        
le:       '<=' sum;

        
sum:      product [{ add | subtract }];
add: '+' product;
add:      '+' product;
subtract: '-' product;
subtract: '-' product;
product: signed [{ multiply | divide }];
product:  signed [{ multiply | divide }];
multiply: '*' signed;
multiply: '*' signed;
divide: '/' signed;
divide:   '/' signed;
signed: [ '-' ] term;
signed:   [ '-' ] term;
term: input | number | name | '(' sum ')';
term:     input | number | name | '(' sum ')';
input: 'input' [ Number ];
input:    'input' [ Number ];
number: Number;
number:   Number;
name: Name;
name:     Name;