Pull to refresh

Comments 30

Поскольку автор не понял моё «Нет», поясняю подробно.
LIKE сделан не для извращенно сложных поисков, а в первую очередь для выборки ПО ИНДЕКСУ. Поиск вида 'LIKE %aa%' будет вестись не по индексу, а full-scan'ом. А Вы еще и кучу таких условий навешиваете… фактически это убогая реализация field REGEXP expression. Никто в здравом уме использовать такое не станет.
ну тогда смотри на это просто как на формальную граматику — действительно практической ценности тут нет кроме как валидация данных введенных пользователем.
<...>
действительно практической ценности тут нет
<...>
Тогда какой смысл в статье?

А валидацию данных, думаю, можно куда как проще сделать.
цель была напомнить о том как пишутся формальные грамматики, я для себя их недавно открыл, вот и придумал с вами поделиться.
кстати насчет валидации ошибаетесь. Если разрешить пользователю писать REGEXP думаю еще намучаетесь.

PHP код, оформленный таким образом как у вас, вряд ли чему научит. Лучше бы ссылки на теорию дали.
Посмотрите отступы в методе protected function T(). Название методов тоже суперские.

С точки зрения оформления это — быдлокод. С точки зрения алгоритма, сорри, но я не хочу пытаться вникать в подобный код.

ЗЫ: Ничего лично, обидеть не пытался.
смешной какой. Если нечего сказать по теме и мозговой активности не хватает понять что-то новое, то зачем вообще что-то говорить? Для вас я поправил съехавшие пробелы (конечно кодсвичерами пользоваться леминги не умеют), но не думаю что вам это поможет что-либо понять, потому что для начала нужно желание. Как говорится кто хочет — тот ищет возможности, кто не хочет, тот ищет причин =)

Кстати, если бы вы хотя бы вскользь прочитали, то поняли бы, что названия функций соответствуют терменируемым элементам словаря — что собственно они и делают.
Причем тут новое? Вы думаете, что я ни разу грамматических парсеров не писал?

Оформили статью кое-как, вот и получаете соответствующие комментарии.

То, что она — бесполезна, вы сами признали.

Так что минусуйте больше, если вам все равно нечего больше добавить, кроме как «смешной какой» и «мозговой активности не хватает».

Про термины словаря. Это вы потом тому кто ваш код поддерживать будет расскажите.

Вы мне напоминаете моего бывшего коллегу, который писал код кое-как, но при этом говорил «зато оно работает» и «это писалось в 5 утра». О том, что вместо использования его кода, проще было с нуля писать, он почему-то не думал.
каждый останется при своем. Я в плюсы/минусы не верю вообще, однако не смотря на то, что вы даже не читали, я могу убрать статью в личный блог, при наборе ею отрицательного веса (скажем -10 завтра будет тогда перенесу) все равно температура будет средней по палате. Кстати, никто из моих коллег не жаловался на качество моего кода — ваши убеждения субъективны и уж точно не достаточно аргументированы чтобы вдаваться в дальнейшую дискуссию.
А вот как насчет хотя бы немного рассказать о том, что такое «формальная грамматика», а не начинать сразу за «пришлось мне как-то» лепить малопонятный стороннему человеку код (вы бы его еще через обфускатор пропустили, совсем стало бы понятно все ;) )?

P.S. И на гугл тоже посылать не надо.
да я на гугл не посылаю — я ж на вики дал ссылку, там определение есть, его не дополнить ни укоротить. Могу попытаться сказать своими словами — это правила разбиения исходной строки (набора из множества алфавита) на дерево (подмножества), только все равно нужен пример иначе не ясно — в вики он есть.
Что касается кода то тут нужно как-то аргументировать, а не подобно предыдущему оратору слепо утверждать его не понятность.
Код в точности реализует алгоритм разбора, описанный выше
F -> T|T&F|T^F
T* -> I|!I|!S
I -> (F)|S
S -> C|SC
C -> [a-Z_ а-Я-]

собственно согласно обозначением 4 функции имеют имена преобразований F,T,I,S (единственный аргумент S разъяснен в звездочке), а остальные вспомогательны имеют «говорящие» имена setError — ошибка парсинга (что тут коментировать если класс назван парсинг) getError — показать ошибку, isEnd — понец разбираемой строки (тоже нада было комментировать?), parce — разбор строк.

как видите я потратил время на то что бы показать, что на мой взгляд тут все достаточно понятно (и без всяких гуглов и без всяких «зато работает»), так что будьте более конкретны и пишите, что именно вам не понятно.

просто есть вещи которые чтобы понять нужно немного подумать, а для этого нужно захотеть понять. А у меня такое ощущение что вы ожидаете там увидить свой код и совершенно не можете читать чужой, если он не оправдывает ваши ожидания.
Непонятность кода вызывалась кривым оформлением. Об этом ясно написано. То, что вы поправили оформление — прекрасно, но мои комментарии относились к изначальному варианту.

Пора учиться принимать критику.
да, конечно, я же сразу поправил: спасибо вам.
С обфускатором признаю — был не прав. Прошу прощения.

Тем не менее, вики далеко не всегда дает понятное определение. Есть подозрение, что в таких случаях втупую скопипастили из учебника определение или написали его языком, понятным только для специалистов.

В данном случае вы объяснили своими словами, пропустив информацию через сознание и сжав её до опыта.

P.S. я тоже наверное непонятно объясняю? ;-)
Кстати, там в ряде мест:
$this->sql_token.= ')';
$this->index++;

"$" не пропущен?
нет конечно! это синтаксис такой у PHP. имена переменных объекта не маркируются "$"
Ага. Спасибо, буду знать. Не использую ООП. По крайней мере пока.
будьте бдительны потому что имена переменных класса (не объекта напротив маркируются), например, self::$instance
Такие штуки нужны для написания любых строковых парсеров, там калькуляторов консольных ну и прочей лабуды.
Прикольно. Интересно чисто из спортивных соображений.
А поделитесь плиз примером, где такой поиск востребован?
да нигде на самом деле в таком виде =) пример около синтетический.
хотя вот например смотри яндекс же тоже имеет свой мета язык поиска и как-то его разбирает, думаю не ошибусь если скажу что тоже на основе грамматик!
imho, поиск с помощью sql LIKE — унылое Г. если в вашем распоряжении только этот вариант поиска на сайте, лучше используйте внешний поиск Google или Yandex. всяко разно лучше будет, да и нагрузка на сервер поменьше.
вообще я нигде тут не сказал что это поиск «по сайту» это была проба идеи поиска по базе статей, на бирже для автоматических продаж. Например, человек хочет купить статьи которые создают ему семантическое ядро определенной направленности. С таким синтаксическим анализатором запроса можно дать клиенту задавать гибко критерии поиска. Реализация с like взята как самая простая для понимания — об этом неоднократно писалось как в статье так и в комментариях, вы можете на синтаксический обработчик повесить любые реализации, главное уметь сам обработчик своего метаязыка написать — вот о чем статья.
Блин, прикольно… А есть ли готовые анализаторы на PHP типа GNU Bison в которые загружаешь грамматики а он программу по ним сам строит?
Sign up to leave a comment.

Articles