Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Унарный минус в ОПЗ


FastByte ©   (2004-08-17 13:54:00) 

Кто нибудь писал ОПЗ ? Гадкая ситтуация с унарным минусом :(
Например есть логическое выр-е в виде строки:
s='(a0) and (b>0)', заменяем переменные значениями, получаем:
(1 0) and (-3 > 0), далее использую написанную мной ф-цию ОПЗ с этой входной строкой, на выходе получаю ОПЗ: 1 0 3 - 0 > &.
В приципе правильная запись, но вот минус получается вовсе не унарный :( И трактуется в дальнейшем как 1-3=-2. Может есть у кого соображения на этот счет ? Буду признателен.


FastByte   (2004-08-17 14:25:00) [1]

Спасибо :) Щас буду пробовать


ламер   (2004-08-17 14:20:00) [2]

1. если проблема только в том, что выражение в обратной польской записи неправильно вычисляется, то: а) используй для унарного минуса другой символ; либо б) используй конструкции типа "0 3 -" (некрасиво, конечно).

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

я обычно использую рекурсивную схему. простенький пример:

evaluate()
{
  прочитать токен;
  proc_1();
}

proc_1() // бинарные + и -
{
 proc_2();
 пока токен = "-" или "+",
 {
   сохранить данный и прочитать следующий токен;
   proc_2();
   вывести сохранённый токен;
 }
}

proc_2() // * и /
{
 proc_3();
 пока токен = "*" или "/",
 {
   сохранить данный и прочитать следующий токен;
   proc_3();
   вывести сохранённый токен;
 }
}

proc_3() // унарные + и -
{
 если токен = "+" или "-", то
 {
   сохранить данный и прочитать следующий токен;
   proc_4();
   вывести сохранённый токен, если это "-";
   // унарный + можно пропустить
   // здесь можно выводить либо спец. значок для унарного "-",
   // либо до вызова proc_4() вывести "0", а здесь - "-".
 }
 иначе proc_4();
}

proc_4() // скобки
{
 если токен = "(", то
 {
   прочитать следующий токен;
   proc_1();
   проверить на присутствие ")";
   прочитать следующий токен;
 }
 иначе proc_5();
}

proc_5() // константы
{
 проверить на валидность;
 вывести константу;
 прочитать следующий токен;
}


Наверх

Титульная страница Поиск, карта сайта Написать письмо