shift reduce parsing in compiler design examples