Warning: you are using the standard library and/or the %inline keyword. We recommend switching on --infer in order to avoid obscure type error messages. %start main %token RPAREN %token LPAREN %token INT %token EOL %token PLUS %token MINUS %token TIMES %token DIV %left PLUS MINUS %left TIMES DIV %nonassoc UMINUS %type main %% main: | e = expr _2 = EOL { ( e )} expr: | i0 = INT {let e = let i = i0 in ( i ) in ( e )} | _10 = LPAREN e0 = expr _30 = RPAREN {let e = let _3 = _30 in let e = e0 in let _1 = _10 in ( e ) in ( e )} | e10 = expr _20 = PLUS e20 = expr {let e = let e2 = e20 in let _2 = _20 in let e1 = e10 in ( e1 + e2 ) in ( e )} | e10 = expr _20 = MINUS e20 = expr {let e = let e2 = e20 in let _2 = _20 in let e1 = e10 in ( e1 - e2 ) in ( e )} | e10 = expr _20 = TIMES e20 = expr {let e = let e2 = e20 in let _2 = _20 in let e1 = e10 in ( e1 * e2 ) in ( e )} | e10 = expr _20 = DIV e20 = expr {let e = let e2 = e20 in let _2 = _20 in let e1 = e10 in ( e1 / e2 ) in ( e )} | _10 = MINUS e0 = expr %prec UMINUS {let e = let e = e0 in let _1 = _10 in ( - e ) in ( e )} %%