%{ %} /* Tokens and types */ %token INT %token IDENT %token EOF ADD SUB MUL NOT EQUAL LPAREN RPAREN DUMMY %left ADD SUB /* lowest precedence */ %left MUL /* higher precedence */ %nonassoc NOT %nonassoc DUMMY /* highest precedence */ %start start %type expr %type start %% start: | expr EOF { $1 } simple_expr: | IDENT { () } | INT { () } | LPAREN expr RPAREN { () } expr: | simple_expr { () } | NOT expr { () } | SUB expr %prec DUMMY { () } | expr ADD expr { () } | expr SUB expr { () } | expr MUL expr { () } | simple_expr simple_expr { () }