Главная страница
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.055 c
3-1092168310
Zif
2004-08-11 00:05
2004.09.05
Можно ли в ADOQuery соединить несколько таблиц?


8-1087123247
Barnaul
2004-06-13 14:40
2004.09.05
Вопрос по поводу Canvas a


3-1092299680
Pipl
2004-08-12 12:34
2004.09.05
передача данных в 1С


1-1092767959
Jrek
2004-08-17 22:39
2004.09.05
Как добавить субдиректории


4-1090566377
Form_1
2004-07-23 11:06
2004.09.05
Неправильное преобразование?