2013-11-27 3 views
8

Есть ли лучший способ обработки унарного «-» при преобразовании выражения инфикса в постфиксное?обработка унарного минуса для алгоритма маневрового двора

Очевидным будет префикс каждого унарного «-» с помощью 0. Кто-нибудь знает о лучшей реализации? Благодаря!

+0

Существует несколько решений этой проблемы, афаик - все они хаки в какой-то степени. – harold

+0

Через два года после вашего поста у меня был тот же вопрос. Это вопрос, который всегда имеет значение. Вот замечание: добавление нуля (которое я также рассмотрел) тоже не всегда будет работать: Пример: - 3 будет преобразован в 0-33 = -6. Большинство парсеров применяют минус как раз минус один продукт , который будет: - (-3) = 6. Приветствия, – MrVelez

+0

@MrVelez: Вы правы, что префикс нуля не работает, но по другой причине. Предварительная обработка «-3» с помощью префикса нулей должна давать «0-0-3» (не «0-3-3», откуда будет второй 3?). Ie ', - 3' -> '0 -, - 3' -> '0-0-, 3' -> '0-0-3, что приводит к постинфигу' 0 0 - 3 - ». Это оценивается как -3, что, вероятно, не то, что мы хотим от -3. \ Если бы мы могли получить «0-0-3», чтобы перевести на постфикс «0 0 3 - -», тогда он будет оценивать желаемое значение. –

ответ

6

Как я это делал много лет назад, был изобретен новый оператор для моего постфиксного выражения. Поэтому, когда я столкнулся с унарным минусом в инфиксе, я бы преобразовал его в #. Поэтому мой постфикс для a + -b стал ab#+.

И, конечно, мой оценщик должен был знать, что # только выскочил один операнд.

Вид зависит от того, как вы используете постфиксное выражение после его создания. Если вы хотите отобразить его, ваш специальный оператор #, вероятно, смутит людей. Но если вы просто используете его внутренне (каким я был), тогда он отлично работает.

+1

Я тоже это делаю. Единственный способ, которым я могу определить, что «столкнулся с унарным минусом в инфикс», - это поддерживать булевский контекст, который определяет, будет ли следующий оператор или операнд. Я хотел бы знать, что другие сделали, чтобы решить, когда дефис унарный или двоичный. –

+0

@ A.I.Breveleri: Если вы используете парсер для рекурсивного спуска для инфикса, вы можете распознать унарный оператор без явного сохранения состояния. См., Например, http://www.engr.mun.ca/~theo/Misc/exp_parsing.htm. –

 Смежные вопросы

  • Нет связанных вопросов^_^