operator precedence parsing in compiler design