Перехват пропущенного операнда или оператора в стеке при конвертации в постфикс из инфикса - PullRequest
0 голосов
/ 04 февраля 2019

Я пытался выяснить, как можно перехватить отсутствующий операнд или оператор при преобразовании из инфикса в постфикс.

например)

Tall = Y 

выведет

Tall Y =

Я думал о реализации локальной переменной для подсчета количества операторов и операндов и установки

if(Operators + 1 < Operands )
   return errexitMissing Operator);
if(Operators + 1 > Operands )
   return errexit(Missing Operand);

Пока что, похоже, код работал, но тогда я не мог понять, как справиться с круглыми скобками

например)

(Tall = ) Y

Этот текст долженвернуть ошибку, так как после скобки нет операнда, но вместо этого возвращает его, как

Tall Y =

Я сейчас в растерянности и не могу понять, как обращаться с круглыми скобками: /

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019

Один из простых способов решения проблемы с круглыми скобками - отслеживать, был ли последний обработанный токен оператором или операндом.Открытое имя ( может появляться только в начале строки или после оператора.Закрывающая скобка, ), может появляться только после операнда.

Если вы отслеживаете последний токен, то, когда вы сталкиваетесь с близкой скобкой в ​​(Tail = ) Y, вы знаете, что есть ошибка, потому что ) пришло после оператора.

Вы можете распространить это на общий случай и отслеживать, ожидаете ли вы следующий операнд или оператор.Вы знаете, например, что у вас не может быть двух операндов подряд.То есть, если инфиксное выражение равно A B + C, вы знаете, когда встречаете B, что выражение недопустимо.

Аналогично, у вас обычно нет нескольких операторов в строке, хотя унарные операторыЗаметное исключение: A + - B совершенно допустимо.

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

0 голосов
/ 04 февраля 2019

Одним из способов расширения вашего подхода является написание функции, которая подсчитывает количество операторов и операндов внутри заданного подвыражения, где подвыражение заключено в скобки.Самый простой способ сделать это - парсер рекурсивного спуска (элегантно обрабатывает вложение).Тем не менее, я не уверен, что подсчет операторов и операндов на самом деле будет работать в общем случае.Вероятно, вам нужно будет рассмотреть еще много случаев.

То есть сначала необходимо проверить вложенное выражение, заключенное в скобки (сначала рекурсия глубины), а затем оценить его и использовать как частьвключающее подвыражение, чтобы проверить это, и так далее, пока вы не проанализируете все выражение.

...