Comments: |
![[User Picture]](http://lj.rossia.org/userpic/42280/9559) | From: | ppkk |
Date: | March 27th, 2009 - 01:07 am |
---|
| | | (Link) |
|
А есть нормальный компилятор современного Си++ (ну, с STL, можно без Boost:))? (Об ошибках около gcc давно читаю, интересуюсь теоретически, чтобы поставить и не обламываться, если что-нибудь захочу написать на хотя бы тысячу строк.)
![[User Picture]](http://lj.rossia.org/userpic/197531/22349) | From: | ketmar |
Date: | March 27th, 2009 - 01:12 am |
---|
| | | (Link) |
|
нету, конечно же. нормальный компилятор для цпп вообще написать совершенно нереально в силу монстродурости языка. пока его дотестишь — половину уже переписывать пора. plain C ещё вот кое-как…
впрочем , с gcc не всё так плохо, на самом деле, он таки весьма безглючен. да и -O0 для проверок есть, dumb code совсем-совсем редко ошибается. пишут же вон на гцц — Qt тот же, вебкит — там далеко больше тыщи строк.
![[User Picture]](http://lj.rossia.org/userpic/42280/9559) | From: | ppkk |
Date: | March 27th, 2009 - 01:36 am |
---|
| | | (Link) |
|
Ну, gmp, например, http://www.gmplib.org/ из того, что меня за душу трогает, сильно ругается. Ошибки скорее стиль программирования вызовет, наверное.
![[User Picture]](http://lj.rossia.org/userpic/197531/22349) | From: | ketmar |
Date: | March 27th, 2009 - 01:44 am |
---|
| | | (Link) |
|
оооо, нашёл на кого показывать. %-) это ж стресс-тест компилятора скорее %-), его, наверное, мало кто из (если вообще найдётся такой) *оптимизирующих* компилеров совершенно точно прожуёт.
тем более что, в принципе, никакой вменяемой технологии отладки и автотестинга для оптимизаторов, в общем-то, нет. матдоказательства рассматривать смешно в силу огромности условий. автотесты генерить неизвестно как. а ручные завсегда неполные — тупо невозможно все случаи (с учётом взаимовлияния) рассмотреть. боюсь, что даже автотесты в этом случае будут сильно неподъёмными, только для каких-то суперкластеров. отсюда — мелкий баг в одном месте может таааааак накосорылить…
![[User Picture]](http://lj.rossia.org/userpic/42280/9559) | From: | ppkk |
Date: | March 27th, 2009 - 02:08 am |
---|
| | | (Link) |
|
Ну, всем трудно жить. Кстати, напиши что-нибудь про регулярные выражения мне в дневничок — я подумываю (не факт, что это будет реализовано) движок регулярных выражений написать, то ли на Паскале (дань уважения используемому языку), то ли на Си++ (вспомнить язык, с которого начинал после Turbo Basic), может даже попробую с поддержкой Юникода ( http://www.unicode.org/reports/tr18/ , но это уж тем более вряд ли: только если интересно будет про языки разные технические подробности узнать). Хочу с синтаксисом определиться.
![[User Picture]](http://lj.rossia.org/userpic/197531/22349) | From: | ketmar |
Date: | March 27th, 2009 - 02:11 am |
---|
| | | (Link) |
|
а что написать-то? собственно, вряд ли имеет смысл делать синтаксис, отличный от перлового в этом случае. как бы стандарт «де факто», и к нему кучу тестов можно нарыть в этих ваших интернетах.
ну, или вот EBNF, кстати — тоже ведь регулярки, по-сути.
![[User Picture]](http://lj.rossia.org/userpic/42280/9559) | From: | ppkk |
Date: | March 27th, 2009 - 02:35 am |
---|
| | | (Link) |
|
Меня интересуют личные мнения типа: "Вот этой фигнёй я всё время пользуюсь тогда-то и тогда-то, очень удобно и безальтернативно!"
Перловый синтаксис идёт в жопу: я всё-таки хочу регулярных выражений движок написать в основном, а не гарантировать наличие глюков, подобных тем, что меня сподвигают на рассуждения об этой деятельности.
"Back-tracking", который, например, есть даже в POSIX BRE, я точно не собираюсь реализовывать: ибо не знаю, как справиться с "\(.*\)\1", не пожирая неопределённо много памяти и времени (что известно и разумному TRE, см. домашнюю страничку). Собственно, что-то типа TRE и получится в идеале (ну, совсем в идеале — с продвинутой поддержкой Юникода), ну, на нулевой символ, конечно, не предполагается нервической реакции.
![[User Picture]](http://lj.rossia.org/userpic/197531/22349) | From: | ketmar |
Date: | March 27th, 2009 - 02:43 am |
---|
| | | (Link) |
|
а. так я кроме [] и захватов с жадностью-нежадностью обычно ничего больше и не использую. право, для чего-то сложного проще написать и отладить парзер, чем регулярку. обычно я просто бью на куски простейшей регуляркой (когда разделителями бывают несколько символов или символ из диапазона), а потом уже обычно извращаюсь. ну, не укусил меня Ларри в детстве.
ктстати, а разве TRE не жуёт утф? ну, только что на ноль нервничает.
![[User Picture]](http://lj.rossia.org/userpic/42280/9559) | From: | ppkk |
Date: | March 27th, 2009 - 02:48 am |
---|
| | | (Link) |
|
Ты по ссылке на Юникод смотрел? Поддержка Юникода может быть беспредельной
А что такое "захваты с жадностью-нежадностью" конкретно (я тоже пользуюсь, но не потому, что есть разница, а из-за глючности движка: нежадные захваты он обрабатывает корректнее, реже виснет), зачем это?
// выхожу из интернетов до дня
![[User Picture]](http://lj.rossia.org/userpic/197531/22349) | From: | ketmar |
Date: | March 27th, 2009 - 02:54 am |
---|
| | | (Link) |
|
>Ты по ссылке на Юникод смотрел? неа, не смотрел, я ленивое. ща гляну.
>А что такое "захваты с жадностью-нежадностью" ну, обычные скобочки «()», «*» или «+» и модификатор жадности. надо, например, затем, чтобы строку сплитить по регулярке. например, если разделители — пробелы, то надо их жадно съедать все, обычно. а вот если запятые — то тут жадность ни к чему, «,,» вполне может означать пустое поле.
![[User Picture]](http://lj.rossia.org/userpic/42280/9559) | From: | ppkk |
Date: | March 27th, 2009 - 03:50 pm |
---|
| | | (Link) |
|
Запятую надо ловить ",?", если есть или нет.
Можешь уточнить?
![[User Picture]](http://lj.rossia.org/userpic/197531/22349) | From: | ketmar |
Date: | March 27th, 2009 - 03:55 pm |
---|
| | | (Link) |
|
нет. вот: "a,b,,c" как это "или нет"? O_O разделитель же. вот типа так: ",+?([a-z]*)" ну, то есть, по минимиму запятых (но хотя бы одна), и дальше буквы. ну и ты пы. и вот: "\s+([a-z]*)" по максимуму пробелов, и дальше буквы.
![[User Picture]](http://lj.rossia.org/userpic/42280/9559) | From: | ppkk |
Date: | March 27th, 2009 - 04:04 pm |
---|
| | | (Link) |
|
"[a-z]*,?" — если запятая есть, обязана попасть в выражение, все буквы подряд обязаны попасть в выражение.
Если всю штуку, то "([a-z]*,?)*" — но ты не вычленишь их, ибо это не предусмотрено (когда подвыражения с "*" или чем-то таким, ловится только последнее).
Если ровно четыре хочешь, да ещё подвыражениями, то "([a-z]*),([a-z]*),([a-z]*),([a-z]*)" (ну, если в движке для подвыражений нужно "\(", "\)", то соответственно).
Если четыре, а ловить не нужно, то "([a-z]*,){3}[a-z]*".
Поясни.
![[User Picture]](http://lj.rossia.org/userpic/197531/22349) | From: | ketmar |
Date: | March 27th, 2009 - 04:09 pm |
---|
| | | (Link) |
|
>сли всю штуку, то «([a-z]*,?)*» — но ты не вычленишь их, ибо это не предусмотрено O_O «(([a-z]*,?)*» это раз. два: «?» — это «0 или 1». а «+» — это «1 или много». разница очевидна же.
зыж вот я и говорю — мне проще руками парзер сделать, чем регулярку сочинять. не кусал меня Ларри.
![[User Picture]](http://lj.rossia.org/userpic/197531/22349) | From: | ketmar |
Date: | March 27th, 2009 - 04:10 pm |
---|
| | | (Link) |
|
сорри, скобку забыл. (([a-z]*),?)
![[User Picture]](http://lj.rossia.org/userpic/197531/22349) | From: | ketmar |
Date: | March 27th, 2009 - 04:11 pm |
---|
| | | (Link) |
|
а вообще, мне хватает примитивного движка из Lua. вот что он умеет: * (жадное) + (жадное) ? (жадное) — (то же, что и *, не жадное). всё, даже альтернатив нет. для простого разбиения строк хватает, дальше идут в ход парзеры. что хорошо — исходник движка 20 кил, и никакой там прекомпиляции. и никаких тормозов. ну, и 0 оно отлично лопает (%z).
![[User Picture]](http://lj.rossia.org/userpic/42280/9559) | From: | ppkk |
Date: | March 27th, 2009 - 04:23 pm |
---|
| | | (Link) |
|
Можешь дать конкретный пример, когда НУЖНО нежадное?
![[User Picture]](http://lj.rossia.org/userpic/197531/22349) | From: | ketmar |
Date: | March 27th, 2009 - 04:34 pm |
---|
| | | (Link) |
|
да. «^%s*(.-)%s*$» это обычный trim. жадное .* слопает всё до конца строки вместе с завершающими пробелами. нежадное — нет.
![[User Picture]](http://lj.rossia.org/userpic/42280/9559) | From: | ppkk |
Date: | March 27th, 2009 - 05:44 pm |
---|
| | | (Link) |
|
???
"^ [\x20\t]* ( [^\x20\t] (.*[^\x20\t])? ) [\x20\t]* $"
Или
"^%s*([^%s](.*[^%s])?)%s*$", если я правильно синтаксис понял
Так что необходимости не вижу.
Если же хочется сокращений, то лучше ввести макросы, по-моему.
![[User Picture]](http://lj.rossia.org/userpic/197531/22349) | From: | ketmar |
Date: | March 27th, 2009 - 05:50 pm |
---|
| | | (Link) |
|
ты намекаешь, что вот этот вот пиздец проще? да я лучше тогда посимвольный trim напишу. это я даже прочитать ниасилил.
![[User Picture]](http://lj.rossia.org/userpic/42280/9559) | From: | ppkk |
Date: | March 27th, 2009 - 06:04 pm |
---|
| | | (Link) |
|
Если не осилил, то лучше действительно не пользоваться регулярными выражениями.
Длиннее примерно в два раза (я уже послал, что вопросик забыл): разобраться с 12-ю или 26-ю символами — разница небольшая, по-моему.
Ради "проще" всё равно лучше макросы (для IP-адреса и тем более адреса электронной почты или доменного имени это позволит писать внятные выражения с использованием действительно громоздких выражений, а не упрощённой херни, которую обычно используют).
И так много спец. символов, зачем ещё минус?
![[User Picture]](http://lj.rossia.org/userpic/197531/22349) | From: | ketmar |
Date: | March 27th, 2009 - 06:15 pm |
---|
| | | (Link) |
|
>Если не осилил, то лучше действительно не пользоваться регулярными >выражениями. по-моему, мой вариант проще и удобней. меня мало ебёт, как там мучался автор библиотеки: регулярки — они для облегчения жизни, а не для извращённого секса. какой смысл использовать то, что сложнее, если есть то, что проще?
>Ради «проще» всё равно лучше макросы новая сущность. опять усложнение. зачем мне макрос, если я могу присвоить часть регулярки чему-то, а потом соединять части? и, кстати, в тех же частях простейшей же регуляркой перед присоединением менять что надо.
>И так много спец. символов, зачем ещё минус? потому что «*?» — это два символа. зачем два, если «*», «+» и «?» уже задействованы? опять модификаторы? модификаторы — это усложнение. в доке вообще написано, что любые не alnum можно смело экранировать — потому что это проще, чем запоминать, кто из них особенный. собственно, я так и делаю.
![[User Picture]](http://lj.rossia.org/userpic/42280/9559) | From: | ppkk |
Date: | March 27th, 2009 - 06:57 pm |
---|
| | | (Link) |
|
использовать то, что сложнее, если есть то, что проще? Тогда проще, короче и понятнее s:=trim(s);.
новая сущность. опять усложнение Не более, чем "нежадный" вариант. С точки зрения того, что это регулярные выражения, а не плод идиотской фантазии по "усовершенствованию" регулярных выражений, макросы сохраняют выражения регулярными (после развёртывания), но делают их более читаемыми (до развёртывания). А жадность/не жадность отдельных частей выражения — необязательные (пока что так выглядит) элементы, которые могут вывести за рамки (на самом деле я знаю, как с этим бороться: особых проблем нет, но дополнительные действия на каждом шаге, обработке каждого следующего символа, появляются; оценить, правда, что хуже: последствия удлиннения или эти дополнительные действия, в общем я затрудняюсь).
любые не alnum можно смело экранировать — потому что это проще, чем запоминать, кто из них особенный. собственно, я так и делаю. Тогда и на макросы не жалуйся.
![[User Picture]](http://lj.rossia.org/userpic/197531/22349) | From: | ketmar |
Date: | March 27th, 2009 - 07:07 pm |
---|
| | | (Link) |
|
>Тогда проще, короче и понятнее s:=trim(s);. на Lua, пожалуйста. мы сейчас о регулярках, а не о стандартных библиотеках же.
>Тогда и на макросы не жалуйся. я не жалуюсь, я не понимаю, нахуя они нужны, если регулярки средствами почти любого языка и так можно из кусков спокойно собирать.
![[User Picture]](http://lj.rossia.org/userpic/42280/9559) | From: | ppkk |
Date: | March 27th, 2009 - 07:18 pm |
---|
| | | (Link) |
|
А зачем с кусками возиться?
А так запускаешь выражение и либо получаешь отказ, либо, например, получаешь в переменные проверенные синтаксически три адреса электронной почты, два IP и ещё что-нибудь. Для каждого типа готовы длиннющие выражения, а в выражении для их вытягивания пишешь только что-нибудь в духе {:IP} или {:Email}. Ещё в регулярном выражении недурно воспринимается игнорирование пробелов и возможность писать комментарии.
![[User Picture]](http://lj.rossia.org/userpic/197531/22349) | From: | ketmar |
Date: | March 27th, 2009 - 07:27 pm |
---|
| | | (Link) |
|
а зачем множить сущности без нужды?
local r0 = [тут-регэксп-мыла]; local r1 = [тут-регэксп-ип]; local email, ip = s:match(r0.."%s+"..r1);
за фигом мне нужны макросы в либе регэкспов? собрал общеупотребительные регулярки в библиотеку, да и всё.
я к тому, что почти все языки так позволяют. вопрос: зачем их дублировать? сама регулярка — реально упрощение иногда. а лишние сущности в регулярке — и усложнение библиотеки, и ненужный дубль.
единственно, где такое создаст некоторые проблемы — это сиобразные макроассемблеры, где до сих пор нет нормальной работы со строками. ну так ССЗБ, не надо на них подобное писать.
![[User Picture]](http://lj.rossia.org/userpic/42280/9559) | From: | ppkk |
Date: | March 27th, 2009 - 07:34 pm |
---|
| | | (Link) |
|
Ну, если у тебя между ними "%s+", то да. А если ты целую форму хочешь считать, то другое дело.
![[User Picture]](http://lj.rossia.org/userpic/197531/22349) | From: | ketmar |
Date: | March 27th, 2009 - 07:37 pm |
---|
| | | (Link) |
|
да какая разница? хоть мегакилометр чего-то. нет, я тупо не понимаю, какая разница между моей и твоей записью.
![[User Picture]](http://lj.rossia.org/userpic/42280/9559) | From: | ppkk |
Date: | March 27th, 2009 - 07:52 pm |
---|
| | | (Link) |
|
Можно отдельно править большое регулярное выражение. На двадцать строк запихивать кусочками средствами языка — геморрой. Я ненавижу писать всякие такие штуки на много строк типа: 'a'+b+'c'+d+'efg'+h.
![[User Picture]](http://lj.rossia.org/userpic/197531/22349) | From: | ketmar |
Date: | March 27th, 2009 - 07:58 pm |
---|
| | | (Link) |
|
ну так у меня тоже отдельные строки. а потом из кусочков составляется что надо. и с комментариями. в чём разница? не, натурально не понимаю.
![[User Picture]](http://lj.rossia.org/userpic/42280/9559) | From: | ppkk |
Date: | March 27th, 2009 - 08:21 pm |
---|
| | | (Link) |
|
В том, что у меня в отдельных файлах регулярные выражения, которые я могу править, не исправляя программы, например.
![[User Picture]](http://lj.rossia.org/userpic/197531/22349) | From: | ketmar |
Date: | March 28th, 2009 - 07:00 am |
---|
| | | (Link) |
|
ну, у меня вот вообще Lua вмонтирована обычно.
![[User Picture]](http://lj.rossia.org/userpic/42280/9559) | From: | ppkk |
Date: | March 27th, 2009 - 05:45 pm |
---|
| | | (Link) |
|
(вопросик общий забыл для серединки)
![[User Picture]](http://lj.rossia.org/userpic/197531/22349) | From: | ketmar |
Date: | March 27th, 2009 - 04:12 pm |
---|
| | | (Link) |
|
а, да. (abc)* Lua уже не умеет. то есть, скобки — только для захвата, группу с повторением ними не обозначишь.
![[User Picture]](http://lj.rossia.org/userpic/42280/9559) | From: | ppkk |
Date: | March 27th, 2009 - 04:22 pm |
---|
| | | (Link) |
|
Не понял. А если понял, то это абзац.
![[User Picture]](http://lj.rossia.org/userpic/197531/22349) | From: | ketmar |
Date: | March 27th, 2009 - 04:35 pm |
---|
| | | (Link) |
|
неа, просто Lua никогда не говорила, что у неё есть «регулярки». это так, расширеные wildcards с захватами. для регулярок есть luapcre и lpeg. | |