Формальные языки, грамматики и основы построения трансляторов. Кревский И.Г - 93 стр.

UptoLike

93
Для записи любого выражения не нужны скобки. Так как оператор
непосредственно следует за операндами, участвующими в операции,
неопределенность в указании операндов отсутствует. Например, выражение
(A+B)+C имеет постфиксную форму AB+C+, а выражение A+(B+C)
представляется в форме ABC++.
К моменту считывания очередного оператора соответствующие
операнды уже были
прочитаны. Поэтому оператор может быть выполнен без
считывания каких-либо дополнительных данных.
Сказанное выше относится к бинарным операциям, однако это
нетрудно распространить на унарные операции. Так, унарный оператор
отрицания (эту операцию будем обозначать знаком ~) просто ставят
непосредственно за аргументом. Например, инфиксная запись ~A
представляется в форме A~, а выражение ~(A+B
) преобразуется в AB+~.
(Заметим, что знак "-" может стоять в инфиксной записи, указывая как
бинарную, так и унарную операцию, и его правильный смысл становится
очевидным из контекста. В постфиксной записи это сделать труднее.
Благодаря описанным выше свойствам выражение в постфиксной
форме может быть вычислено с помощью простого алгоритма:
while(lex != NULL) // пока в
выражении еще есть лексемы
{
lex = getNextLex(); // считать следующую лексему
if(isOperand(lex)) // лексема есть операнд
push(lex); // записать лексему в стек
if(isOperator(lex)) // лексема есть оператор
push(performOperation(lex, pop(), pop()));
/* выполнить указанную лексемой операцию над
последними элементами, записанными в стек, и заменить
эти элементы результатом операции;
*/
}
                                                                        93
     Для записи любого выражения не нужны скобки. Так как оператор
непосредственно следует за операндами, участвующими в операции,
неопределенность в указании операндов отсутствует. Например, выражение
(A+B)+C имеет постфиксную форму AB+C+, а выражение A+(B+C)
представляется в форме ABC++.
     К моменту считывания очередного оператора соответствующие
операнды уже были прочитаны. Поэтому оператор может быть выполнен без
считывания каких-либо дополнительных данных.
     Сказанное выше относится к бинарным операциям, однако это
нетрудно распространить на унарные операции. Так, унарный оператор
отрицания (эту операцию будем обозначать знаком ~) просто ставят
непосредственно   за   аргументом.   Например,   инфиксная    запись    ~A
представляется в форме A~, а выражение ~(A+B) преобразуется в AB+~.
(Заметим, что знак "-" может стоять в инфиксной записи, указывая как
бинарную, так и унарную операцию, и его правильный смысл становится
очевидным из контекста. В постфиксной записи это сделать труднее.
     Благодаря описанным выше свойствам выражение в постфиксной
форме может быть вычислено с помощью простого алгоритма:
while(lex != NULL) // пока в выражении еще есть лексемы
{
    lex = getNextLex(); // считать следующую лексему
    if(isOperand(lex)) // лексема есть операнд
      push(lex); // записать лексему в стек
    if(isOperator(lex)) // лексема есть оператор
      push(performOperation(lex, pop(), pop()));
      /*    выполнить      указанную      лексемой     операцию        над
последними элементами, записанными в стек, и заменить
эти элементы результатом операции;
      */
}