Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.09.05;
Скачать: CL | DM;

Вниз

Унарный минус в ОПЗ   Найти похожие ветки 

 
FastByte   (2004-08-17 13:54) [0]

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


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

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() // константы
{
 проверить на валидность;
 вывести константу;
 прочитать следующий токен;
}


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

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



Страницы: 1 вся ветка

Текущий архив: 2004.09.05;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.048 c
11-1079594561
-SeM-
2004-03-18 10:22
2004.09.05
VCL контролы на KOL форме


14-1092592839
jack128
2004-08-15 22:00
2004.09.05
Вот мы выклыдываем фотки с MMP, а потом над ними вот так


3-1092073056
Владимир
2004-08-09 21:37
2004.09.05
Ошибка в ADOQuery


1-1093079823
far
2004-08-21 13:17
2004.09.05
Проблема с фиксингом глобальных ссылок при десериализации формы


4-1090572558
Proger
2004-07-23 12:49
2004.09.05
Позиция курсора