Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
shpora1_Kalabin.doc
Скачиваний:
2
Добавлен:
01.04.2025
Размер:
755.2 Кб
Скачать
  1. Постфиксная запись.

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

Постфиксная запись отличается тем, что знак операции ставится непосредственно за операндами. Так, например, инфиксной записи (A+B) соответствует постфиксная форма AB+.

Постфиксная польская запись (ПоПЗ) определяется следующим образом.

Если инфиксное выражение Е представляет собой один операнд а, то ПоПЗ выражения Е – это а.

Если инфиксное выражение Е1*Е2 , где * – знак операции, E1, E2 – инфиксные выражения для операндов, то ПоПЗ этого выражения это – Е1'E2'*, где Е1', E2 ' – постфиксные выражения Е1 ,Е2 .

Если (Е) есть инфиксное выражение, то постфиксная запись этого выражения есть постфиксная запись Е.

Аналогично предыдущему примеру построим ПоПЗ выражения (a + b) * (c - d).

Обозначая операнды внешней операции E1 = (a + b) и E2 = (c - d) найдем постфиксные записи операндов, которые имеют вид: E1' = ab+ и E2' = cd-

Подставляя полученные постфиксные записи в выражение E1'E2'* окончательно получаем: ab+cd-*

Постфиксная запись выражений обладает двумя ценными свойствами, благодаря которым ее широко используют в компиляторах: Для записи любого выражения не нужны скобки. Так как оператор непосредственно следует за операндами, участвующими в операции, неопределенность в указании операндов отсутствует. Например, выражение (A+B)+C имеет постфиксную форму AB+C+, а выражение A+(B+C) представляется в форме ABC++.

К моменту считывания очередного оператора соответствующие операнды уже были прочитаны. Поэтому оператор может быть выполнен без считывания каких-либо дополнительных данных.

Сказанное выше относится к бинарным операциям, однако это нетрудно распространить на унарные операции. Так, унарный оператор отрицания (эту операцию будем обозначать знаком ~) просто ставят непосредственно за аргументом. Например, инфиксная запись ~A представляется в форме A~, а выражение ~(A+B) преобразуется в AB+~. (Заметим, что знак "-" может стоять в инфиксной записи, указывая как бинарную, так и унарную операцию, и его правильный смысл становится очевидным из контекста. В постфиксной записи это сделать труднее.

В результате вычислений значение выражения оказывается единственным элементом стека.

Очевидно, что вычисление постфиксной записи выражения не представляет трудности, преобразование же инфиксной записи в постфиксную заметно сложнее. Предположим, что продукция языка имеет вид A→BиC, где A, B и C являются нетерминалами, а "и" – терминал. Будем считать, что знаки операций являются терминалами. Тогда эта продукция означает, что нетерминал A является инфиксной записью, в которой участвуют операнды B и C вместе с оператором "и". Следовательно, постфиксная форма выражения образуется из операндов B, C, за которыми следует оператор "и". Таким образом, для данной продукции постфиксная запись имеет вид

Постфиксная запись для B, Постфиксная запись для C и Если терминальные символы выводятся в выходной файл в таком

порядке, то все фразы языка будут представлены в постфиксной форме.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]