Это моя ситуация: входные данные представляют собой строку, содержащую обычную математическую операцию, например 5+3*4
. Функции также возможны, то есть min(5,A*2)
. Эта строка уже разбита на токены, и теперь я хочу ее проанализировать с помощью стеков (поэтому нет AST). Сначала я использовал алгоритм Shunting Yard, но здесь возникает моя главная проблема:
Предположим, у вас есть эта (токенизированная) строка: min(1,2,3,+)
, что, очевидно, является неверным синтаксисом. Тем не менее, SYA превращает это в выходной стек 1 2 3 + min(
, и, надеюсь, вы увидите, что проблема возникнет. При синтаксическом анализе слева направо он сначала видит +
, вычисляя 2+3=5
, а затем вычисляя min(1,5)
, что приводит к 1. Таким образом, мой алгоритм говорит, что это выражение вполне нормально, в то время как он должен вызвать синтаксическую ошибку (или что-то подобное).
Каков наилучший способ предотвратить подобные вещи? Добавить специальный разделитель (например, запятую), использовать другой алгоритм или что?