Expression parsing with precedence climbing