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

UptoLike

96
программными генераторами) для операций с равным приоритетом является
одной из типичных ошибок.
Рассмотрим теперь макет алгоритма для преобразования строки,
представленной в инфиксной форме и не содержащей скобок, в постфиксную
строку. Поскольку мы считаем, что во входной строке скобки отсутствуют,
единственным признаком порядка выполнения операций является их
приоритет.
1. (Установить в постфиксную
строку " ");
2. (Очистить стек с именем opstk);
3. while (на входе еще имеются символы) {
4. read(symb);
5. if(isOperand(symb) == TRUE) {//символ есть операнд
6. (добавить символ к постфиксной строке);
7. } else { //символ есть операция
8. while(empty(stack) == FALSE) &&
(precedence(stacktop(opstk), symb) == TRUE)) {
9. smbtp = pop(opstk);
/* smbtp имеет приоритет больший, чем symb, поэтому она
может быть добавлена к постфиксной строке. */
10. (добавить smbtp к постфиксной строке);
11. } // end while
/* в этой точке либо opstk пуст, либо symb имеет
приоритет над stacktop(opstk). Нельзя поместить symb в
постфиксную строку до тех пор, пока не считана
следующая операция, которая может иметь более высокий
приоритет. Следовательно, необходимо сохранить symb. */
12. push(opstk, symb);
13. } // end if
14. } // end while
                                                                       96
программными генераторами) для операций с равным приоритетом является
одной из типичных ошибок.
      Рассмотрим теперь макет алгоритма для преобразования строки,
представленной в инфиксной форме и не содержащей скобок, в постфиксную
строку. Поскольку мы считаем, что во входной строке скобки отсутствуют,
единственным признаком порядка выполнения операций является их
приоритет.
1. (Установить в постфиксную строку " ");
2. (Очистить стек с именем opstk);
3. while (на входе еще имеются символы) {
4.        read(symb);
5.        if(isOperand(symb) == TRUE) {//символ есть операнд
6.           (добавить символ к постфиксной строке);
7.        } else {        //символ есть операция
8.           while(empty(stack) == FALSE) &&
             (precedence(stacktop(opstk), symb) == TRUE)) {
9.                      smbtp = pop(opstk);
/* smbtp имеет приоритет больший, чем symb, поэтому она
может быть добавлена к постфиксной строке. */
10.                     (добавить smbtp к постфиксной строке);
11.          } // end while
/*    в    этой   точке       либо   opstk   пуст,    либо   symb   имеет
приоритет над stacktop(opstk). Нельзя поместить symb в
постфиксную          строку     до   тех     пор,    пока    не   считана
следующая операция, которая может иметь более высокий
приоритет. Следовательно, необходимо сохранить symb. */
12. push(opstk, symb);
13.       } // end if
14. } // end while