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

UptoLike

97
/* к этому моменту строка оказывается просмотренной
целиком. Необходимо поместить оставшиеся в стеке
операции в постфиксную строку. */
15. while(empty(opstk) == FALSE) {
16. smbtp=pop(opstk);
17. (добавить smbtp к постфиксной строке);
18. } // end while
Для обеспечения возможности работы со скобками после считывания
открывающейся скобки она записывается в стек. Это может быть выполнено
путем установки правила precedence(op, "(") = FALSE для любого
символа операции, отличного
от символа правой (закрывающей) скобки.
Также определим precedence("(", op) = FALSE для того, чтобы
символ операции, появляющийся после левой скобки, записывался в стек.
После считывания закрывающей скобки все операции вплоть до первой
открывающей скобки должны быть прочитаны из стека и помещены в
постфиксную строку. Это может быть сделано путем установки
precedence(op, ")") = TRUE для всех операций
op, отличных от
левой скобки. После считывания этих операций из стека и закрытия
открывающей скобки необходимо выполнить следующую операцию.
Открывающая скобка должна быть удалена из стека и отброшена вместе с
закрывающей скобкой. Обе скобки не помещаются затем ни в постфиксную
строку, ни в стек. Установим функцию precedence("(", ")") равной
FALSE. Это
гарантирует нам то, что при достижении закрывающей скобки
цикл, начинающийся в строке 8, будет пропущен, а открывающая скобка не
будет помещена в постфиксную строку.
Выполнение продолжится со строки 12. Однако, поскольку
закрывающая скобка не должна помещаться в стек, строка 12 заменяется
оператором
if((empty(opstk) == TRUE) || (symb <> ")"))
push(opstk, symb);
                                                                                   97
/*    к   этому     моменту      строка    оказывается          просмотренной
целиком.      Необходимо         поместить        оставшиеся            в     стеке
операции в постфиксную строку. */
15. while(empty(opstk) == FALSE) {
16.       smbtp=pop(opstk);
17.       (добавить smbtp к постфиксной строке);
18. } // end while

      Для обеспечения возможности работы со скобками после считывания
открывающейся скобки она записывается в стек. Это может быть выполнено
путем установки правила precedence(op, "(") = FALSE для любого
символа операции, отличного от символа правой (закрывающей) скобки.
Также определим precedence("(", op) = FALSE для того, чтобы
символ операции, появляющийся после левой скобки, записывался в стек.
      После считывания закрывающей скобки все операции вплоть до первой
открывающей скобки должны быть прочитаны из стека и помещены в
постфиксную    строку.     Это    может    быть     сделано     путем       установки
precedence(op, ")") = TRUE для всех операций op, отличных от
левой скобки. После считывания этих операций из стека и закрытия
открывающей       скобки   необходимо     выполнить    следующую            операцию.
Открывающая скобка должна быть удалена из стека и отброшена вместе с
закрывающей скобкой. Обе скобки не помещаются затем ни в постфиксную
строку, ни в стек. Установим функцию precedence("(", ")") равной
FALSE. Это гарантирует нам то, что при достижении закрывающей скобки
цикл, начинающийся в строке 8, будет пропущен, а открывающая скобка не
будет помещена в постфиксную строку.
      Выполнение      продолжится    со    строки     12.     Однако,       поскольку
закрывающая скобка не должна помещаться в стек, строка 12 заменяется
оператором
if((empty(opstk) == TRUE) || (symb <> ")"))
          push(opstk, symb);