%token NUM %token PLUS MINUS TIMES DIV %token LPAREN RPAREN %token EOL %left PLUS MINUS /* lowest precedence */ %left TIMES DIV /* medium precedence */ %nonassoc UMINUS /* highest precedence */ %start line /* the entry point */ %type line %% line: expr EOL { $1 } ; expr: NUM { $1 } | LPAREN expr RPAREN { $2 } | expr PLUS expr { Printf.sprintf"(add %s %s)" $1 $3 } | expr MINUS expr { Printf.sprintf"(sub %s %s)" $1 $3 } | expr TIMES expr { Printf.sprintf"(mul %s %s)" $1 $3 } | expr DIV expr { Printf.sprintf"(div %s %s)" $1 $3 } | MINUS expr %prec UMINUS { Printf.sprintf"-%s" $2 } ;