Вам нужен парсер рекурсивного спуска (потому что это единственный парсер, который можно легко написать вручную).Подробности смотрите в Википедии, это довольно просто.
Итак, чтобы правильно определить приоритет оператора, вы можете сделать что-то вроде этого:
term = number
unary = ('-' | '+')* term
multiplication = unary ('*' | '/' unary)*
addition = multiplication ('+' | '-' multiplication)*
expression = addition
Где 'выражение' - это ваше начальное правило.