Я понял, как реализовать бинарные операторы с приоритетом, как это (псевдокод):Рекурсивного спуск синтаксического анализа: высокая очередность унарные
method plus
times()
while(consume(plus_t)) do
times()
end
end
method times
number()
while(consume(times_t))
number()
end
end
// plus() is the root operation
// omitted: number() consumes a number token
Так что, когда я анализирую 4 + 5 * 6
она:
- плюс
- многократно
- число (4 потребляются)
- plus_t потребляются
- многократно
- число (5 потребляются)
- times_t потребляются
- число (6 потребляются)
- многократно
Однако при попытке добавление меток д (префикс minusing, как -4
, не инфиксная minusing как 4 - 5
):
method minus
consume(minus_t)
plus()
end
Это занимает очень низкий приоритет, поэтому -4 + 5
становится -(4 + 5)
, а не (-4) + 5
и это нежелательно.
Что я могу сделать, чтобы сделать унарный оператор с высоким приоритетом?