Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.09.05;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.45 MB
Время: 0.035 c
14-1092734667
Blackman
2004-08-17 13:24
2004.09.05
Сайт "Курс борьбы с DELPHI" закрывается 20.08.2004


3-1092223644
DmitryMN
2004-08-11 15:27
2004.09.05
Ошибка в UDF


8-1087730252
Dextor
2004-06-20 15:17
2004.09.05
AVI


14-1092959668
Никола
2004-08-20 03:54
2004.09.05
Подскажите, плиз!


14-1092579197
Soft
2004-08-15 18:13
2004.09.05
Вирусы добрались до копира:)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский