Один из простых способов решения проблемы с круглыми скобками - отслеживать, был ли последний обработанный токен оператором или операндом.Открытое имя (
может появляться только в начале строки или после оператора.Закрывающая скобка, )
, может появляться только после операнда.
Если вы отслеживаете последний токен, то, когда вы сталкиваетесь с близкой скобкой в (Tail = ) Y
, вы знаете, что есть ошибка, потому что )
пришло после оператора.
Вы можете распространить это на общий случай и отслеживать, ожидаете ли вы следующий операнд или оператор.Вы знаете, например, что у вас не может быть двух операндов подряд.То есть, если инфиксное выражение равно A B + C
, вы знаете, когда встречаете B
, что выражение недопустимо.
Аналогично, у вас обычно нет нескольких операторов в строке, хотя унарные операторыЗаметное исключение: A + - B
совершенно допустимо.
В общем, проблемы преобразования из инфикса в постфикс предполагают, что выражение инфикса является допустимым.Если вам нужна возможность отлавливать ошибки, вам нужно добавить некоторую проверку синтаксиса, чтобы обеспечить соблюдение правил выражений инфикса.