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;