Форум: "Основная";
Текущий архив: 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.032 c