prog:     stmts;
prog: [{ decl ';' }] stmts;

        
decl: type Name [{ ',' Name }];

        
type: 'int' | 'float' | 'string';
stmts:    stmt [{ ';' stmt }];
stmts: stmt [{ ';' stmt }];
stmt:     assign | print | loop | select;
stmt: assign | print | loop | select;
assign:   Name '=' sum;
assign: Name '=' sum;
print:    'print' sums;
print: 'print' sums;
sums:     sum [{ ',' sum }];
sums: sum [{ ',' sum }];
loop:     'while' cmp 'do' stmts 'od';
loop: 'while' cmp 'do' stmts 'od';
select:   'if' cmp 'then' stmts [ 'else' stmts ] 'fi';
select: 'if' cmp 'then' stmts [ 'else' stmts ] 'fi';
cmp:      sum rel;
cmp: sum rel;
rel:      eq | ne | gt | ge | lt | le;
rel: eq | ne | gt | ge | lt | le;
eq:       '=' sum;
eq: '=' sum;
ne:       '<>' sum;
ne: '<>' sum;
gt:       '>' sum;
gt: '>' sum;
ge:       '>=' sum;
ge: '>=' sum;
lt:       '<' sum;
lt: '<' sum;
le:       '<=' sum;
le: '<=' sum;
sum:      product [{ add | subtract }];
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 | int | float | string | name
input:    'input' [ Number ];
      | 'int' term | 'float' term | 'string' term
number:   Number;
      | '(' sum ')';

        
input: 'input' String String;

        
int: Int;

        
float: Float;

        
string: String;
name:     Name;
name: Name;