Главная страница
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.085 c
14-1092823518
WondeRu
2004-08-18 14:05
2004.09.05
Люди, туплю уже час......


3-1092032923
lamer_delpheneok
2004-08-09 10:28
2004.09.05
Тупой вопрос наверное, как заполнить dbcombobox ???


3-1092116802
Faeton08
2004-08-10 09:46
2004.09.05
Номер по порядку


3-1092299304
Diman
2004-08-12 12:28
2004.09.05
Как RTF-файл открыть в DBGrid?


14-1092746458
DillerXX
2004-08-17 16:40
2004.09.05
Пожалуйста, подскажите прогу для закачки полифонии на Siemens C62