Manodvaravajjana
Гость
|
 |
« : 31 Май 2010, 17:02:38 » |
|
нужен надёжный алгоритм, если вкратце есть N-полей ввода (HTML INPUT) с M-select'aми (HTML SELECT)
в input вводится текст, в M - выбирается AND или OR.
получится:
a OR b AND c OR d AND e AND или по другому строчка " a OR b AND c OR d AND e " как это перевести в выражение " (a OR b ) AND (c OR d) AND e " в наличии скриптовый язык PHP у меня есть самодельный который работает с 8-9 значениями, на больших не пробовал. хотелось бы научный а не самодельный. спс.
|
|
« Последнее редактирование: 01 Июнь 2010, 21:05:48 от Manodvaravajjana »
|
Записан
|
|
|
|
RILLey_ELf
Гость
|
студенческая лаба - научный алгоритм... по бекусу-науру, достаточно сделать:
expr := ELEMENT AND expr write( ELEMENT AND expr ); expr := ELEMENT OR expr write( '(' ELEMENT OR expr ')' ); expr := ELEMENT write( ELEMENT );
вроде должно работать, если я правильно понял задачу
|
|
|
Записан
|
|
|
|
Manodvaravajjana
Гость
|
|
|
|
Записан
|
|
|
|
iddqd
|
че то я не понял есть выражения, and и or, и надо чтобы оно само дадумалось, как скобки расставить?
|
|
|
Записан
|
|
|
|
Manodvaravajjana
Гость
|
че то я не понял есть выражения, and и or, и надо чтобы оно само дадумалось, как скобки расставить?
да p.s.: по бекусу науру нифига не понял, но из "самодельного" опыта мой рабочий алгоритм намного сложнее
|
|
|
Записан
|
|
|
|
RILLey_ELf
Гость
|
естественно сложнее вы вручную пишите конечный автомат алгоритм простой: нашли or - поставили скобки. т.е.: 1) ищем or 2) ищем справа от него символ отличающийся от пробела, если это открывающая скобка - то рекурсивно ищем соответствующую закрывающую скобку; если это не открывающая скобка то ищем следующий пробел и там ставим закрывающую скобку 3) аналогично делаем слева
ну если учесть что ВСЕГДА подаются корректные данные
|
|
|
Записан
|
|
|
|
iddqd
|
так а что, выражение всегда одинаковое? а если юзер подразумевал a OR ( b AND c ) OR ( d AND e ) то как быть?
|
|
|
Записан
|
|
|
|
Бред Питт
|
Алгоритм Рутисхаузера попробуйте ( ссылка) Его немного модифицировать, и нормально будет: вначале там, где встречается OR, "спускаетесь". Потом идете снизу вверх, попутно оборачивая выражения в скобки.
|
|
|
Записан
|
Театр закрывается. Нас всех тошнит.
|
|
|
spammer
|
если автор хочет скобки вокруг всех OR, то алгоритм прост: String str = "a OR b AND c OR d AND e"; // начальные данные String result = "true"; // ответ
String[] splits = str.split(" +AND +"); for (String split : splits) { result += " AND (" + split + ")"; } в результате получится ответ вида "true AND (a OR b) AND (c OR d) AND (e)", т.е. то что нужно если он хочет чего-то другого, пусть объяснит по человечески
|
|
|
Записан
|
|
|
|
iddqd
|
если он хочет чего-то другого, пусть объяснит по человечески о, верно 
|
|
|
Записан
|
|
|
|
spammer
|
как вариант еще проще: String str = "a OR b AND c OR d AND e"; // начальные данные String result = str.replaceAll("(\w+ OR \w+)", "($1)"); // ответ
|
|
|
Записан
|
|
|
|
Manodvaravajjana
Гость
|
строки вокруг or это я могу поставить, обьясняю: я делаю поиск по условиям, пользователь выбирает условия и к каждому условию And/Or получается a=2 OR b=1 AND c=6 OR d=7 AND e=9 AND ... и так далее по этим условиям нужно составить запрос SQL, логика "a OR b AND c OR d AND e" -> в выражение " SELECT ... WHERE (a OR b ) AND (c OR d) AND e ..." собственно так, мой работает смотря "а что там слева" и "а что там справа" + куча regexp'a и if'ов и размером примерно с 2 страницы на 19* мониторе. "вначале там, где встречается OR, "спускаетесь". Потом идете снизу вверх, попутно оборачивая выражения в скобки." + в этом чтото есть, нужно сделать дерево от OR в виде ассоциативного массива.. попробую попробую и другие варианты но они както меньше внушают оптимизм так а что, выражение всегда одинаковое? а если юзер подразумевал a OR ( b AND c ) OR ( d AND e ) то как быть?
приоритет OR выше AND, (т.е OR в скобках "притягиваются", и области просто склеены AND, крайтие варианты вроде "только OR" или "только AND" вычислаются IF'ами чтобы всё выражение не было вскобках и т.п.)
|
|
|
Записан
|
|
|
|
spammer
|
что значит "a=2 OR" ? Добавлено: [time]Tue Jun 1 12:54:31 2010[/time]
собственно так, мой работает смотря "а что там слева" и "а что там справа" + куча regexp'a и if'ов и размером примерно с 2 страницы на 19* мониторе. собственно в этом и заключается квинтэссенция пхп-программирования 
|
|
« Последнее редактирование: 01 Июнь 2010, 14:19:13 от spammer »
|
Записан
|
|
|
|
iddqd
|
мля, два раза читал, нихера не понял
|
|
|
Записан
|
|
|
|
Manodvaravajjana
Гость
|
плохо что не понимаете, и плохо что я неумею обьяснять но такова реальность. всем спасибо за помощ. дерево делать не пришлось, т.к. вложенных скобок нет вот что у меня получилось благодаря уже кое-какому опыту написание такого на JS'e и регулярных варажениях + ваша помощ, может кому пригодится, всем раздал по "+"  спасибо! привожу исходные данные для наглядности, результат (a or b) and (c or d) and e http://codepad.org/Cxh93xJC
|
|
« Последнее редактирование: 01 Июнь 2010, 14:48:33 от Manodvaravajjana »
|
Записан
|
|
|
|
RILLey_ELf
Гость
|
codepad.org pastie.org в отпуске  плохой у вас код (если это только для учебного примера, в качестве лабы первокурсника)
|
|
|
Записан
|
|
|
|
Manodvaravajjana
Гость
|
codepad.org pastie.org в отпуске  плохой у вас код (если это только для учебного примера, в качестве лабы первокурсника) чем плох то  p.s. только не баньте за "приватные" сообщения а то и так уже карточек выше крыши p.p.s видел бы ты код yahoo первокурсники отдыхают
|
|
|
Записан
|
|
|
|
RILLey_ELf
Гость
|
тем, что его никто читать не станет  где: 1) нормальные именования переменных; 2) комментарии; 3) вместо массива-массивов нужно делать класс; 4) переменная in_bracket вообще непонятно что делает, судя по логике 5) проверка p[$i+1] - вообще жесть хотя учитывая ваш входной набор данных, я не понимаю что делает ваша программа (зачем последний AND) ?
|
|
|
Записан
|
|
|
|
Manodvaravajjana
Гость
|
тем, что его никто читать не станет  где: 1) нормальные именования переменных; 2) комментарии; 3) вместо массива-массивов нужно делать класс; 4) переменная in_bracket вообще непонятно что делает, судя по логике 5) проверка p[$i+1] - вообще жесть хотя учитывая ваш входной набор данных, я не понимаю что делает ваша программа (зачем последний AND) ? * in_bracket вообщето boolean true/false, но короче написать ++/-- * p[$i+1] тоже сокращение чтобы поменьше букаф а так да конечно, во всём согласен, грешен 
|
|
|
Записан
|
|
|
|
|