почему вы используете регулярные выражения?
От: lurrker  
Дата: 02.01.11 09:03
Оценка: 12 (3)
Есть, например, PEG, который превосходит регэксы во всем.
Как минимум одно радикальное преимущество — это возможность делать декомпозицию. Что избавляет от необходимости писать такие вот жутики: http://stackoverflow.com/questions/2245282/what-is-the-longest-regular-expression-you-have-seen
Синтаксис приятнее, легче читается.
И тем не менее, основная масса по прежнему использует регэксы. Почему??
Re: почему вы используете регулярные выражения?
От: Real 3L0 Россия http://prikhodko.blogspot.com
Дата: 02.01.11 09:52
Оценка: 7 (2) +3
Здравствуйте, lurrker, Вы писали:

L>Есть, например, PEG, который превосходит регэксы во всем.


Стало интересно, что это за PEG и ...

L>И тем не менее, основная масса по прежнему использует регэксы. Почему??


... ответ нашел тут же http://www.rsdn.ru/forum/philosophy/3862088.flat.aspx
Автор: VladD2
Дата: 30.06.10

Вселенная бесконечна как вширь, так и вглубь.
Re: почему вы используете регулярные выражения?
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 02.01.11 10:11
Оценка: +2
Здравствуйте, lurrker, Вы писали:

L>Есть, например, PEG, который превосходит регэксы во всем.


Не во всём. Если я правильно понял, о чём идёт речь, уже первое большое отличие в виде неограниченного потребления памяти может быть значительно хуже регулярных выражений.

L>Как минимум одно радикальное преимущество — это возможность делать декомпозицию. Что избавляет от необходимости писать такие вот жутики: http://stackoverflow.com/questions/2245282/what-is-the-longest-regular-expression-you-have-seen


О какой декомпозиции речь? Если о возможности при разборе сразу выделять грамматические элементы, то она уже есть в нормальном движке регулярных выражений, например:

re_sip_uri_short = "sip:(?:%s)?(?:%s)" % (re_userinfo, re_hostport)
re_sip_uri = "sip:(?:%s)?(?:%s)(?:%s)?(?:%s)?" % \
  (re_userinfo, re_hostport, re_parameters_in_uri, re_headers_in_uri)
re_sip_uri_parse = "sip:(?P<userinfo>(?:%s)?)(?P<hostport>(?:%s))" \
    "(?P<params>(?:%s)?)(?P<headers>(?:%s)?)" % \
    (re_userinfo, re_hostport, re_parameters_in_uri, re_headers_in_uri)
re_addr_spec = re_sip_uri
re_addr_spec_short = re_sip_uri_short
re_name_addr = "(?:(?:(?:%s)?)\\s*<(?:%s)>\\s*)" % \
  (re_display_name, re_addr_spec)
## addr is our own term to name (name-addr|addr-spec-short)
re_addr = "(?:%s|%s)" % (re_name_addr, re_addr_spec_short)
## for SipAddress - separate display name and address
re_name_addr_p = "(?:(?P<display_name>(?:%s)?)\\s*<(?P<uri>%s)>\\s*)" % \
  (re_display_name, re_addr_spec)


См. ?P<имя> в некоторых конструкциях.

Длина re_name_addr_p — 496 байт (я не показал определения нижнего уровня;)), но он тривиален по структуре и достаточно легко понимается.

Тот "жутик" тоже 100% что не писался вручную, а склеивался из частей.

L>Синтаксис приятнее, легче читается.

L>И тем не менее, основная масса по прежнему использует регэксы. Почему??

Ну вот смотри: например, мне нужно решить что применять. Я знаю, что:

1. PEG — новая технология, движки сырые. Массового использования пока нет, каких-то чётких success stories — тоже.
2. Я уже давно умею работать с регулярными выражениями.
3. В Unix мире, движки регулярных выражений 1) на каждом углу, 2) ошлифованы десятилетиями, 3) на все вкусы.
4. Есть известные ограничения и проблемы (см. ссылку).

Что я в этих условиях буду выбирать для простых случаев (а это ~99% применений)?

Или ещё вопрос — это синтаксическое средство, а что на уровне лексики? Вот например pyPEG — какие там средства для лексического уровня? те же регулярные выражения.

И чем PEG лучше bison или yecc, которые у меня "под рукой" и за ними не нужно тянуться ХЗ куда?

И почему я должен писать PEG, например, для поиска какой-то фразы в редакторе, если регулярными выражениями делать это в разы проще?
The God is real, unless declared integer.
Re[2]: почему вы используете регулярные выражения?
От: lurrker  
Дата: 02.01.11 10:25
Оценка:
Здравствуйте, netch80, Вы писали:

N>Не во всём. Если я правильно понял, о чём идёт речь, уже первое большое отличие в виде неограниченного потребления памяти может быть значительно хуже регулярных выражений.


Неограниченное оно только теоретически. А практически оно ограничивается средствами движка, и все будет пучком Работать правда будет медленнее, но с другой стороны, в регэксах можно точно так же получить экспоненциальный бактрекинг, что значительно хуже.

N>О какой декомпозиции речь? Если о возможности при разборе сразу выделять грамматические элементы, то она уже есть в нормальном движке регулярных выражений, например:


Ну во первых, далеко не все движки это поддерживают. Во вторых, запись все равно очень неудобочитаемая.

N>Или ещё вопрос — это синтаксическое средство, а что на уровне лексики? Вот например pyPEG — какие там средства для лексического уровня? те же регулярные выражения.


в PEG не нужно разделение на синтаксис и лексику

N>И чем PEG лучше bison или yecc, которые у меня "под рукой" и за ними не нужно тянуться ХЗ куда?


а их тоже мало кто использует

N>И почему я должен писать PEG, например, для поиска какой-то фразы в редакторе, если регулярными выражениями делать это в разы проще?


почему это проще?
Re[3]: почему вы используете регулярные выражения?
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 02.01.11 10:33
Оценка:
Здравствуйте, lurrker, Вы писали:

N>>Не во всём. Если я правильно понял, о чём идёт речь, уже первое большое отличие в виде неограниченного потребления памяти может быть значительно хуже регулярных выражений.

L>Неограниченное оно только теоретически. А практически оно ограничивается средствами движка, и все будет пучком :) Работать правда будет медленнее, но с другой стороны, в регэксах можно точно так же получить экспоненциальный бактрекинг, что значительно хуже.

Только в NFA, кои пишутся от лености душевной.

N>>О какой декомпозиции речь? Если о возможности при разборе сразу выделять грамматические элементы, то она уже есть в нормальном движке регулярных выражений, например:

L>Ну во первых, далеко не все движки это поддерживают. Во вторых, запись все равно очень неудобочитаемая.

С последним согласен, это фактически единственная осмысленная претензия к регулярным выражениям конкретного образца (а именно, идущих из Bell Unix basic regexps). С другой стороны, вспомним SQL оператор LIKE и его предшественники во всяких BASIC — они уже устроены совсем иначе.

N>>Или ещё вопрос — это синтаксическое средство, а что на уровне лексики? Вот например pyPEG — какие там средства для лексического уровня? те же регулярные выражения.

L>в PEG не нужно разделение на синтаксис и лексику

Можно и без него, но jIMHO неудобно.

N>>И чем PEG лучше bison или yecc, которые у меня "под рукой" и за ними не нужно тянуться ХЗ куда?

L>а их тоже мало кто использует

О каком именно мире речь? Если Windows — да, возможно. Если Unix — направо и налево, потому что они стандартны.

N>>И почему я должен писать PEG, например, для поиска какой-то фразы в редакторе, если регулярными выражениями делать это в разы проще?

L>почему это проще?

Ну представь себе — я ищу if.*foobar (помню, что в каком-то if оно проверялось)
Что я должен буду писать в PEG? Конструкцию из трёх элементов, два из которых фиксированы, а третий — что угодно? Я задолбусь рисовать такие вещи на каждый чих.
The God is real, unless declared integer.
Re[4]: почему вы используете регулярные выражения?
От: lurrker  
Дата: 02.01.11 10:51
Оценка:
Здравствуйте, netch80, Вы писали:

N>Только в NFA, кои пишутся от лености душевной.


Э.. в смысле?
Насколько я понимаю, для любого движка можно написать регэкс, в котором бактреки будут плодиться как кролики.

N>Можно и без него, но jIMHO неудобно.


почему?

N>Ну представь себе — я ищу if.*foobar (помню, что в каком-то if оно проверялось)


странный какой-то регэкс. он у тебя заматчит foobar, который относится к другому ифу

N>Что я должен буду писать в PEG?


x = "if" .* "foobar"
Re[4]: почему вы используете регулярные выражения?
От: Курилка Россия http://kirya.narod.ru/
Дата: 02.01.11 10:55
Оценка: :)
Здравствуйте, netch80, Вы писали:

N>>>И почему я должен писать PEG, например, для поиска какой-то фразы в редакторе, если регулярными выражениями делать это в разы проще?

L>>почему это проще?

N>Ну представь себе — я ищу if.*foobar (помню, что в каком-то if оно проверялось)

N>Что я должен буду писать в PEG? Конструкцию из трёх элементов, два из которых фиксированы, а третий — что угодно? Я задолбусь рисовать такие вещи на каждый чих.

Плюс ещё замена по регекспам.
Конечно, часть юзкейсов покрывается рефакторингом, но по моим ощущениям это меньше половины.
А вообще регекспы в редакторе — очень удобная вещь и если люди их не пользуют, то а) редактор не поддерживает (но это ставит вопрос по поводу редактора) б) они не умеют ими пользоваться (это ставит вопрос про разрабочиков, которые свои инструменты плохо знают, что ставит под сомнение их квалификацию)
Re[5]: почему вы используете регулярные выражения?
От: Klatu  
Дата: 02.01.11 12:25
Оценка:
Здравствуйте, Курилка, Вы писали:

К>Плюс ещё замена по регекспам.


Ничто не мешает сделать замену по PEGам
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[6]: почему вы используете регулярные выражения?
От: Курилка Россия http://kirya.narod.ru/
Дата: 02.01.11 17:13
Оценка:
Здравствуйте, Klatu, Вы писали:

K>Здравствуйте, Курилка, Вы писали:


К>>Плюс ещё замена по регекспам.


K>Ничто не мешает сделать замену по PEGам


Только вот есть ощутимая разница между "пользоваться реальным инструментом сейчас" и "сделать"
Re: почему вы используете регулярные выражения?
От: Aen Sidhe Россия Просто блог
Дата: 02.01.11 18:48
Оценка:
Здравствуйте, lurrker, Вы писали:

L>Есть, например, PEG, который превосходит регэксы во всем.

L>Как минимум одно радикальное преимущество — это возможность делать декомпозицию. Что избавляет от необходимости писать такие вот жутики: http://stackoverflow.com/questions/2245282/what-is-the-longest-regular-expression-you-have-seen
L>Синтаксис приятнее, легче читается.
L>И тем не менее, основная масса по прежнему использует регэксы. Почему??

Потому что я где угодно могу написать new Regex(...).IsMatch и оно сработает.
С уважением, Анатолий Попов.
ICQ: 995-908
Re[5]: почему вы используете регулярные выражения?
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 02.01.11 20:20
Оценка:
Здравствуйте, lurrker, Вы писали:

N>>Только в NFA, кои пишутся от лености душевной.

1L>Э.. в смысле?
L>Насколько я понимаю, для любого движка можно написать регэкс, в котором бактреки будут плодиться как кролики.

Что-то не помню я такого, sorry. Ссылочку можно?

N>>Ну представь себе — я ищу if.*foobar (помню, что в каком-то if оно проверялось)

L>странный какой-то регэкс. он у тебя заматчит foobar, который относится к другому ифу

Они, если иное не сказано явно, работают в пределах строки.

N>>Что я должен буду писать в PEG?

L>x = "if" .* "foobar"

С каких пор .* стало элементом PEG?
И куда мне потом деть этот икс (гусары, молчать)?
The God is real, unless declared integer.
Re[6]: почему вы используете регулярные выражения?
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 02.01.11 21:12
Оценка:
N>С каких пор .* стало элементом PEG?

с тех пор как такой синтаксис стал активно использоваться почти во всех грамматиках.

N>И куда мне потом деть этот икс (гусары, молчать)?


можно туда же, куда ты деваешь имена после ?P в регулярках.
Re: почему вы используете регулярные выражения?
От: Kerbadun  
Дата: 03.01.11 00:01
Оценка: :)
Здравствуйте, lurrker, Вы писали:

L>Есть, например, PEG, который превосходит регэксы во всем.

L>Как минимум одно радикальное преимущество — это возможность делать декомпозицию. Что избавляет от необходимости писать такие вот жутики: http://stackoverflow.com/questions/2245282/what-is-the-longest-regular-expression-you-have-seen

Кстати, декомпозицию можно и с регулярными выражениями делать — конкатенацией строк. Что мешает?

L>Синтаксис приятнее, легче читается.

L>И тем не менее, основная масса по прежнему использует регэксы. Почему??

1) Инерция, регэксы гораздо древнее PEG. Многие вообще про этот PEG не слышали никогда.
2) Во многих случаях регулярных выражений достаточно, тем более, сейчас уже стали допиливать движки регулярных выражений до таких возможностей, что у них от регулярных выражений только название.

Когда он умрет, его мозг заспиртуют в стакане
Re[6]: почему вы используете регулярные выражения?
От: lurrker  
Дата: 03.01.11 04:24
Оценка:
Здравствуйте, netch80, Вы писали:

N>Что-то не помню я такого, sorry. Ссылочку можно?


А зачем тебе ссылочку? Надеюсь, месье не теоретик?
Вот простой практический пример:
регэкс (x+x+)+y применяешь к данным xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx, и движку становится очень-очень плохо.

N>Они, если иное не сказано явно, работают в пределах строки.


ну это если допустить, что в пределах одной строки не будет больше одного if, причем if может быть просто частью имени

N>С каких пор .* стало элементом PEG?


не знаю. но вот, стало-с

N>И куда мне потом деть этот икс (гусары, молчать)?


туда же, куда ты деваешь результат от регэксов
Re[7]: почему вы используете регулярные выражения?
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 03.01.11 09:06
Оценка:
Здравствуйте, DarkGray, Вы писали:

N>>С каких пор .* стало элементом PEG?


DG>с тех пор как такой синтаксис стал активно использоваться почти во всех грамматиках.


Значит, уходим от регулярных выражений по причине того, что они, мол, неудобные, кошмарный синтаксис, и тут же заимствуем ключевые элементы этого синтаксиса? По-моему, этот метод называется "двоемыслие".

N>>И куда мне потом деть этот икс (гусары, молчать)?


DG>можно туда же, куда ты деваешь имена после ?P в регулярках.


Нет, ты не понял. Покажи по символам, как подобный PEG использовать в задаче поиска строки в редакторе. Ну набрал я это выражение в каком-то соответствующем промпте — и что?
The God is real, unless declared integer.
Re[7]: почему вы используете регулярные выражения?
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 03.01.11 09:08
Оценка:
Здравствуйте, lurrker, Вы писали:

N>>Что-то не помню я такого, sorry. Ссылочку можно?


L>А зачем тебе ссылочку? Надеюсь, месье не теоретик? :))

L>Вот простой практический пример:
L>регэкс (x+x+)+y применяешь к данным xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx, и движку становится очень-очень плохо.

Попробовал. Питоновому (2.6) — поплохело. Перловому (5.10.1) — нет, даже когда я ещё в два раза больше иксов написал, чем ты предложил; вообще, его время оказалось линейным по длине образца в диапазоне до двух тысяч. Что и требовалось доказать. Это ты у нас строишь теории на своём незнании.
Почему питоновый такой случай не выдержал — не знаю детально (помню только, что перловый специально точили на суперзаумные выражения с матчингом между частями), но такой искусственный пример совершенно не интересен, мне интересны только практически реальные случаи.

С другой стороны, а что, если воспроизвести такой пример в PEG — он будет работать лучше? Я очень сомневаюсь.

N>>С каких пор .* стало элементом PEG?

L>не знаю. но вот, стало-с

Если есть такое, значит, это PEG с синтаксисом регэкспов. И кому он нужен, если целью тут предлагалось именно избавление от этого кошмарящего их и тебя синтаксиса?

N>>И куда мне потом деть этот икс (гусары, молчать)?

L>туда же, куда ты деваешь результат от регэксов :))

Вообще-то вначале надо его применить в качестве выражения для поиска, а не результата. Результат мне в редакторе как таковой не нужен, нужно место срабатывания поиска.
The God is real, unless declared integer.
Re[8]: почему вы используете регулярные выражения?
От: lurrker  
Дата: 03.01.11 09:21
Оценка:
Здравствуйте, netch80, Вы писали:

N>Попробовал. Питоновому (2.6) — поплохело. Перловому (5.10.1) — нет, даже когда я ещё в два раза больше иксов написал, чем ты предложил; вообще, его время оказалось линейным по длине образца в диапазоне до двух тысяч. Что и требовалось доказать.


Это доказывает только то, что разработчики перлового движка отошли от стандарта. Потому что при стандартной интерпретации этого выражения, там должны быть катастрофические бактреки.

N>Это ты у нас строишь теории на своём незнании.


Не груби.

N>Почему питоновый такой случай не выдержал — не знаю детально


потому что регэксы так устроены. я надеюсь мне не нужно устраивать ликбез на тему, как работают бактреки вообще и вот это выражение в частности?

N>(помню только, что перловый специально точили на суперзаумные выражения с матчингом между частями), но такой искусственный пример совершенно не интересен, мне интересны только практически реальные случаи.


Если тебе интересны только практически реальные случаи, зачем ты заговорил о проблемах в PEG? практическая реальность у них еще меньше.

N>С другой стороны, а что, если воспроизвести такой пример в PEG — он будет работать лучше? Я очень сомневаюсь.


В нем такой проблемы вообще не будет, если этот пример взять дословно. Там квантификаторы немного по другому работают. Этот пример тоже можно воспроизвести, но для этого придется уже сильно попрыгать с бубном.

N>Если есть такое, значит, это PEG с синтаксисом регэкспов. И кому он нужен, если целью тут предлагалось именно избавление от этого кошмарящего их и тебя синтаксиса?


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

N>Вообще-то вначале надо его применить в качестве выражения для поиска, а не результата. Результат мне в редакторе как таковой не нужен, нужно место срабатывания поиска.


Точно так же и применить. Правда, таких инструментов пока нет, это действительно камень в огород PEG
Re[9]: почему вы используете регулярные выражения?
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 03.01.11 10:03
Оценка:
Здравствуйте, lurrker, Вы писали:

N>>Попробовал. Питоновому (2.6) — поплохело. Перловому (5.10.1) — нет, даже когда я ещё в два раза больше иксов написал, чем ты предложил; вообще, его время оказалось линейным по длине образца в диапазоне до двух тысяч. Что и требовалось доказать.

L>Это доказывает только то, что разработчики перлового движка отошли от стандарта. Потому что при стандартной интерпретации этого выражения, там должны быть катастрофические бактреки.

Адекватность интерпретации проверяется тестами. Покажи тест, который перловый движок выполняет иначе (то есть даёт другие результаты), чем положено по спецификации, и я соглашусь. Если нет — останусь при своём мнении.

N>>Это ты у нас строишь теории на своём незнании.

L>Не груби.

Зачэм груби, дарагой? Всего лишь прямолинейная констатация факта: ты не знал, что могут быть другие результаты, но настоял, что все движки без ограничения должны страдать от этого. Я показал живой, тривиально проверяемый пример — ты не соглашаешься — мол, он что-то нарушает. Почему бы тебе не предположить, что это именно ты что-то не знаешь, а не те умные и опытные ребята, что пишут Perl?

N>>Почему питоновый такой случай не выдержал — не знаю детально

L>потому что регэксы так устроены. я надеюсь мне не нужно устраивать ликбез на тему, как работают бактреки вообще и вот это выражение в частности?

Не нужно. Но задумывался ли ты над тем, что твои знания, грубо говоря, ограничены арифметикой в этой области и там, где ты будешь складывать бесконечную сумму, более знающий просто возьмёт неопределённый интеграл?

N>>(помню только, что перловый специально точили на суперзаумные выражения с матчингом между частями), но такой искусственный пример совершенно не интересен, мне интересны только практически реальные случаи.

L>Если тебе интересны только практически реальные случаи, зачем ты заговорил о проблемах в PEG? практическая реальность у них еще меньше.

Затем, что если мы тут сравниваем регэкспы с PEG, я хочу какой-то систематичности в сравнении. Мы можем сравнивать по следующим параметрам:
1. Наглядность. Для многих регэкспы — иероглифы, и им легче читать грамматику. Что ж, я тут ничуть не возражаю.
2. Удобство применения в простых случаях (здесь и далее удобство рассматривается в контексте отсутствия религиозных возражений или проблем пункта 1). Как мне кажется, регэкспы удобнее в подавляющем большинстве случаев.
3. Принципиальная возможность применения в сложных случаях. Например, регэкспами можно взять подавляющее большинство грамматик, но, как в примере в начале этой темы, они будут содержать over 9000 символов, и искать проблемы движка, например, в этом будет крайне сложно.
4. Удобство применения в сложных случаях.

Так вот — у меня принципиальный вопрос: что я выиграю от использования PEG и, главное, по сравнению с чем? У меня есть, например, регэкспы для простых случаев. Есть грамматические средства (bison, yecc...) для сложных. PEG фактически представляет собой гибрид "стандартного lex" и "стандартного yacc" как классов софта. Если меня не устраивает стандартный lex? Например, gcc не использует стандартный lex, потому что грамматика Си даёт разные выражения от того, чем является идентификатор — переменной, именем типа, меткой, чем-то ещё; но он использует стандартный yacc (в виде bison). В случае lex+yacc я могу достаточно гибко разделить эти два слоя; цена вопроса — предкомпиляция. Зачем мне PEG? Он не даёт ничего нового...

Хорошо, явно задамся задачей именно оправдать применение PEG. Получается одна относительно специфическая задача — грамматический разбор текста с построением дерева разбора. Так?

N>>С другой стороны, а что, если воспроизвести такой пример в PEG — он будет работать лучше? Я очень сомневаюсь.

L>В нем такой проблемы вообще не будет, если этот пример взять дословно. Там квантификаторы немного по другому работают. Этот пример тоже можно воспроизвести, но для этого придется уже сильно попрыгать с бубном.

Отлично. Осталось понять, на кой аккредитив вообще тебе потребовалось показывать заведомо искусственный пример, который не соответствует AFAIU ни одной реальной грамматике (это чтобы войти в ту область задач, в которой сравнение с PEG вообще имеет смысл).

N>>Если есть такое, значит, это PEG с синтаксисом регэкспов. И кому он нужен, если целью тут предлагалось именно избавление от этого кошмарящего их и тебя синтаксиса?

L>Синтаксис там другой, просто позаимствовали удачные находки и исправили косяки.

`.*' это удачная находка? Дело ваше, конечно, но я неоднократно слышал/читал жалобы именно на эту конструкцию как на "базовый кошмар" регэкспов. Почему бы не взять вместо этого один из стандартных/распространённых синтаксисов BNF?

N>>Вообще-то вначале надо его применить в качестве выражения для поиска, а не результата. Результат мне в редакторе как таковой не нужен, нужно место срабатывания поиска.

L>Точно так же и применить. Правда, таких инструментов пока нет, это действительно камень в огород PEG

Ну вот когда появятся — можно будет сравнивать удобство. Пока что "измерить температуру забортной воды невозможно за отсутствием таковой".
The God is real, unless declared integer.
Re[8]: почему вы используете регулярные выражения?
От: hardcase Пират http://nemerle.org
Дата: 03.01.11 11:25
Оценка:
Здравствуйте, netch80, Вы писали:

L>>Вот простой практический пример:

L>>регэкс (x+x+)+y применяешь к данным xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx, и движку становится очень-очень плохо.

N>Попробовал. Питоновому (2.6) — поплохело. Перловому (5.10.1) — нет, даже когда я ещё в два раза больше иксов написал, чем ты предложил; вообще, его время оказалось линейным по длине образца в диапазоне до двух тысяч.


Мне казалось в Перле уже давно за "регекспами" прячется этот самый PEG. Народ, правда этого не замечает.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[9]: почему вы используете регулярные выражения?
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 03.01.11 12:19
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Здравствуйте, netch80, Вы писали:


L>>>Вот простой практический пример:

L>>>регэкс (x+x+)+y применяешь к данным xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx, и движку становится очень-очень плохо.

N>>Попробовал. Питоновому (2.6) — поплохело. Перловому (5.10.1) — нет, даже когда я ещё в два раза больше иксов написал, чем ты предложил; вообще, его время оказалось линейным по длине образца в диапазоне до двух тысяч.


H>Мне казалось в Перле уже давно за "регекспами" прячется этот самый PEG. Народ, правда этого не замечает.


PEG это все таки нотация, как и regexp. PEG содержит регулярное подмножество, которое может быть разобрано за линейное время, regexp далеко не всегда преобразуется в КА, особенно с расширениями, поэтому часто работает с откатами (а в перле и подавно). Просто народ знает название regexp и не знает названия peg.
Re[10]: почему вы используете регулярные выражения?
От: Klatu  
Дата: 03.01.11 12:24
Оценка: :)
Здравствуйте, gandjustas, Вы писали:

G>PEG это все таки нотация, как и regexp.


Не только, это еще и способ парсинга. Рекурсивный спуск с неограниченным look-ahead. И поскольку там есть откаты, то написать экспоненциальную грамматику тоже при большом желании можно.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[11]: почему вы используете регулярные выражения?
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 03.01.11 12:26
Оценка:
Здравствуйте, Klatu, Вы писали:

K>Здравствуйте, gandjustas, Вы писали:


G>>PEG это все таки нотация, как и regexp.


K>Не только, это еще и способ парсинга. Рекурсивный спуск с неограниченным look-ahead. И поскольку там есть откаты, то написать экспоненциальную грамматику тоже при большом желании можно.


Еще раз:

G>>PEG содержит регулярное подмножество, которое может быть разобрано за линейное время, regexp далеко не всегда преобразуется в КА, особенно с расширениями, поэтому часто работает с откатами (а в перле и подавно).


Стоило бы прочитать дальше первого предложения.
Re[12]: почему вы используете регулярные выражения?
От: Klatu  
Дата: 03.01.11 12:32
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>Стоило бы прочитать дальше первого предложения.


Это тебе бы стоило почитать, что такое PEG, чтобы больше не пороть такую ересь.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[13]: почему вы используете регулярные выражения?
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 03.01.11 12:37
Оценка:
Здравствуйте, Klatu, Вы писали:

K>Здравствуйте, gandjustas, Вы писали:


G>>Стоило бы прочитать дальше первого предложения.


K>Это тебе бы стоило почитать, что такое PEG, чтобы больше не пороть такую ересь.


Данивопрос:

A parsing expression grammar, or PEG, is a type of analytic formal grammar, i.e. it describes a formal language in terms of a set of rules for recognizing strings in the language.


Из википедии.
Re[14]: почему вы используете регулярные выражения?
От: Klatu  
Дата: 03.01.11 12:45
Оценка: -1
Здравствуйте, gandjustas, Вы писали:

G>Из википедии.


Ну ты дальше читай, дальше. PEG парсится не за линейное время, а (в худшем случае) за экспоненциальное. Ровно так же, как и регэкс. Линейность там достигается с помощью кэширования подстрок, но в этом случае получается экспоненциальный рост памяти в худшем случае — что редьки не слаще
И PEG описывает более мощный класс грамматик, чем регэксы.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[15]: почему вы используете регулярные выражения?
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 03.01.11 12:54
Оценка:
Здравствуйте, Klatu, Вы писали:

K>Здравствуйте, gandjustas, Вы писали:


G>>Из википедии.


K>Ну ты дальше читай, дальше. PEG парсится не за линейное время, а (в худшем случае) за экспоненциальное. Ровно так же, как и регэкс. Линейность там достигается с помощью кэширования подстрок, но в этом случае получается экспоненциальный рост памяти в худшем случае — что редьки не слаще

K>И PEG описывает более мощный класс грамматик, чем регэксы.

Ладно, еще раз:

G>>PEG содержит регулярное подмножество, которое может быть разобрано за линейное время, regexp далеко не всегда преобразуется в КА, особенно с расширениями, поэтому часто работает с откатами (а в перле и подавно).


Прочитай внимательно.
Re[16]: почему вы используете регулярные выражения?
От: Klatu  
Дата: 03.01.11 13:06
Оценка: -1
Здравствуйте, gandjustas, Вы писали:

G>Прочитай внимательно.


Ну и я тебе напомню:

G>PEG это все таки нотация, как и regexp.

Не только, это еще и способ парсинга. Рекурсивный спуск с неограниченным look-ahead. И поскольку там есть откаты, то написать экспоненциальную грамматику тоже при большом желании можно.

чего ты возбухаешь то?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[15]: почему вы используете регулярные выражения?
От: WolfHound  
Дата: 03.01.11 15:09
Оценка:
Здравствуйте, Klatu, Вы писали:

K>Ну ты дальше читай, дальше. PEG парсится не за линейное время, а (в худшем случае) за экспоненциальное. Ровно так же, как и регэкс. Линейность там достигается с помощью кэширования подстрок, но в этом случае получается экспоненциальный рост памяти в худшем случае — что редьки не слаще

Не правильно. Packrat разбирает текст за линейное время и ест линейное колличество памяти.
Правда от того что память кушается линейно легче не становится ибо кушается ее очень много.
Плюс ее нужно еще перелопатить что тоже время.
Так что на практике эффективнее использовать потенциально экспоненциальный алгоритм с запоминанием только последней попытки распарсить правило. Ну и про всякую магию типа генерации конечных автоматов где возможно забывать не стоит.
Это я тебе как автор Nemerle.Peg говорю.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[2]: почему вы используете регулярные выражения?
От: Mystic Украина http://mystic2000.newmail.ru
Дата: 03.01.11 16:16
Оценка:
Здравствуйте, Kerbadun, Вы писали:

K>2) Во многих случаях регулярных выражений достаточно, тем более, сейчас уже стали допиливать движки регулярных выражений до таких возможностей, что у них от регулярных выражений только название.


Это все синтаксический сахар, потому как все равно при разборе мы не выходим за пределы регулярных языков.
Re[3]: почему вы используете регулярные выражения?
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 03.01.11 16:39
Оценка: +1
Здравствуйте, Mystic, Вы писали:

M>Здравствуйте, Kerbadun, Вы писали:


K>>2) Во многих случаях регулярных выражений достаточно, тем более, сейчас уже стали допиливать движки регулярных выражений до таких возможностей, что у них от регулярных выражений только название.


M>Это все синтаксический сахар, потому как все равно при разборе мы не выходим за пределы регулярных языков.

Ты уверен?

Как раз картин обратная. Почти все движки поддерживают backreferences, которые выводят из класса регулярных языков. Возможности современных regexp гораздо шире.
Re[4]: почему вы используете регулярные выражения?
От: Mystic Украина http://mystic2000.newmail.ru
Дата: 03.01.11 17:04
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>Как раз картин обратная. Почти все движки поддерживают backreferences, которые выводят из класса регулярных языков. Возможности современных regexp гораздо шире.


Да, немного шире, выражение (a+)x+\1 таки нерегулярно. Но все равно, до КС-грамматик вроде не дотягивают. По крайней мере на такой регэксп (ab|a\1b) egrep матюкнулся: Invalid back reference
Re: почему вы используете регулярные выражения?
От: Mystic Украина http://mystic2000.newmail.ru
Дата: 03.01.11 17:12
Оценка:
Здравствуйте, lurrker, Вы писали:

L>И тем не менее, основная масса по прежнему использует регэксы. Почему??


Либы более доступны. Я, например, хочу юзать PEG. И? Откуда брать варианты для PHP, Delphi? Нет, LEX + YACC для Delphi можно найти, но очень громоздко все выходит. Ради того, чтобы распарсить дату или проверить e-mail вряд ли я буду его юзать.
Re: почему вы используете регулярные выражения?
От: olegkr  
Дата: 03.01.11 19:11
Оценка:
Здравствуйте, lurrker, Вы писали:

L>И тем не менее, основная масса по прежнему использует регэксы. Почему??

Патамушта регексп пишется в несколько строчек на сишарпе, а что бы использовать пег нужно сгенерить классы, включить их в проект, и только потом заюзать. Развлекуха еще та.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Re[2]: почему вы используете регулярные выражения?
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 03.01.11 20:48
Оценка:
O>Патамушта регексп пишется в несколько строчек на сишарпе, а что бы использовать пег нужно сгенерить классы, включить их в проект, и только потом заюзать. Развлекуха еще та.

peg — можно юзать и без генерации классов

например так
var peg = "expression := number (op number)*; op := '+' / '-' / '*' / '/'; number := d+;";
var parsed = peg_parse(peg, "34+17-44");
var numbers = parsed.all_items["number"];//выберет все числа
Re[3]: почему вы используете регулярные выражения?
От: olegkr  
Дата: 03.01.11 20:51
Оценка:
Здравствуйте, DarkGray, Вы писали:

DG>peg — можно юзать и без генерации классов

Это что за библиотека для дотнета?
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Re[4]: почему вы используете регулярные выражения?
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 03.01.11 21:16
Оценка:
O>Это что за библиотека для дотнета?

это из внутренних разработок
Re[5]: почему вы используете регулярные выражения?
От: olegkr  
Дата: 03.01.11 21:47
Оценка:
Здравствуйте, DarkGray, Вы писали:

O>>Это что за библиотека для дотнета?

DG>это из внутренних разработок
Я к тому, что насчет пега под дотнетом тут уже была дискуссия — сошлись на том, что по хорошему надо IL эмиттить. По трудозатратам задача такая, что всем вдруг стало лениво. Так что вы — монстры, для себя такое осилили, жаль, что в опенсорц не выпустили.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Re[6]: почему вы используете регулярные выражения?
От: hardcase Пират http://nemerle.org
Дата: 03.01.11 21:55
Оценка:
Здравствуйте, olegkr, Вы писали:

O>Я к тому, что насчет пега под дотнетом тут уже была дискуссия — сошлись на том, что по хорошему надо IL эмиттить. По трудозатратам задача такая, что всем вдруг стало лениво. Так что вы — монстры, для себя такое осилили, жаль, что в опенсорц не выпустили.


Дык, в опенсорце под дотнет уже есть — Nemerle.Peg. Бери да пользуй.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[7]: почему вы используете регулярные выражения?
От: olegkr  
Дата: 03.01.11 22:01
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Дык, в опенсорце под дотнет уже есть — Nemerle.Peg. Бери да пользуй.

Смущает в названии слово Nemerle
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Re[16]: почему вы используете регулярные выражения?
От: Klatu  
Дата: 04.01.11 08:12
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Не правильно. Packrat разбирает текст за линейное время и ест линейное колличество памяти.


А если в грамматике будут экспоненциальные откаты?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[17]: почему вы используете регулярные выражения?
От: WolfHound  
Дата: 04.01.11 09:24
Оценка: +1
Здравствуйте, Klatu, Вы писали:

WH>>Не правильно. Packrat разбирает текст за линейное время и ест линейное колличество памяти.

K>А если в грамматике будут экспоненциальные откаты?
Не важно.
Время работы Packrat O(N) потребление памяти O(M*N) где N размер разбираемого текста M колличество правил в грамматике.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[17]: почему вы используете регулярные выражения?
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 04.01.11 09:30
Оценка:
K>А если в грамматике будут экспоненциальные откаты?

из-за того, что промежуточные результаты парсинга запоминаются, а из свойств packrat-а следует, что применение конкретного правила к конкретной позиции — всегда выдает один и тот же результат (в независимости от предыдущих вызовов),
то выполнение не может быть хуже, чем: длина текста * кол-во правил
Re: почему вы используете регулярные выражения?
От: jazzer Россия Skype: enerjazzer
Дата: 04.01.11 09:31
Оценка: -1
Здравствуйте, lurrker, Вы писали:

L>Есть, например, PEG, который превосходит регэксы во всем.

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

L>Как минимум одно радикальное преимущество — это возможность делать декомпозицию.

регэксп — это строка. У тебя есть проблемы с композицией строк?
L>Что избавляет от необходимости писать такие вот жутики: http://stackoverflow.com/questions/2245282/what-is-the-longest-regular-expression-
you-have-seen
Такие жутики собираются из маленьких читабельных элементов.
Не говоря уже о библиотеках готовых регэкспов, у которых вполне себе объектно-ориентированный интерфейс.

L>Синтаксис приятнее, легче читается.

Куча движков регэкспов поддерживает встроенные комментарии, не говоря уже о конкатенации

L>И тем не менее, основная масса по прежнему использует регэксы. Почему??

Потому что они удобнее и работают везде.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[2]: почему вы используете регулярные выражения?
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 04.01.11 10:15
Оценка:
J>в пег нет бэкреференсов. И это только парсинг, нет синтаксиса для замены/подстановки.
J>А найти+заменить — это главная задача, для которой используются регэкспы.

в peg-е все правила именованы, поэтому для доступа к распарсенному тексту можно использовать xpath (подмножество xpath).

var grammar = @"
      expression := and-expression;
      and-expression := or-expression ( S* and-op S* or-expression) *;
      or-expression := equal-expression ( S* or-op S* equal-expression) *; 
      equal-expression :=  sum-expression ( S* equal-op S* sum-expression) *;  
      sum-expression := multiply-expression ( S+ sum-op S+ multiply-expression)*;
      multiply-expression := expression-or-number ( S+ multiply-op S+ expression-number) *;         
      expression-or-number := ('(' S* expression S* ')') / number;

      and-op := '&&';
      or-op := '||';
      equal-op := '*=*' / '*=' / '=*' / '==' / '!=' / '<=' / '>=' / '<' / '>';
      multiply-op := '*' / '/';
      sum-op := '+' / '-';

      number := [0-9]+;
";

var parsed = peg_parse(grammar, "(1 + 2) * 4");
var numbers = parsed.all_items["number"];//search: найдет все номера

//replace: заменяем все сложения на вычитание
foreach (var sum_op in parsed.all_items["sum-expression"].item["sum-op"])
{
  if (sum_op.text == "+")
   sum_op.new_text = "-";
}
Console.WriteLine(parsed);//выдаст (1 - 2) * 4
Re[3]: почему вы используете регулярные выражения?
От: jazzer Россия Skype: enerjazzer
Дата: 04.01.11 11:34
Оценка:
Здравствуйте, DarkGray, Вы писали:

J>>в пег нет бэкреференсов. И это только парсинг, нет синтаксиса для замены/подстановки.

J>>А найти+заменить — это главная задача, для которой используются регэкспы.

DG>в peg-е все правила именованы, поэтому для доступа к распарсенному тексту можно использовать xpath (подмножество xpath).


Это я вижу какой-то шарповский код какой-то неизвестной библиотеки.
Вполне допускаю, что такая библиотека есть, правда, я впервые о ней слышу...

Да и к тому же на обычных задачах задание полноценной грамматики — это оверкилл.
Попробуй сам сравнить стандартные перловые регэксповые one-liners с тем, что у тебя получится на пеге, пусть даже на твоей библиотеке.

Ну и бэк-референсов нету
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re: почему вы используете регулярные выражения?
От: Pzz Россия https://github.com/alexpevzner
Дата: 04.01.11 11:38
Оценка:
Здравствуйте, lurrker, Вы писали:

L>Есть, например, PEG, который превосходит регэксы во всем.


В принципе, никто не заставляет регекспы иметь иметь именно тот уродский синтаксис, который они имеют. Например, вполне можно было бы себе представить регекспы с BNF-образным синтаксисом.
Re[4]: почему вы используете регулярные выражения?
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 04.01.11 12:55
Оценка:
J>Да и к тому же на обычных задачах задание полноценной грамматики — это оверкилл.

не встречал таких задач.
подмножество же для записи простых правил совпадает и в regexp-ах, и в peg-е.

отличаются лишь правила композиции, но в peg-е правила композиции записываются более культурно


J>Попробуй сам сравнить стандартные перловые регэксповые one-liners с тем, что у тебя получится на пеге, пусть даже на твоей библиотеке.


приведи какие-нибудь примеры regexp-ов, которые ты считаешь, что они будут плохо выглядеть на peg-е
сравним обе записи


J>Ну и бэк-референсов нету


для чего они применяются?
Re[3]: почему вы используете регулярные выражения?
От: Mystic Украина http://mystic2000.newmail.ru
Дата: 04.01.11 13:24
Оценка:
Здравствуйте, DarkGray, Вы писали:

J>>в пег нет бэкреференсов. И это только парсинг, нет синтаксиса для замены/подстановки.

J>>А найти+заменить — это главная задача, для которой используются регэкспы.

DG>в peg-е все правила именованы, поэтому для доступа к распарсенному тексту можно использовать xpath (подмножество xpath).


А как, например, килять пробелы и комментарии?
Re[3]: почему вы используете регулярные выражения?
От: hardcase Пират http://nemerle.org
Дата: 04.01.11 13:36
Оценка:
Здравствуйте, DarkGray, Вы писали:

DG>в peg-е все правила именованы, поэтому для доступа к распарсенному тексту можно использовать xpath (подмножество xpath).


Странная логика. Какая там мистическая связь именованых правил и XML. Поясни на примере.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[4]: почему вы используете регулярные выражения?
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 04.01.11 13:37
Оценка:
DG>>в peg-е все правила именованы, поэтому для доступа к распарсенному тексту можно использовать xpath (подмножество xpath).

M>А как, например, килять пробелы и комментарии?


как этому мешает именованность?
Re[4]: почему вы используете регулярные выражения?
От: Ziaw Россия  
Дата: 04.01.11 13:48
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Здравствуйте, DarkGray, Вы писали:


DG>>в peg-е все правила именованы, поэтому для доступа к распарсенному тексту можно использовать xpath (подмножество xpath).


H>Странная логика. Какая там мистическая связь именованых правил и XML. Поясни на примере.


В результате разбора дерево получается, которое можно представить в виде xml. В таком виде к нему xpath вполне применим.
Re[5]: почему вы используете регулярные выражения?
От: jazzer Россия Skype: enerjazzer
Дата: 04.01.11 13:49
Оценка: 2 (2)
Здравствуйте, DarkGray, Вы писали:

J>>Да и к тому же на обычных задачах задание полноценной грамматики — это оверкилл.


DG>не встречал таких задач.

это как? А в редакторе ты что, никогда текст не ищешь? Или ты там пеги и XPath собираешься писать?

DG>подмножество же для записи простых правил совпадает и в regexp-ах, и в peg-е.

DG>отличаются лишь правила композиции, но в peg-е правила композиции записываются более культурно
для поиска-замены в редакторе любая композиция — уже оверкилл.
А для серьезного парсинга я не буду пользоваться голыми регэкспами в любом случае, и возьму нечто более подходящее, может быть, и тот же PEG.
Например, перловые библиотеки "типа регэкспов", которые являются полноценными парсерами и лишь по традиции до сих пор называются регэкспами:
http://search.cpan.org/dist/Regexp-Grammars-1.001005/lib/Regexp/Grammars.pm
или даже http://search.cpan.org/~ingy/Pegex-0.11/lib/Pegex.pm (парсинг PEG).
Или, если это С++ — Boost.Spirit, который, кстати, тоже реализует PEG (надмножество).

J>>Попробуй сам сравнить стандартные перловые регэксповые one-liners с тем, что у тебя получится на пеге, пусть даже на твоей библиотеке.


DG>приведи какие-нибудь примеры regexp-ов, которые ты считаешь, что они будут плохо выглядеть на peg-е

DG>сравним обе записи
ну не знаю
навскидку:
s/(class\s+\w+)\s*,\s*(class\s+\w+)/\2, \1/

меняет "class T, class U" на "class U, class T".

я не знаю, как такая замена будет выглядеть на пеге.

Или вот я недавно время из логов выкусывал, чтоб можно было два лога сравнить, не спотыкаясь на таймстэмпах.
время в формате hh:mm:ss.ssssss
на перле _весь_ процессинг занял вот такую строчку:
perl -i -pe 's/\d{2}:\d{2}:\d{2}\.\d{6}//g' file1 file2....


Причем численное значение, если оно нужно, достается не сложнее — лишь добавить скобочек:
($h,$m,$s) = m/(\d{2}):(\d{2}):(\d{2}\.\d{6})/; $t = $h*3600 + $m*60 + $s;


И таких вот однострочек я пишу по 20 штук на дню.

В этом, собственно, и сила регэкспов и перла как их пророка (но не только, так как большинство редакторов в том или ином виде регэкспы поддерживают) — это инструмент, для использования которого достаточно усилия спинного мозга: написал за минуту, получил результат и забыл.

J>>Ну и бэк-референсов нету

DG>для чего они применяются?
Для того, чтоб матчить повторяющиеся части.
Например, "std::basic_string<char, std::char_traits<char>, std::allocator<char> >"
Т.е. чтоб всех подобных крокодилов (только те, которые с тем же типом!) заменить на просто std::basic_string<XXX>, достаточно написать такую вот замену:
s/std::basic_string<(\w+), std::char_traits<\1>, std::allocator<\1> >/std::basic_string<\1>/
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[4]: почему вы используете регулярные выражения?
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 04.01.11 14:10
Оценка:
H>Странная логика. Какая там мистическая связь именованых правил и XML. Поясни на примере.

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

результатом разбора по любой грамматике является дерево, и благодаря тому, что все правила в peg-е именованы — дерево результата разбора по peg-грамматике тоже получается именованное.
Re[5]: почему вы используете регулярные выражения?
От: Mystic Украина http://mystic2000.newmail.ru
Дата: 04.01.11 14:57
Оценка:
Здравствуйте, DarkGray, Вы писали:

DG>>>в peg-е все правила именованы, поэтому для доступа к распарсенному тексту можно использовать xpath (подмножество xpath).

M>>А как, например, килять пробелы и комментарии?
DG>как этому мешает именованность?

Не то скопировал, скорее всего это просто вопрос, как расширить пример пример. Все-таки писать spaces := [ ]*; и вставлять его везде грустно.
Re[6]: почему вы используете регулярные выражения?
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 04.01.11 15:07
Оценка:
DG>>не встречал таких задач.
J>это как? А в редакторе ты что, никогда текст не ищешь? Или ты там пеги и XPath собираешься писать?

т.е. мы перескочили к прикладной, да к тому же интерактивной задаче?
у прикладных интерактивных задачах свои правила, как их сделать удобными.

если делать такую задачу удобной, то речь будет идти, как минимум, о:
а) о введении предопределенных термов (number, word, line, S(пробельный символ) и т.д.)
b) rich command line с intellisense-ом
c) instant-search
d) автоматическое распознавание: вводятся термы или подстрока из текста
и т.д.

DG>>приведи какие-нибудь примеры regexp-ов, которые ты считаешь, что они будут плохо выглядеть на peg-е

DG>>сравним обе записи
J>ну не знаю
J>навскидку:
J>
J>s/(class\s+\w+)\s*,\s*(class\s+\w+)/\2, \1/
J>

J>меняет "class T, class U" на "class U, class T".

если не вводить доп. синтаксис для замены, то так:
var grammar = @"
query := class S* ',' S* class;
class := 'class' S+ word;
";
var parsed = peg_parse(grammar, text);
parsed.all_items["class"][0].new_text = parsed.all_items["class"][1];
parsed.all_items["class"][1].new_text = parsed.all_items["class"][0];
return parsed.ToString();




J>я не знаю, как такая замена будет выглядеть на пеге.


J>Или вот я недавно время из логов выкусывал, чтоб можно было два лога сравнить, не спотыкаясь на таймстэмпах.

J>время в формате hh:mm:ss.ssssss
J>на перле _весь_ процессинг занял вот такую строчку:
J>
J>perl -i -pe 's/\d{2}:\d{2}:\d{2}\.\d{6}//g' file1 file2....
J>


тоже самое и будет, если добавить чуть сахара для замены
var grammar = @"
query := (timestamp / .)*;
timestamp := d{2} ':' d{2} ':' d{2} '.' d{6};
";
return peg_parse(grammar, text).replace(new{timestamp=""}).ToString();


J>Причем численное значение, если оно нужно, достается не сложнее — лишь добавить скобочек:

J>
J>($h,$m,$s) = m/(\d{2}):(\d{2}):(\d{2}\.\d{6})/; $t = $h*3600 + $m*60 + $s;
J>


var grammar = @"
query := (timestamp / .)*;
timestamp := hour ':' minute ':' second '.' d{6};
hour := d{2};
minute := d{2};
second := d{2};
";
var parsed = peg_parse(grammar, text);
foreach (var timestamp in parsed.all_items["timestamp"])
{
  var time = timestamp.item["hour"].ToInt() * 3600 + timestamp.item["minute"].ToInt() * 60 + timestamp.item["second"].ToInt();
}



J>И таких вот однострочек я пишу по 20 штук на дню.


J>В этом, собственно, и сила регэкспов и перла как их пророка (но не только, так как большинство редакторов в том или ином виде регэкспы поддерживают) — это инструмент, для использования которого достаточно усилия спинного мозга: написал за минуту, получил результат и забыл.


сила перла(+regexp-ов) получается в компактности записи, но за это приходится расплачиваться тем, что запись получается write-only.
это хорошо, если нужна одноразовое действие, но неудобно — если это код, который надо поддерживать годами.

J>>>Ну и бэк-референсов нету

DG>>для чего они применяются?
J>Для того, чтоб матчить повторяющиеся части.
J>Например, "std::basic_string<char, std::char_traits<char>, std::allocator<char> >"
J>Т.е. чтоб всех подобных крокодилов (только те, которые с тем же типом!) заменить на просто std::basic_string<XXX>, достаточно написать такую вот замену:
J>
J>s/std::basic_string<(\w+), std::char_traits<\1>, std::allocator<\1> >/std::basic_string<\1>/
J>


в принципе, это можно ввести в peg, посмотрю что можно сделать.
Re[6]: почему вы используете регулярные выражения?
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 04.01.11 15:27
Оценка:
M>Не то скопировал, скорее всего это просто вопрос, как расширить пример пример. Все-таки писать spaces := [ ]*; и вставлять его везде грустно.

есть такое, но это уже если peg противопоставлять парсингу, где есть разделение на лексер и парсер.

это эмулируется через комбинирование двух разборов:
var lexer_grammar = @"
  all := (literal / comment / S / .)*;
  literal := ('""' (!'""' .)*  '""') / (""'"" (!""'"" .)*  ""'"");
  S := [ \t] / line-break;
  comment := '//' (!line-break .)* line-break;
  line-break := ([\r][\n]) / [\r] / [\n];
";

var grammar = @"number ( op number )*";

var parsed = peg_parse(lexer_grammar, "12 + 45/10").replace(new{S=""}).parse(grammar);


если при этом peg-парсер умеет ходить по ранее разобранному дереву, то overhead будет достаточно низким
Re[18]: почему вы используете регулярные выражения?
От: Klatu  
Дата: 06.01.11 08:57
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Время работы Packrat O(N) потребление памяти O(M*N) где N размер разбираемого текста M колличество правил в грамматике.


А, понял.
Как оно обычно реализуется? Просто тупо матрица M*N?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[19]: почему вы используете регулярные выражения?
От: hardcase Пират http://nemerle.org
Дата: 06.01.11 10:50
Оценка: +1
Здравствуйте, Klatu, Вы писали:

K>А, понял.

K>Как оно обычно реализуется? Просто тупо матрица M*N?

Пакрат обычно не реализуется вообще — он дико медленный
Используется частичная мемоизация в некотором виде: либо наиболее частые правила, либо только последнее применение правила, либо что-то еще.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[20]: почему вы используете регулярные выражения?
От: Klatu  
Дата: 07.01.11 05:07
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Пакрат обычно не реализуется вообще — он дико медленный


Интересно, почему так получается?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: почему вы используете регулярные выражения?
От: mrTwister Россия  
Дата: 10.01.11 08:49
Оценка: -1
Здравствуйте, lurrker, Вы писали:

L>Есть, например, PEG, который превосходит регэксы во всем.

L>Как минимум одно радикальное преимущество — это возможность делать декомпозицию. Что избавляет от необходимости писать такие вот жутики: http://stackoverflow.com/questions/2245282/what-is-the-longest-regular-expression-you-have-seen
L>Синтаксис приятнее, легче читается.
L>И тем не менее, основная масса по прежнему использует регэксы. Почему??

Например, потому что под .NET (C#) нет ни одной доступной вменяемой библиотеки. Во всяком случае, я не нашел. Все, что есть — УГ
А регэкспы всегда под рукой, работают мегабыстро, и все возможные грабли уже давно втоптаны в землю.
лэт ми спик фром май харт
Re[2]: почему вы используете регулярные выражения?
От: WolfHound  
Дата: 10.01.11 14:27
Оценка:
Здравствуйте, mrTwister, Вы писали:

T>Например, потому что под .NET (C#) нет ни одной доступной вменяемой библиотеки. Во всяком случае, я не нашел. Все, что есть — УГ

Есть отличный ПЕГ для немерле.

T>А регэкспы всегда под рукой, работают мегабыстро, и все возможные грабли уже давно втоптаны в землю.

На RSDN одно время была DoS уязвимость из-за того что "мегабыстрые регексы у которых все грабли втоптаны в землю" начинали дико тормозить при раскраске одного из сообщений.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[3]: почему вы используете регулярные выражения?
От: mrTwister Россия  
Дата: 10.01.11 14:36
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, mrTwister, Вы писали:


T>>Например, потому что под .NET (C#) нет ни одной доступной вменяемой библиотеки. Во всяком случае, я не нашел. Все, что есть — УГ

WH>Есть отличный ПЕГ для немерле.
А у Абрамовича есть отличный футбольный клуб. Я за него тоже рад!

T>>А регэкспы всегда под рукой, работают мегабыстро, и все возможные грабли уже давно втоптаны в землю.

WH> На RSDN одно время была DoS уязвимость из-за того что "мегабыстрые регексы у которых все грабли втоптаны в землю" начинали дико тормозить при раскраске одного из сообщений.
И что?
лэт ми спик фром май харт
Re[3]: почему вы используете регулярные выражения?
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 10.01.11 14:38
Оценка: +1
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, mrTwister, Вы писали:


T>>Например, потому что под .NET (C#) нет ни одной доступной вменяемой библиотеки. Во всяком случае, я не нашел. Все, что есть — УГ

WH>Есть отличный ПЕГ для немерле.

И как его вызвать из C#?

T>>А регэкспы всегда под рукой, работают мегабыстро, и все возможные грабли уже давно втоптаны в землю.

WH> На RSDN одно время была DoS уязвимость из-за того что "мегабыстрые регексы у которых все грабли втоптаны в землю" начинали дико тормозить при раскраске одного из сообщений.

Чёрт. Подробнее. Я хочу понять, _как_ можно так писать, чтобы раскрашивать сообщения регэкспами. А то моя фантазия ничего кроме пересушенной MJ не предлагает.
The God is real, unless declared integer.
Re[4]: почему вы используете регулярные выражения?
От: WolfHound  
Дата: 10.01.11 15:33
Оценка:
Здравствуйте, netch80, Вы писали:

WH>>Есть отличный ПЕГ для немерле.

N>И как его вызвать из C#?
Также как и из любого другого .НЕТ языка.
Собрал ДЛЛку на немерле и пользуйся сколько угодно.
А если учесть что немерле научился компилировать C#...

N>Чёрт. Подробнее. Я хочу понять, _как_ можно так писать, чтобы раскрашивать сообщения регэкспами. А то моя фантазия ничего кроме пересушенной MJ не предлагает.

По сути проблемы сказать нечего?
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[4]: почему вы используете регулярные выражения?
От: WolfHound  
Дата: 10.01.11 15:33
Оценка:
Здравствуйте, mrTwister, Вы писали:

T>А у Абрамовича есть отличный футбольный клуб. Я за него тоже рад!

Завидно да?

T>И что?

И то что ты врешь или как минимум заблуждаешься на счет скорости и отсутствия граблей.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[5]: почему вы используете регулярные выражения?
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 10.01.11 15:39
Оценка: -2
Здравствуйте, WolfHound, Вы писали:

N>>Чёрт. Подробнее. Я хочу понять, _как_ можно так писать, чтобы раскрашивать сообщения регэкспами. А то моя фантазия ничего кроме пересушенной MJ не предлагает.

WH>По сути проблемы сказать нечего?

По сути я уже сказал — если применять инструмент не по назначению, можно много интересного получить. Но бесполезного.
The God is real, unless declared integer.
Re[6]: почему вы используете регулярные выражения?
От: WolfHound  
Дата: 10.01.11 15:41
Оценка:
Здравствуйте, netch80, Вы писали:

N>По сути я уже сказал — если применять инструмент не по назначению, можно много интересного получить. Но бесполезного.

Что значит не по назначению?
А что за назначения у регексов как не текст разбирать?
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[5]: почему вы используете регулярные выражения?
От: mrTwister Россия  
Дата: 10.01.11 15:45
Оценка: -1
Здравствуйте, WolfHound, Вы писали:

T>>И что?

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

WH>отсутствия граблей.

Я ничего не говорил про отсутствие граблей. Я говорил, что на них уже наступили очень много раз и это преимущество.
лэт ми спик фром май харт
Re[6]: почему вы используете регулярные выражения?
От: WolfHound  
Дата: 10.01.11 16:25
Оценка:
Здравствуйте, mrTwister, Вы писали:

T>Ну это общеизвестный факт, что фигню можно написать, используя любую технологию.

Факт в том что на регексах не фигню написать нельзя.
Ну разве что что-то очень простое и маленькое.

T>Я ничего не говорил про отсутствие граблей. Я говорил, что на них уже наступили очень много раз и это преимущество.

Грабли нужно не документировать, а исправлять.
А у регексов грабли бай дизайн и не лечаться.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[7]: почему вы используете регулярные выражения?
От: mrTwister Россия  
Дата: 10.01.11 17:15
Оценка:
Здравствуйте, WolfHound, Вы писали:

T>>Ну это общеизвестный факт, что фигню можно написать, используя любую технологию.

WH>Факт в том что на регексах не фигню написать нельзя.
WH>Ну разве что что-то очень простое и маленькое.
Это ты загнул.

T>>Я ничего не говорил про отсутствие граблей. Я говорил, что на них уже наступили очень много раз и это преимущество.

WH>Грабли нужно не документировать, а исправлять.
WH>А у регексов грабли бай дизайн и не лечаться.
Документированные неисправленные грабли лучше, чем недокументированные неисправленные.
лэт ми спик фром май харт
Re[8]: почему вы используете регулярные выражения?
От: WolfHound  
Дата: 10.01.11 17:23
Оценка: 1 (1)
Здравствуйте, mrTwister, Вы писали:

WH>>Ну разве что что-то очень простое и маленькое.

T>Это ты загнул.
Скорость работы не предсказуемая. Читаемость нулевая.

T>Документированные неисправленные грабли лучше, чем недокументированные неисправленные.

1)С чего ты взял что все грабли регексов документированы?
2)Грабли регексов принципиально не исправимы. Что ты не делай но они всеравно будут.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[9]: почему вы используете регулярные выражения?
От: mrTwister Россия  
Дата: 10.01.11 19:17
Оценка: -1 :))
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, mrTwister, Вы писали:


WH>>>Ну разве что что-то очень простое и маленькое.

T>>Это ты загнул.
WH>Скорость работы не предсказуемая. Читаемость нулевая.
А чем предсказуемость скорости работы PEG лучше, чем у регэкспов? У последних хотя бы есть солидный опыт применения.

T>>Документированные неисправленные грабли лучше, чем недокументированные неисправленные.

WH>1)С чего ты взял что все грабли регексов документированы?
С того, что им 100 лет в обед.

WH>2)Грабли регексов принципиально не исправимы. Что ты не делай но они всеравно будут.

Ну и фиг с ними. Задачи, на которых эти грабли играют существенную роль встречаются не так часто и есть старые проверенные специализированные утилиты для их решения.
лэт ми спик фром май харт
Re[5]: почему вы используете регулярные выражения?
От: olegkr  
Дата: 10.01.11 20:42
Оценка: +1
Здравствуйте, WolfHound, Вы писали:

WH>Собрал ДЛЛку на немерле и пользуйся сколько угодно.

Собери, выложи пример использования из C#
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Re[6]: почему вы используете регулярные выражения?
От: WolfHound  
Дата: 10.01.11 22:26
Оценка:
Здравствуйте, olegkr, Вы писали:

O>Собери, выложи пример использования из C#

Пишем парсер на немерле.
Подключаем к проекту на C#.
Используем.

Ты что никогда не видел как используют класс описанный в другой ДЛЛ?
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[10]: почему вы используете регулярные выражения?
От: WolfHound  
Дата: 10.01.11 22:26
Оценка:
Здравствуйте, mrTwister, Вы писали:

T>А чем предсказуемость скорости работы PEG лучше, чем у регэкспов? У последних хотя бы есть солидный опыт применения.

Хотябы тем что откаты ограничены.

T>С того, что им 100 лет в обед.



T>Ну и фиг с ними. Задачи, на которых эти грабли играют существенную роль встречаются не так часто и есть старые проверенные специализированные утилиты для их решения.

И как же ты собираешься этими утилитами чинить фундаментально не устранимые тормоза?
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[7]: почему вы используете регулярные выражения?
От: olegkr  
Дата: 10.01.11 22:33
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Пишем парсер на немерле.

Получаем по морде от манагера, ибо "это не в нашем командном духе, другие не смогут поддерживать этот код" и прочее. Кроме того с тем же успехом генериться код на сишарпе по пеговскому файлу. С регекспами удобно то, что они в несколько строчек используются без бубна и подпрыгивания.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Re[8]: почему вы используете регулярные выражения?
От: WolfHound  
Дата: 10.01.11 22:51
Оценка:
Здравствуйте, olegkr, Вы писали:

WH>>Пишем парсер на немерле.

O>Получаем по морде от манагера, ибо "это не в нашем командном духе, другие не смогут поддерживать этот код" и прочее.
Меня просто убивает это аргумент.
Он означает что манагер держит разработчиков за тупых обезьян.
Которые простейший код понять не могут.
Тебе может и всеравно но я не собираюсь заниматься monkey driven development'ом.

O>Кроме того с тем же успехом генериться код на сишарпе по пеговскому файлу.

Далеко не с темже.
1)Нет интеграции в студию.
2)Хреновые сообщения об ошибках.

O>С регекспами удобно то, что они в несколько строчек используются без бубна и подпрыгивания.

И получаем тормоза во всех случаях кроме совсем тривиальных.
А если вдруг в грамматике появляется рекурсия то регексы просто сразу идут в печку.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[9]: почему вы используете регулярные выражения?
От: olegkr  
Дата: 10.01.11 23:02
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Тебе может и всеравно но я не собираюсь заниматься monkey driven development'ом.

Поздравляю!

WH>1)Нет интеграции в студию.

WH>2)Хреновые сообщения об ошибках.
По сравнению с тем, что код написан на немерле — это мелочи.

WH>И получаем тормоза во всех случаях кроме совсем тривиальных.

WH>А если вдруг в грамматике появляется рекурсия то регексы просто сразу идут в печку.
Когда это актуально можно и по пегу сишарп сгенерить. Обычно неактуально, вот пег и не используется.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Re[9]: почему вы используете регулярные выражения?
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 10.01.11 23:23
Оценка:
WH>2)Хреновые сообщения об ошибках.

почему?
Re[10]: почему вы используете регулярные выражения?
От: WolfHound  
Дата: 10.01.11 23:55
Оценка: +1
Здравствуйте, DarkGray, Вы писали:

WH>>2)Хреновые сообщения об ошибках.

DG>почему?
По тому что текстовый препроцессор не может давать хорошие сообщения об ошибках.
Просто по тому что не понямает того что написано в обработчиках.
В случае с Nemerle.Peg у меня есть полная информация о типах и могу проверить сигнатуру побработчика и выдать вменяемое сообщение об ошибке.
Вот например я поменял у одного из обработчиков сигнатуру.
Поставил string вместо int:
CalcParser.n(130,41):Error: The parameter "se" has wrong type string (need type int).
CalcParser.n(105,5):Error: You need define method-handler with signature: parenthesesExpr(_ : Nemerle.Peg.NToken, _ : int, _ : Nemerle.Peg.NToken) : int

Что тебе на это текстовый препроцессор скажет?
Правильно ничего.
Но потом тебе придется смотреть на сгенерированный код и пытаться понять что там не так.

А в моем случае прямо в IDE во время редактирования ошибки подсвечиваются.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[10]: почему вы используете регулярные выражения?
От: WolfHound  
Дата: 10.01.11 23:55
Оценка:
Здравствуйте, olegkr, Вы писали:

O>Поздравляю!

Ну то есть ты признаешь что занимаешься monkey driven development'ом.
Сочувствую.

O>По сравнению с тем, что код написан на немерле — это мелочи.

И что же такого страшного в немерле?
Почему он хуже чем например Coco/R или ANTLR?

O>Когда это актуально можно и по пегу сишарп сгенерить.

Те рукопашный велосипед который нужно поддерживать и развивать лучше чем отлаженное и проверенное на очень сложных грамматиках (C#4) решение?
МДД во всей красе.
Да и скорость разбора ты такую не получишь. Ибо я очень много времени потратил на то чтобы ускорить парсер.
Например сколько времени у тебя уйдет на автоматическую генерацию минимальных конечных автоматов для "лексерных" правил? Не забывая про то что приходится иметь дело с юникодом.
А ты знаешь как сделать мемоизацию которая будет ускорять разбор, а не тормозить его?
А как ты собераешься выдавать пользователю сообщения об ошибках?
А как ты собераешься делать востановление после ошибок?

Ну и еще не забывай про такую мелочь как интеграция в IDE. Подсветка синтаксиса, подсветка ошибок прямо во время редактирования, навигация,...

O>Обычно неактуально, вот пег и не используется.

Обычно регексы не нужны. Я ими по делу только логи grep'ал.
Но вот как только появляется что-то сложнее лога то регексов уже становится мало.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[11]: почему вы используете регулярные выражения?
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 11.01.11 00:14
Оценка:
WH>По тому что текстовый препроцессор не может давать хорошие сообщения об ошибках.

про грамматику может, а вот про ошибки в обработчиках да не может, т.к. они обычно пишутся на целевом языке, а не на языке парсера.
Re[12]: почему вы используете регулярные выражения?
От: WolfHound  
Дата: 11.01.11 00:22
Оценка:
Здравствуйте, DarkGray, Вы писали:

DG>про грамматику может, а вот про ошибки в обработчиках да не может, т.к. они обычно пишутся на целевом языке, а не на языке парсера.

А у меня это один язык. Причем с поддержкой IDE что текстовым препроцессорам и не снилось ибо очень большой объем работы.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[13]: почему вы используете регулярные выражения?
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 11.01.11 00:35
Оценка:
WH>А у меня это один язык.

очень спорное утверждение.
Re[10]: почему вы используете регулярные выражения?
От: lurrker  
Дата: 11.01.11 05:05
Оценка:
Здравствуйте, netch80, Вы писали:

N>Адекватность интерпретации проверяется тестами. Покажи тест, который перловый движок выполняет иначе (то есть даёт другие результаты), чем положено по спецификации, и я соглашусь. Если нет — останусь при своём мнении.


Я сделаю даже лучше — напишу выражение, которое подвесит и перловый движок. Часть критических случаев они подхачили, но в общем случае это невозможно, ибо таково устройство регулярных выражений.
Например, вот так:
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxlmnopqrstuvwyz
^.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*l+m+n+o+p+q+r+s+t+u+v+w+y+z+$

Элементарно, Ватсон.

N>Зачэм груби, дарагой? Всего лишь прямолинейная констатация факта: ты не знал, что могут быть другие результаты, но настоял, что все движки без ограничения должны страдать от этого. Я показал живой, тривиально проверяемый пример — ты не соглашаешься — мол, он что-то нарушает.


А мне больше делать нечего — изучать хаки каждого конкретного движка из десятков существующих. Мне достаточно знать, что такая проблема присуща всем регэксам как классу. Любой регэкс движок можно подвесить, остальное — мелкие детали.

N>Почему бы тебе не предположить, что это именно ты что-то не знаешь, а не те умные и опытные ребята, что пишут Perl?


А почему бы тебе не попробовать думать своей головой?

N>Как мне кажется, регэкспы удобнее в подавляющем большинстве случаев.


Чем?

N>Зачем мне PEG? Он не даёт ничего нового...


Это у тебя просто от невежества.

N>Хорошо, явно задамся задачей именно оправдать применение PEG. Получается одна относительно специфическая задача — грамматический разбор текста с построением дерева разбора. Так?


Не так. PEG можно применять везде, где применяются регэксы, yacc, bison или antlr.

N>Отлично. Осталось понять, на кой аккредитив вообще тебе потребовалось показывать заведомо искусственный пример


Ты начал про это говорить. Али склероз мучает?

N>`.*' это удачная находка? Дело ваше, конечно, но я неоднократно слышал/читал жалобы именно на эту конструкцию как на "базовый кошмар" регэкспов.


Не то чтобы особо удачная, но зато привычная

N>Почему бы не взять вместо этого один из стандартных/распространённых синтаксисов BNF?


Предлагай варианты.
Re[11]: почему вы используете регулярные выражения?
От: lurrker  
Дата: 11.01.11 08:01
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>А ты знаешь как сделать мемоизацию которая будет ускорять разбор, а не тормозить его?


Интересно, из-за чего может получаться замедление? Может, просто реализация мемоизации не очень удачная?
Re[10]: почему вы используете регулярные выражения?
От: Воронков Василий Россия  
Дата: 11.01.11 10:58
Оценка: 1 (1)
Здравствуйте, netch80, Вы писали:

N>Зачэм груби, дарагой? Всего лишь прямолинейная констатация факта: ты не знал, что могут быть другие результаты, но настоял, что все движки без ограничения должны страдать от этого. Я показал живой, тривиально проверяемый пример — ты не соглашаешься — мол, он что-то нарушает. Почему бы тебе не предположить, что это именно ты что-то не знаешь, а не те умные и опытные ребята, что пишут Perl?


Ну в данном случае как раз вы ткнули пальцем в небо и "в защиту" регексов привели их реализацию, которая, собственно говоря, вообще не является регулярными выражениями. В Перле с помощью "регексов" можно выразить нерегулярную грамматику. Да, ребята там опытные, и они молодцы, но то, что они сделали регулярными выражениями не является уже просто по определению. И приводить их реализацию в защиту регексов несколько странно, не находите?

Now, Perl's regexps "aren't" -- that is, they aren't "regular" because backreferences per sed and grep are also supported, which renders the language no longer strictly regular and so forbids "pure" DFA implementations.


http://www.perl.com/doc/FMTEYEWTK/regexps.html
Re[20]: почему вы используете регулярные выражения?
От: Воронков Василий Россия  
Дата: 11.01.11 11:06
Оценка:
Здравствуйте, hardcase, Вы писали:

K>>А, понял.

K>>Как оно обычно реализуется? Просто тупо матрица M*N?
H>Пакрат обычно не реализуется вообще — он дико медленный

Почему? Идея пакрата, как я понимаю, это "мемоизируем все". Т.е. по идее это не должно бы приводить к "дико медленный". К тому же автор декларировал линейное время парсинга, откуда бы взяться тормозам?
Re[21]: почему вы используете регулярные выражения?
От: hardcase Пират http://nemerle.org
Дата: 11.01.11 12:18
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>Почему? Идея пакрата, как я понимаю, это "мемоизируем все". Т.е. по идее это не должно бы приводить к "дико медленный". К тому же автор декларировал линейное время парсинга, откуда бы взяться тормозам?


От линейного времени O(N) с большим коэффициентом N. Если мемоизировать все правила, то да, время будет линейным, но уж очень большим.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[7]: почему вы используете регулярные выражения?
От: Воронков Василий Россия  
Дата: 11.01.11 12:25
Оценка:
Здравствуйте, WolfHound, Вы писали:

O>>Собери, выложи пример использования из C#

WH>Пишем парсер на немерле.
WH>Подключаем к проекту на C#.
WH>Используем.
WH>Ты что никогда не видел как используют класс описанный в другой ДЛЛ?

Ну а как все же это выглядит? Грамматика передается в виде строки? И как работает сам ПЕГ? Генерирует что-то в райнтайме?
Re: почему вы используете регулярные выражения?
От: vsb Казахстан  
Дата: 11.01.11 12:27
Оценка: +1
Здравствуйте, lurrker, Вы писали:

L>Есть, например, PEG, который превосходит регэксы во всем.

L>Как минимум одно радикальное преимущество — это возможность делать декомпозицию. Что избавляет от необходимости писать такие вот жутики: http://stackoverflow.com/questions/2245282/what-is-the-longest-regular-expression-you-have-seen
L>Синтаксис приятнее, легче читается.
L>И тем не менее, основная масса по прежнему использует регэксы. Почему??

Потому что их хватает, чтобы решать мои задачи.
Re[22]: почему вы используете регулярные выражения?
От: Воронков Василий Россия  
Дата: 11.01.11 12:38
Оценка:
Здравствуйте, hardcase, Вы писали:

ВВ>>Почему? Идея пакрата, как я понимаю, это "мемоизируем все". Т.е. по идее это не должно бы приводить к "дико медленный". К тому же автор декларировал линейное время парсинга, откуда бы взяться тормозам?


H>От линейного времени O(N) с большим коэффициентом N. Если мемоизировать все правила, то да, время будет линейным, но уж очень большим.


А если мемоизировать не все, то будет быстрее линейнего что ли?

Мне интересно:
— Пакрат реально дает O(n) или это только в теории, а на практике это не O(n)? Если да, то почему так происходит.
— Если излишняя мемоизация вредна, но по каким критерием определяется, что мемоизировать, а что нет?
Re: почему вы используете регулярные выражения?
От: Socrat Россия  
Дата: 11.01.11 13:08
Оценка:
Здравствуйте, lurrker, Вы писали:

L>Есть, например, PEG, который превосходит регэксы во всем.

L>Как минимум одно радикальное преимущество — это возможность делать декомпозицию. Что избавляет от необходимости писать такие вот жутики: http://stackoverflow.com/questions/2245282/what-is-the-longest-regular-expression-you-have-seen
L>Синтаксис приятнее, легче читается.
L>И тем не менее, основная масса по прежнему использует регэксы. Почему??

А есть готовые библиотеки для C/C++?
Re[12]: почему вы используете регулярные выражения?
От: WolfHound  
Дата: 11.01.11 13:09
Оценка:
Здравствуйте, lurrker, Вы писали:

WH>>А ты знаешь как сделать мемоизацию которая будет ускорять разбор, а не тормозить его?

L>Интересно, из-за чего может получаться замедление? Может, просто реализация мемоизации не очень удачная?
Если парсер тормоз то мемоизацию сделать легко.
Но если весь код парсера вылизан то сделать мемоизацию которая работает быстрее чем разбор уже намного сложнее.

Вот собственно единственный не тормозящий варинт мемоизации который я придумал:
Правило:
namespaceMemberDeclarations : NamespaceNodeList = namespaceMemberDeclaration*;

Во что оно превращается:
//Это поля объекта грамматики
//Эти для мемоизации
private mutable mutable __GENERATED_PEG__Memeoize_Pos__namespaceMemberDeclarations__ : int

private mutable mutable __GENERATED_PEG__Memeoize_End__namespaceMemberDeclarations__ : int

private mutable mutable __GENERATED_PEG__Memeoize_Res__namespaceMemberDeclarations__ : list[CSharpParser.NamespaceNode]
//Это для сообщений об ошибках.
private mutable mutable __GENERATED_PEG__MaxRollback___namespaceMemberDeclarations__ : int
//Это собственно метод который разбирает описанное выше правило
private __GENERATED_PEG__RULE__namespaceMemberDeclarations__(pos : int, text : string, result : ref list[CSharpParser.NamespaceNode]) : int
{
  unchecked 
  {
    mutable (c : char);
    _  = c;
    
    {
      mutable token_1;
      if (__GENERATED_PEG__Memeoize_Pos__namespaceMemberDeclarations__ == pos) 
      {
        when (__GENERATED_PEG__Memeoize_End__namespaceMemberDeclarations__ >= 0) result = __GENERATED_PEG__Memeoize_Res__namespaceMemberDeclarations__;
        __GENERATED_PEG__Memeoize_End__namespaceMemberDeclarations__
      }; else 
      {
        def newPos = 
        {
          token_1 = SCG.List();
          mutable token_2;
          def rep (pos : int)  
          {
            def newPos = __GENERATED_PEG__RULE__namespaceMemberDeclaration__(pos, text, ref token_2);
            if (newPos >= 0) 
            {
              token_1.Add(token_2);
              rep(newPos)
            }; else pos
          } : _ ;
          rep(pos)
        };
        __GENERATED_PEG__Memeoize_Pos__namespaceMemberDeclarations__ = pos;
        __GENERATED_PEG__Memeoize_End__namespaceMemberDeclarations__ = newPos;
        if (newPos >= 0) 
        {
          result = namespaceMemberDeclarations(token_1);
          ();
          __GENERATED_PEG__Memeoize_Res__namespaceMemberDeclarations__ = result
        }; else when (__GENERATED_PEG__MaxRollback___namespaceMemberDeclarations__ < pos) __GENERATED_PEG__MaxRollback___namespaceMemberDeclarations__ = pos;
        newPos
      }
    }
  }
}
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[8]: почему вы используете регулярные выражения?
От: WolfHound  
Дата: 11.01.11 13:13
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>Ну а как все же это выглядит? Грамматика передается в виде строки? И как работает сам ПЕГ? Генерирует что-то в райнтайме?

Ну если ты любишь извращения то можно и так.
Генерируешь исходный код. Поднимаешь компилятор немерла и готово.
Вот только нормальный человек создат проект на немерле и получит интелесенс и море других плюшек.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[2]: почему вы используете регулярные выражения?
От: WolfHound  
Дата: 11.01.11 13:16
Оценка:
Здравствуйте, Socrat, Вы писали:

S>А есть готовые библиотеки для C/C++?

http://www.boost.org/doc/libs/1_45_0/libs/spirit/doc/html/index.html
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[13]: почему вы используете регулярные выражения?
От: lurrker  
Дата: 11.01.11 14:05
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Вот собственно единственный не тормозящий варинт мемоизации который я придумал:


Боюсь, что я этот ваш Немерле недостаточно понимаю
Можно объяснить идею словами?
Re[14]: почему вы используете регулярные выражения?
От: WolfHound  
Дата: 11.01.11 14:40
Оценка:
Здравствуйте, lurrker, Вы писали:

L>Боюсь, что я этот ваш Немерле недостаточно понимаю

А что там понимать? Он не так уж и сильно от C# отличается.

L>Можно объяснить идею словами?

Создаем в объекте парсера поля для запоминания только последнего применения правила.
И если это провило будет опять применено в тойже позиции то используем запомненный результат.
Это помогает вот в таких случаях
      constantDeclaration : TypeMember = attributes? modifiers? "const"S anyType constantDeclarators semicolon;

      fieldDeclaration    : TypeMember = attributes? modifiers? anyType variableDeclarators semicolon;

      methodDeclaration : TypeMember = attributes? modifiers? anyType typeMemberIdentifier typeParameterList? "("s formalParameterList? ")"s typeParameterConstraintsClauses? methodBody;

      propertyDeclaration     : TypeMember        = attributes? modifiers? anyType typeMemberIdentifier "{"s accessorDeclarations "}"s;

      eventDeclaration_1  : TypeMember = attributes? modifiers? "event"S anyType typeMemberIdentifier "{"s eventAccessorDeclarations "}"s;
      eventDeclaration_2  : TypeMember = attributes? modifiers? "event"S anyType variableDeclarators semicolon;
      eventDeclaration    : TypeMember = eventDeclaration_1 / eventDeclaration_2;

      indexerDeclaration  : TypeMember = attributes? modifiers? anyType (typeMemberIdentifier "."s)? "this"S "["s formalParameterList? "]"s "{"s accessorDeclarations "}"s;

      operatorDeclaration : TypeMember = attributes? modifiers? operatorDeclarator "("s formalParameterList? ")"s methodBody;

      constructorDeclaration : TypeMember = attributes? modifiers? identifier "("s formalParameterList? ")"s constructorInitializer? methodBody;

      destructorDeclaration  : TypeMember = attributes? modifiers? "~"s identifier "("s formalParameterList? ")"s methodBody;

      nestedTypeDeclaration  : TypeMember = typeDeclaration;

      typeMemberDeclaration  : TypeMember = methodDeclaration
                                          / propertyDeclaration 
                                          / fieldDeclaration
                                          / constantDeclaration
                                          / constructorDeclaration
                                          / eventDeclaration
                                          / operatorDeclaration
                                          / indexerDeclaration
                                          / destructorDeclaration
                                          / nestedTypeDeclaration
                                          / fixedSizeBufferDeclaration;

Обрати внимание все правила ничинаются с "attributes? modifiers?" соответственно эта пара правил будет разобрана один раз.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[11]: почему вы используете регулярные выражения?
От: olegkr  
Дата: 11.01.11 14:58
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Ну то есть ты признаешь что занимаешься monkey driven development'ом.

WH>Сочувствую.
Спасибо. Ты нереально крут, я тебе завидую.

WH>И что же такого страшного в немерле?

То, что для его использования в нормальном девелопмонте нужно прилагать нереальные усилия.

WH>Те рукопашный велосипед который нужно поддерживать и развивать лучше чем отлаженное и проверенное на очень сложных грамматиках (C#4) решение?

Этот "велосипед" встроен в дотнет фреймворк и работает более чем нормально для 99% применений. Велосипед — это немерле.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Re[9]: почему вы используете регулярные выражения?
От: olegkr  
Дата: 11.01.11 15:00
Оценка: +1
Здравствуйте, WolfHound, Вы писали:

WH>Вот только нормальный человек создат проект на немерле и получит интелесенс и море других плюшек.

Таких "нормальных" людей можно пересчитать по пальцам
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Re[12]: почему вы используете регулярные выражения?
От: WolfHound  
Дата: 11.01.11 15:09
Оценка:
Здравствуйте, olegkr, Вы писали:

WH>>И что же такого страшного в немерле?

O>То, что для его использования в нормальном девелопмонте нужно прилагать нереальные усилия.
А ты пробовал?

WH>>Те рукопашный велосипед который нужно поддерживать и развивать лучше чем отлаженное и проверенное на очень сложных грамматиках (C#4) решение?

O>Этот "велосипед" встроен в дотнет фреймворк и работает более чем нормально для 99% применений. Велосипед — это немерле.
Это генератор C# из ПЕГа?
Можешь показать где это он встроен в .НЕТ?
Или может ты хочешь изобразить мне разбор C#4 с построением AST на регексах? И так чтобы на современном железо оно работало со скоростью 4 метра в секунду?
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[13]: почему вы используете регулярные выражения?
От: olegkr  
Дата: 11.01.11 15:17
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>А ты пробовал?

Зачем мне это нужно? У меня есть выбор
1) Написать пару строк на дотнете, заюзав стандартный фреймворк
2) Поставить немерле, добавить новый проект в солюшн, изучить синтаксис, потрахаться, поругаться с менеджером, провести неделю в митингах с подчиненными индусами

Кто в здравом уме выберет пункт 2?

WH>Это генератор C# из ПЕГа?

Это обычный регексп, которого хватает на все сто. Объясни мне причины по которым я должен перейти не пег? Скорость парсинга и рекурсия меня не интересуют.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Re[14]: почему вы используете регулярные выражения?
От: WolfHound  
Дата: 11.01.11 15:29
Оценка:
Здравствуйте, olegkr, Вы писали:

O>Зачем мне это нужно? У меня есть выбор

O>1) Написать пару строк на дотнете, заюзав стандартный фреймворк
В пару строк парсер C#4? Ты крут. Покажи.

O>2) Поставить немерле, добавить новый проект в солюшн, изучить синтаксис, потрахаться, поругаться с менеджером, провести неделю в митингах с подчиненными индусами

А ну то есть МДД. Если тебе нарвится считать себя и своих коллег обезьянами то можешь продолжать. Мнея МДД не интересует.

O>Это обычный регексп, которого хватает на все сто. Объясни мне причины по которым я должен перейти не пег? Скорость парсинга и рекурсия меня не интересуют.

Не юли:

Когда это актуально можно и по пегу сишарп сгенерить.

(С)olegkr
Автор: olegkr
Дата: 11.01.11

Вот и покажи как ты по пегу собрался шарп генерить.
А потом результат сравним с моей технологией.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[15]: почему вы используете регулярные выражения?
От: olegkr  
Дата: 11.01.11 15:39
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>В пару строк парсер C#4? Ты крут. Покажи.

Зачем мне парсер сишарпа? У меня все примитивнее, всякие там валидейшены телефонов, емейлов и прочего хлама. Ну может строчки из файла на несколько килобайт разобрать. Мы ж не баре, мы простые крестьяне.

WH>А ну то есть МДД.

Извините барин, что постоял у вас в прихожей и накапал на коврик.

WH>Когда это актуально можно и по пегу сишарп сгенерить.

Можно, конечно

WH>Вот и покажи как ты по пегу собрался шарп генерить.

Да полно генераторов, одно время тестил, при этом нет геммороя с установкой немерлей всяких и разъяснений нафига это нужно.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Re[16]: почему вы используете регулярные выражения?
От: WolfHound  
Дата: 11.01.11 15:42
Оценка:
Здравствуйте, olegkr, Вы писали:

WH>>Вот и покажи как ты по пегу собрался шарп генерить.

O>Да полно генераторов, одно время тестил, при этом нет геммороя с установкой немерлей всяких и разъяснений нафига это нужно.
И чем же установка этих генераторов лучше чем установка намерла?
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[17]: почему вы используете регулярные выражения?
От: olegkr  
Дата: 11.01.11 15:44
Оценка: :))) :)
Здравствуйте, WolfHound, Вы писали:

WH>И чем же установка этих генераторов лучше чем установка намерла?

Тем, что код генерится сишарповский, которые понятен всем.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Re[16]: почему вы используете регулярные выражения?
От: Klatu  
Дата: 11.01.11 15:50
Оценка: +1 -1
Здравствуйте, olegkr, Вы писали:

O>Зачем мне парсер сишарпа? У меня все примитивнее, всякие там валидейшены телефонов, емейлов и прочего хлама.


Валидация емэйлов — не особо тривиальная задача. Регэкс на 6 кбайт, который упоминается в первом сообщении — он как раз для этого.
Хотя, если подумать, он действительно умещается в строку кода. Ну а то, что строка на 6 килобайт и никто кроме Джона Нэша не сможет ее прочитать — про это ты скромно умолчал?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[16]: почему вы используете регулярные выражения?
От: Ziaw Россия  
Дата: 11.01.11 15:54
Оценка:
Здравствуйте, olegkr, Вы писали:

O>Да полно генераторов, одно время тестил, при этом нет геммороя с установкой немерлей всяких и разъяснений нафига это нужно.


Обычно генератор подразумевает свой язык. Как инструмент они ничем не отличаются от nemerle. Хоть ANTLR, хоть Coco/R, у тебя в проекте появится код на их языке. И тебе придется что-то устанавливать, чтобы получить IDE для разработки. В чем отличия-то?
Re[18]: почему вы используете регулярные выражения?
От: WolfHound  
Дата: 11.01.11 15:57
Оценка:
Здравствуйте, olegkr, Вы писали:

WH>>И чем же установка этих генераторов лучше чем установка намерла?

O>Тем, что код генерится сишарповский, которые понятен всем.

Ты этот код хоть раз видел?
Это мегабайты кошмарного кода напичканного лапшой из goto и громадных условий в if'ах.
А в случае с немерлом на генереннй код вообще смотреть не надо. Я его печатаю только по тому что я макрос разрабатываю.
Макрос и так о всех ошибках расскажет.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[19]: почему вы используете регулярные выражения?
От: olegkr  
Дата: 11.01.11 15:59
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Ты этот код хоть раз видел?

Видел. Что дальше?
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Re[17]: почему вы используете регулярные выражения?
От: olegkr  
Дата: 11.01.11 16:00
Оценка:
Здравствуйте, Klatu, Вы писали:

K>Валидация емэйлов — не особо тривиальная задача. Регэкс на 6 кбайт, который упоминается в первом сообщении — он как раз для этого.

Это для извращенцев-перфекционистов
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Re[17]: почему вы используете регулярные выражения?
От: olegkr  
Дата: 11.01.11 16:00
Оценка:
Здравствуйте, Ziaw, Вы писали:

Z>Обычно генератор подразумевает свой язык. Как инструмент они ничем не отличаются от nemerle.

Только в случае немерле будет два языка
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Re[20]: почему вы используете регулярные выражения?
От: WolfHound  
Дата: 11.01.11 16:00
Оценка:
Здравствуйте, olegkr, Вы писали:

WH>>Ты этот код хоть раз видел?

O>Видел. Что дальше?
Сомневаюсь. Ибо понять то что там происходит не возможно.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[11]: почему вы используете регулярные выражения?
От: mrTwister Россия  
Дата: 11.01.11 16:47
Оценка: +1 -1 :))
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, mrTwister, Вы писали:


T>>А чем предсказуемость скорости работы PEG лучше, чем у регэкспов? У последних хотя бы есть солидный опыт применения.

WH>Хотябы тем что откаты ограничены.
Ну используй регекспы без откатов.

T>>С того, что им 100 лет в обед.

WH>

T>>Ну и фиг с ними. Задачи, на которых эти грабли играют существенную роль встречаются не так часто и есть старые проверенные специализированные утилиты для их решения.

WH> И как же ты собираешься этими утилитами чинить фундаментально не устранимые тормоза?

А с чего ты взял, что у меня что-то тормозит и мне срочно надо что-то чинить?
лэт ми спик фром май харт
Re[7]: почему вы используете регулярные выражения?
От: mrTwister Россия  
Дата: 11.01.11 17:06
Оценка: -1 :)
Здравствуйте, lurrker, Вы писали:


N>>Что-то не помню я такого, sorry. Ссылочку можно?


L>А зачем тебе ссылочку? Надеюсь, месье не теоретик?

L>Вот простой практический пример:
L>регэкс (x+x+)+y применяешь к данным xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx, и движку становится очень-очень плохо.

Под .NET все летает:

var regex = new Regex("(x+x+)+y", RegexOptions.Compiled | RegexOptions.RightToLeft);
regex.Match(string.Empty);
var stopWatch = new Stopwatch();
stopWatch.Start();
regex.Match("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
stopWatch.Stop();
Console.WriteLine("Elapsed milliseconds: " + stopWatch.ElapsedMilliseconds);
Console.WriteLine("Elapsed ticks: " + stopWatch.ElapsedTicks );


Результат:

Elapsed milliseconds: 0
Elapsed ticks: 4761
лэт ми спик фром май харт
Re[8]: почему вы используете регулярные выражения?
От: lurrker  
Дата: 11.01.11 17:55
Оценка:
Здравствуйте, mrTwister, Вы писали:

T>Под .NET все летает:


T>
T>var regex = new Regex("(x+x+)+y", RegexOptions.Compiled | RegexOptions.RightToLeft);
T>regex.Match(string.Empty);
T>var stopWatch = new Stopwatch();
T>stopWatch.Start();
T>regex.Match("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
T>stopWatch.Stop();
T>Console.WriteLine("Elapsed milliseconds: " + stopWatch.ElapsedMilliseconds);
T>Console.WriteLine("Elapsed ticks: " + stopWatch.ElapsedTicks );
T>


А про RightToLeft почему не упомянул? Для меня это выглядит как попытка обмануть на невнимательности
Для самых хитрожопых любителей необычных опций — вот такой вариант:
(x+x+)+y(x+x+)+
Ну как, помогает?
Re[9]: почему вы используете регулярные выражения?
От: mrTwister Россия  
Дата: 11.01.11 18:27
Оценка: -2 :)
Здравствуйте, lurrker, Вы писали:

T>>
T>>var regex = new Regex("(x+x+)+y", RegexOptions.Compiled | RegexOptions.RightToLeft);
T>>regex.Match(string.Empty);
T>>var stopWatch = new Stopwatch();
T>>stopWatch.Start();
T>>regex.Match("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
T>>stopWatch.Stop();
T>>Console.WriteLine("Elapsed milliseconds: " + stopWatch.ElapsedMilliseconds);
T>>Console.WriteLine("Elapsed ticks: " + stopWatch.ElapsedTicks );
T>>


L>А про RightToLeft почему не упомянул? Для меня это выглядит как попытка обмануть на невнимательности

L>Для самых хитрожопых любителей необычных опций — вот такой вариант:
L>(x+x+)+y(x+x+)+
L>Ну как, помогает?

Ну тогда вот так:


        static Regex CreateNonBacktrackingRegex(string  pattern)
        {
            return new Regex(pattern.Replace("(", "(?>(").Replace(")","))"));
        }

        static void Main(string[] args)
        {
            var regex = CreateNonBacktrackingRegex("(x+x+)+y(x+x+)+");
            regex.Match(string.Empty);
            var stopWatch = new Stopwatch();
            stopWatch.Start();
            regex.Match("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
            stopWatch.Stop();
            Console.WriteLine("Elapsed milliseconds: " + stopWatch.ElapsedMilliseconds);
            Console.WriteLine("Elapsed ticks: " + stopWatch.ElapsedTicks );
        }


Elapsed milliseconds: 0
Elapsed ticks: 128907
лэт ми спик фром май харт
Re[9]: почему вы используете регулярные выражения?
От: Воронков Василий Россия  
Дата: 11.01.11 22:00
Оценка: +1
Здравствуйте, WolfHound, Вы писали:

ВВ>>Ну а как все же это выглядит? Грамматика передается в виде строки? И как работает сам ПЕГ? Генерирует что-то в райнтайме?

WH>Ну если ты любишь извращения то можно и так.
WH>Генерируешь исходный код. Поднимаешь компилятор немерла и готово.
WH>Вот только нормальный человек создат проект на немерле и получит интелесенс и море других плюшек.

Ну то есть в качестве альтернативы регексам я в C# использовать ваш PEG все же не могу? Поднимать отдельный проект вместо того, чтобы написать маленький регекс кажется тяжеловатым решением. А отсюда в общем-то и очевиден ответ на вопрос, который в данном топике уже не первый раз поднимается. ПЕГ не используется потому что его попросту нету.
Re[10]: почему вы используете регулярные выражения?
От: WolfHound  
Дата: 11.01.11 22:27
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>Ну то есть в качестве альтернативы регексам я в C# использовать ваш PEG все же не могу? Поднимать отдельный проект вместо того, чтобы написать маленький регекс кажется тяжеловатым решением.

Вот только маленьким регексом дело как правило не ограничивается.

ВВ>А отсюда в общем-то и очевиден ответ на вопрос, который в данном топике уже не первый раз поднимается. ПЕГ не используется потому что его попросту нету.

Нет.
Правильный ответ невежество.
http://www.google.ru/#hl=ru&amp;q=regexp+html+parse
Почти полтора миллиона ссылок.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[11]: почему вы используете регулярные выражения?
От: Воронков Василий Россия  
Дата: 11.01.11 22:52
Оценка: +2 -1
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, Воронков Василий, Вы писали:


ВВ>>Ну то есть в качестве альтернативы регексам я в C# использовать ваш PEG все же не могу? Поднимать отдельный проект вместо того, чтобы написать маленький регекс кажется тяжеловатым решением.

WH>Вот только маленьким регексом дело как правило не ограничивается.

Странно. У меня как правило ограничивается. Для задач посложнее есть более профильные средства.
ПЕГ подошел бы на замену регексам, но для этого должны быть библиотеки со схожим АПИ.

ВВ>>А отсюда в общем-то и очевиден ответ на вопрос, который в данном топике уже не первый раз поднимается. ПЕГ не используется потому что его попросту нету.

WH>Нет.
WH>Правильный ответ невежество.
WH>http://www.google.ru/#hl=ru&amp;q=regexp+html+parse
WH>Почти полтора миллиона ссылок.

Полтора миллиона ссылок на что? Причем тут "regexp html parse"? Да и вообще html?
Если ты хочешь порекомендовать какую-то реализацию ПЕГ для дотнета, то не мог бы привести ссылку по-конкретнее?
Re[12]: почему вы используете регулярные выражения?
От: WolfHound  
Дата: 11.01.11 23:15
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>Странно. У меня как правило ограничивается. Для задач посложнее есть более профильные средства.

Какие?
Можешь показать мне парсер C#4 который работает со скоростью 4 метра в секунду с построением АСТ?

ВВ>Полтора миллиона ссылок на что? Причем тут "regexp html parse"? Да и вообще html?

ВВ>Если ты хочешь порекомендовать какую-то реализацию ПЕГ для дотнета, то не мог бы привести ссылку по-конкретнее?
Да куда уж конкретнее. Народ использует регексы для разбора html.
Они просно не понимают что значит рекурсивная грамматика.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[13]: почему вы используете регулярные выражения?
От: Воронков Василий Россия  
Дата: 12.01.11 03:16
Оценка: +2 :)
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, Воронков Василий, Вы писали:

ВВ>>Странно. У меня как правило ограничивается. Для задач посложнее есть более профильные средства.
WH> Какие?

Генераторы парсеров.

WH>Можешь показать мне парсер C#4 который работает со скоростью 4 метра в секунду с построением АСТ?


"парсер C#4 который работает со скоростью 4 метра в секунду с построением АСТ" — это не средство, а некая целевая задача. Надо сказать не сильно мне близкая. Поясню, если ты не понял — под более профильными средствами я имел в виду такие средства как CoCo/R, ANTLR, тот же PEG.

ВВ>>Полтора миллиона ссылок на что? Причем тут "regexp html parse"? Да и вообще html?

ВВ>>Если ты хочешь порекомендовать какую-то реализацию ПЕГ для дотнета, то не мог бы привести ссылку по-конкретнее?
WH>Да куда уж конкретнее. Народ использует регексы для разбора html.
WH>Они просно не понимают что значит рекурсивная грамматика.

Какое это имеет отношение к обсуждаемой теме? Я спрашивал, какую реализацию ПЕГ ты мне можешь порекомендовать для использования в C# — чтобы с ней было работать так же легко, как и с регексами, без танцев с бубном. А ты мне приводишь ссылки в стиле "какие все идиоты".
Re[17]: почему вы используете регулярные выражения?
От: jazzer Россия Skype: enerjazzer
Дата: 12.01.11 04:48
Оценка: -1
Здравствуйте, Klatu, Вы писали:

K>Здравствуйте, olegkr, Вы писали:


O>>Зачем мне парсер сишарпа? У меня все примитивнее, всякие там валидейшены телефонов, емейлов и прочего хлама.


K>Валидация емэйлов — не особо тривиальная задача. Регэкс на 6 кбайт, который упоминается в первом сообщении — он как раз для этого.

K>Хотя, если подумать, он действительно умещается в строку кода. Ну а то, что строка на 6 килобайт и никто кроме Джона Нэша не сможет ее прочитать — про это ты скромно умолчал?

А зачем его читать? Он доступен как библиотечный метод
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[7]: почему вы используете регулярные выражения?
От: jazzer Россия Skype: enerjazzer
Дата: 12.01.11 04:55
Оценка:
Здравствуйте, lurrker, Вы писали:

L>Вот простой практический пример:

L>регэкс (x+x+)+y применяешь к данным xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx, и движку становится очень-очень плохо.
И в чем же практическая ценность сего "практического примера"?
Осмысленный пример есть какой-нибудь?
А то бреда можно всякого много нагенерить
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[8]: почему вы используете регулярные выражения?
От: lurrker  
Дата: 12.01.11 05:03
Оценка:
Здравствуйте, jazzer, Вы писали:

J>И в чем же практическая ценность сего "практического примера"?

J>Осмысленный пример есть какой-нибудь?
J>А то бреда можно всякого много нагенерить

Практический смысл этого примера — вот здесь. Разработчики Hotmail тоже думали, что регэксы хорошо известны и предсказуемы, за что и поплатились.
Еще есть вопросы?
Re[10]: почему вы используете регулярные выражения?
От: lurrker  
Дата: 12.01.11 05:05
Оценка: -1
Здравствуйте, mrTwister, Вы писали:

T>Ну тогда вот так:


А почему бы сразу не заменить на "x+yx+", раз уж ты решил взять на себя роль компилятора?
Re[11]: почему вы используете регулярные выражения?
От: jazzer Россия Skype: enerjazzer
Дата: 12.01.11 05:09
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>Здравствуйте, netch80, Вы писали:


N>>Зачэм груби, дарагой? Всего лишь прямолинейная констатация факта: ты не знал, что могут быть другие результаты, но настоял, что все движки без ограничения должны страдать от этого. Я показал живой, тривиально проверяемый пример — ты не соглашаешься — мол, он что-то нарушает. Почему бы тебе не предположить, что это именно ты что-то не знаешь, а не те умные и опытные ребята, что пишут Perl?


ВВ>Ну в данном случае как раз вы ткнули пальцем в небо и "в защиту" регексов привели их реализацию, которая, собственно говоря, вообще не является регулярными выражениями. В Перле с помощью "регексов" можно выразить нерегулярную грамматику. Да, ребята там опытные, и они молодцы, но то, что они сделали регулярными выражениями не является уже просто по определению. И приводить их реализацию в защиту регексов несколько странно, не находите?


ВВ>

ВВ>Now, Perl's regexps "aren't" -- that is, they aren't "regular" because backreferences per sed and grep are also supported, which renders the language no longer strictly regular and so forbids "pure" DFA implementations.


ВВ>http://www.perl.com/doc/FMTEYEWTK/regexps.html


Ну потому что под регэкспами понимают то, что реально используется, а не какие-то построения математиков.
А везде используются именно перловые регэкспы, с блэкджеком и бэкреференсами. Причем "везде" — это практически буквально везде: в любом языке есть библиотека для поддержки перловых регэкспов. И вот это люди и называют регэкспами, и никого с практической точки зрения не волнует, что это не канонические регулярные выражения.
Спуститесь на землю уже.

Так что перловая реализация совершенно правильно здесь приведена, если, конечно, эта дискуссия имеет хоть какое-то отношение к реальной программистской практике, а не крутится только вокруг чистой математики.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[11]: почему вы используете регулярные выражения?
От: jazzer Россия Skype: enerjazzer
Дата: 12.01.11 05:11
Оценка:
Здравствуйте, lurrker, Вы писали:

L>Например, вот так:

L>
L>xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxlmnopqrstuvwyz
L>^.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*l+m+n+o+p+q+r+s+t+u+v+w+y+z+$
L>


А есть хоть капля смысла в таком вот регэкспе?
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[9]: почему вы используете регулярные выражения?
От: jazzer Россия Skype: enerjazzer
Дата: 12.01.11 05:15
Оценка:
Здравствуйте, lurrker, Вы писали:

L>Здравствуйте, jazzer, Вы писали:


J>>И в чем же практическая ценность сего "практического примера"?

J>>Осмысленный пример есть какой-нибудь?
J>>А то бреда можно всякого много нагенерить

L>Практический смысл этого примера — вот здесь. Разработчики Hotmail тоже думали, что регэксы хорошо известны и предсказуемы, за что и поплатились.

L>Еще есть вопросы?
Вопрос один: ты сам-то прочитал то, что написанно в твоей ссылке?

Here's an unrealistic but tiny example, to get the flavor across:

Где тут практический смысл?
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[12]: почему вы используете регулярные выражения?
От: Воронков Василий Россия  
Дата: 12.01.11 05:28
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Так что перловая реализация совершенно правильно здесь приведена, если, конечно, эта дискуссия имеет хоть какое-то отношение к реальной программистской практике, а не крутится только вокруг чистой математики.


В таком случае вся эта дискуссия — не более чем обсуждение нюансов синтаксиса. Если в обоих случаях мы получаем все тот же ПЕГ, но только в разной упаковке.
Re[13]: почему вы используете регулярные выражения?
От: jazzer Россия Skype: enerjazzer
Дата: 12.01.11 05:39
Оценка: :)
Здравствуйте, Воронков Василий, Вы писали:

ВВ>Здравствуйте, jazzer, Вы писали:


J>>Так что перловая реализация совершенно правильно здесь приведена, если, конечно, эта дискуссия имеет хоть какое-то отношение к реальной программистской практике, а не крутится только вокруг чистой математики.


ВВ>В таком случае вся эта дискуссия — не более чем обсуждение нюансов синтаксиса. Если в обоих случаях мы получаем все тот же ПЕГ, но только в разной упаковке.

Вот именно.
Но это не только синтаксис.
Это еще и доступность, и количество реализаций, и разнообразие инструментов, и наличие фич.
Тут регэкспы (перловые) выигрывают вчистую, имхо.
К синтаксису можно придраться, но бог знает с какой версии перла есть расширенный синтаксис, с комментариями и прочим.

Но главное у регэкспов есть фичи, которых нету у чистого пега — обратные ссылки, например.
Плюс есть стандартный синтаксис замены, которого у пега просто нету, только DarkGray привел пример реализации его внутренней и никому не доступной библиотеки, а стандарта нет.
Не говоря уже о вычислимых радостях типа "(?(condition)yes-pattern|no-pattern)", это если не говорить о том, что непосредственно в регэксп можно код загнать.

Тот же Boost.Spirit, хоть у него и написано на первой странице, что он реализует PEG, на cамом деле предоставляет гораздо больше, чем чистый ПЕГ (в результате — примерно то же, что и перловые регэкспы).
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[10]: почему вы используете регулярные выражения?
От: lurrker  
Дата: 12.01.11 05:43
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Вопрос один: ты сам-то прочитал то, что написанно в твоей ссылке?

J>

J>Here's an unrealistic but tiny example, to get the flavor across:

J>Где тут практический смысл?

Это упрощенный пример, вместо полного выражения. У тебя это вызывает какие-то затруднения?
Re[14]: почему вы используете регулярные выражения?
От: lurrker  
Дата: 12.01.11 05:48
Оценка: -1
Здравствуйте, jazzer, Вы писали:

J>Но главное у регэкспов есть фичи, которых нету у чистого пега — обратные ссылки, например.


Не вижу в них особой необходимости.

J>Не говоря уже о вычислимых радостях типа "(?(condition)yes-pattern|no-pattern)",


Элементарно делается в пег.

J>Тот же Boost.Spirit, хоть у него и написано на первой странице, что он реализует PEG, на cамом деле предоставляет гораздо больше, чем чистый ПЕГ (в результате — примерно то же, что и перловые регэкспы).


Нет, не примерно то же. У регэксов родовая проблема — катастрофические бактреки, на которые всегда можно наступить в неожиданном месте.
Re[11]: почему вы используете регулярные выражения?
От: jazzer Россия Skype: enerjazzer
Дата: 12.01.11 05:52
Оценка: +1 -2
Здравствуйте, lurrker, Вы писали:

L>Здравствуйте, jazzer, Вы писали:


J>>Вопрос один: ты сам-то прочитал то, что написанно в твоей ссылке?

J>>

J>>Here's an unrealistic but tiny example, to get the flavor across:

J>>Где тут практический смысл?

L>Это упрощенный пример, вместо полного выражения. У тебя это вызывает какие-то затруднения?

Да, вызывает, ибо этот упрощенный пример не имеет никакого смысла. Я хочу видеть реальное выражение, потому что x+x+, очевидно, эквивалентно просто x+. И дополнительный плюиск вокруг тоже смысла не имеет.
А то так можно и на Си наехать, типа что-то у меня долго выполняется цикл
for(;;){}
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[12]: почему вы используете регулярные выражения?
От: lurrker  
Дата: 12.01.11 05:52
Оценка:
Здравствуйте, jazzer, Вы писали:

J>А есть хоть капля смысла в таком вот регэкспе?


Конечно. Ты разве не умеешь читать регэксы?
Re[15]: почему вы используете регулярные выражения?
От: jazzer Россия Skype: enerjazzer
Дата: 12.01.11 05:59
Оценка: -1
Здравствуйте, lurrker, Вы писали:

L>Здравствуйте, jazzer, Вы писали:


J>>Но главное у регэкспов есть фичи, которых нету у чистого пега — обратные ссылки, например.

L>Не вижу в них особой необходимости.
http://www.rsdn.ru/forum/philosophy/4103343.1.aspx
Автор: jazzer
Дата: 04.01.11


L>Нет, не примерно то же. У регэксов родовая проблема — катастрофические бактреки, на которые всегда можно наступить в неожиданном месте.

Открой для себя конструкцию (?>pattern)
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[13]: почему вы используете регулярные выражения?
От: jazzer Россия Skype: enerjazzer
Дата: 12.01.11 06:00
Оценка: +1
Здравствуйте, lurrker, Вы писали:

L>Здравствуйте, jazzer, Вы писали:


J>>А есть хоть капля смысла в таком вот регэкспе?


L>Конечно. Ты разве не умеешь читать регэксы?


Умею, и в этом регэкспе ни на грош смысла не вижу. Снизойди, будь так добр.
Если смысл не в том, чтоб просто пофлеймить, конечно.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[11]: почему вы используете регулярные выражения?
От: mrTwister Россия  
Дата: 12.01.11 06:04
Оценка: +1 -2
Здравствуйте, lurrker, Вы писали:

L>Здравствуйте, mrTwister, Вы писали:


T>>Ну тогда вот так:


L>А почему бы сразу не заменить на "x+yx+", раз уж ты решил взять на себя роль компилятора?


А какая связь?
Нигде не написано, что регэкспы обязаны работать с исбользованием бэктрекинга (далее БТ). Так уж вышло, что стандартный Regex не имеет настройки, которая бы глобально отключала БТ, ну и хрен с ним, тривиальная строчка кода и мы автоматически отключаем БТ по группам. Вместо этого можно было бы сразу использовать библиотеку регэекспов, реализующая лбой из алгоритмов парсинга без БТ. Да просто это мало кому надо. Это надо только если мы получаем выражние откуда-то из внешних источников, а это мягко говоря нетипично.

Ну а в реальной жизни я естественно бы написал бы xx+yxx+. Ну либо использовал бы стандартный синтаксис для отключения БТ для подвыражения: (?>x+x+)+y(?>x+x+)+ (это кстати говоря к слову о том, что регэкспы, якобы, не позволяют ограничивать БТ )
лэт ми спик фром май харт
Re[15]: почему вы используете регулярные выражения?
От: mrTwister Россия  
Дата: 12.01.11 06:18
Оценка: +1 -2 :)
Здравствуйте, lurrker, Вы писали:

L>Нет, не примерно то же. У регэксов родовая проблема — катастрофические бактреки, на которые всегда можно наступить в неожиданном месте.

1) В неожиданном месте на них наступить можно только по незнанию либо по глупости.
2) Существует общепринятый синтаксис, отключающий бэктрекинг для подгруппы.
3) С чего ты взял, что реализация регулярных выражений обязана использовать бэктрекинг?
лэт ми спик фром май харт
Re[12]: почему вы используете регулярные выражения?
От: mrTwister Россия  
Дата: 12.01.11 06:29
Оценка: +1 -3
Здравствуйте, jazzer, Вы писали:

J>Ну потому что под регэкспами понимают то, что реально используется, а не какие-то построения математиков.

J>А везде используются именно перловые регэкспы, с блэкджеком и бэкреференсами. Причем "везде" — это практически буквально везде: в любом языке есть библиотека для поддержки перловых регэкспов. И вот это люди и называют регэкспами, и никого с практической точки зрения не волнует, что это не канонические регулярные выражения.
J>Спуститесь на землю уже.

J>Так что перловая реализация совершенно правильно здесь приведена, если, конечно, эта дискуссия имеет хоть какое-то отношение к реальной программистской практике, а не крутится только вокруг чистой математики.


+1
Вообще я тащюсь с дискуссии. Обсирают регулярные выражения, что они содержат мало фич и запрещают при этом выходить за рамки регулярных языков (мол это уже не регулярные выражения). И одновременно с этим обсирают регулярные выражения за то, что при их использовании возможет катастрофический бэктрекинг, забывая при этом, что регулярный язык вообще не предполагает никакого бэктрекинга, то есть тут уже подразумевается, что мы таки вышли за рамки регулярного языка. Неужели народ не понимает, что эти два аргумента друг другу противоречат?
лэт ми спик фром май харт
Re[17]: 2 Klatu
От: jazzer Россия Skype: enerjazzer
Дата: 12.01.11 07:57
Оценка: :))
Здравствуйте, Klatu, Вы ничего не писали, зато наставили молча кучу минусов.
Вам есть что сказать-то по делу, или слава Полозюка покоя не дает?
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[16]: почему вы используете регулярные выражения?
От: lurrker  
Дата: 12.01.11 08:13
Оценка: -1
Здравствуйте, mrTwister, Вы писали:

T>1) В неожиданном месте на них наступить можно только по незнанию либо по глупости.


Кривости регэксов уже стали основой для нового типа дос-атак: http://en.wikipedia.org/wiki/Regular_expression
Но зато на форуме все предельно умные и непогрешимые.

T>2) Существует общепринятый синтаксис, отключающий бэктрекинг для подгруппы.

T>3) С чего ты взял, что реализация регулярных выражений обязана использовать бэктрекинг?

Потому что в регэксах квантификаторы ведут себя таким образом, что без бактреков работать не могут. Отключить бактреки можно, но выражение станет работать по другому, и его скорее всего придется переписывать.
Re[13]: почему вы используете регулярные выражения?
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 12.01.11 08:14
Оценка: -1
Здравствуйте, mrTwister, Вы писали:

T>Здравствуйте, jazzer, Вы писали:


J>>Ну потому что под регэкспами понимают то, что реально используется, а не какие-то построения математиков.

J>>А везде используются именно перловые регэкспы, с блэкджеком и бэкреференсами. Причем "везде" — это практически буквально везде: в любом языке есть библиотека для поддержки перловых регэкспов. И вот это люди и называют регэкспами, и никого с практической точки зрения не волнует, что это не канонические регулярные выражения.
J>>Спуститесь на землю уже.

J>>Так что перловая реализация совершенно правильно здесь приведена, если, конечно, эта дискуссия имеет хоть какое-то отношение к реальной программистской практике, а не крутится только вокруг чистой математики.


T>+1

T>Вообще я тащюсь с дискуссии. Обсирают регулярные выражения, что они содержат мало фич и запрещают при этом выходить за рамки регулярных языков (мол это уже не регулярные выражения). И одновременно с этим обсирают регулярные выражения за то, что при их использовании возможет катастрофический бэктрекинг, забывая при этом, что регулярный язык вообще не предполагает никакого бэктрекинга, то есть тут уже подразумевается, что мы таки вышли за рамки регулярного языка. Неужели народ не понимает, что эти два аргумента друг другу противоречат?

Это ты не понимаешь ни теории, ни разбираешься в практике.
1)Языки (регулярные, КС и другие из иерархии Хомского) вообще способы разбора никак не описывают.
2)Все нотации грамматик — порождающие, то есть описывают как получить некоторую строку языка. Нас же интересует разбор (парсинг), тут возникают свои трудности.
3)Даже регулярные "регулярные выражения" в некоторых случаях работают с бектрекингом, например при использовании групп и замене.

В основном претензии к РВ разделяются на две части:
Если используются регулярные РВ (то есть парсящие только регулярные языки), то мощности этих РВ не хватает для распространенных задач, при этом они не всегда работают за линейное время (см выше).

Если используются расширенные РВ, то они работают довольно медленно ибо бектрекинг, при этом не парсят все КС языки, а только подмножество. Кроме того синитаксис расширенных РВ довольно тяжел, и плохо композируется.

Первовые РВ вообще являются аналогом этого самого PEG.
Re[14]: почему вы используете регулярные выражения?
От: lurrker  
Дата: 12.01.11 08:27
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Если смысл не в том, чтоб просто пофлеймить, конечно.


Смысл очевидный — это демонстрация проблемы в движке. Простая, для ясности.
Где, в каком выражении и при каких условиях на это можно наступить — это уже дело десятое. Принципиально важно то, что такая проблема есть.
Re[14]: почему вы используете регулярные выражения?
От: mrTwister Россия  
Дата: 12.01.11 08:30
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>Это ты не понимаешь ни теории, ни разбираешься в практике.

Да, давайте меня побольше пообсуждаем!

G>1)Языки (регулярные, КС и другие из иерархии Хомского) вообще способы разбора никак не описывают.

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

G>3)Даже регулярные "регулярные выражения" в некоторых случаях работают с бектрекингом, например при использовании групп и замене.

В этом случае имеет место КС язык.

G>мощности этих РВ не хватает для распространенных задач, при этом они не всегда работают за линейное время (см выше).


All languages generated by a regular grammar can be recognized in linear time by a finite state machine.

http://en.wikipedia.org/wiki/Formal_grammar
лэт ми спик фром май харт
Re[12]: почему вы используете регулярные выражения?
От: lurrker  
Дата: 12.01.11 08:33
Оценка:
Здравствуйте, mrTwister, Вы писали:

T>А какая связь?


Связь прямая. Чтобы произвести такую замену, нужно сначала проанализировать код и установить, что отключение бактреков ничего не сломает. Потом, очевидно, часть выражения придется переписать, и далеко не факт что сделать это будет просто.
В данном примере ты решил взять на себя функцию компилятора, но настоящий компилятор этого, естественно, не умеет
В качестве примера — мой второй регэкс, который после отключения бактреков просто перестанет работать.
Re[17]: почему вы используете регулярные выражения?
От: mrTwister Россия  
Дата: 12.01.11 08:36
Оценка:
Здравствуйте, lurrker, Вы писали:


L>Потому что в регэксах квантификаторы ведут себя таким образом, что без бактреков работать не могут.


Гугли про DFA

L>Отключить бактреки можно, но выражение станет работать по другому, и его скорее всего придется переписывать.

И что?
лэт ми спик фром май харт
Re[18]: почему вы используете регулярные выражения?
От: lurrker  
Дата: 12.01.11 08:46
Оценка:
Здравствуйте, mrTwister, Вы писали:

T>Гугли про DFA


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

L>>Отключить бактреки можно, но выражение станет работать по другому, и его скорее всего придется переписывать.

T>И что?

А то, что это лишняя и ненужная работа.
Re: почему вы используете регулярные выражения?
От: dotneter  
Дата: 12.01.11 08:47
Оценка:
Можно конкретный список задач среднестатистического программиста, решение которых peg'ом дало бы существенное преимущество?
Валидация емейлов и парсинг html не подходит.
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Talk is cheap. Show me the code.
Re[15]: почему вы используете регулярные выражения?
От: mefrill Россия  
Дата: 12.01.11 09:06
Оценка: 30 (3) +2 -1
Здравствуйте, lurrker, Вы писали:

L>Смысл очевидный — это демонстрация проблемы в движке. Простая, для ясности.

L>Где, в каком выражении и при каких условиях на это можно наступить — это уже дело десятое. Принципиально важно то, что такая проблема есть.

Нет такой проблемы, а есть теорема о том, что каждый НКА может быть преобразован в ДКА, допускающий тот же язык. ДКА разбирает любую строку за время O(n), где n -- длина этой строки. В этом и состоит сермяжный смысл задания шаблонов с помощью регулярных выражений. Есть теорема Клини, которая гласит: классы автматных и регулярных языков совпадают. Это, в частности, означает, что для каждого регуляного выражения можно построить ДКА, допускающий в точности тот же язык, что опсиан регулярным выражением. Проблема с перловыми регулярками в том, что они расширили синтаксис языка регулярных выражений для ссылки на группы, выделенные в начале. Это ведет к неоднозначностям и необходимости откатов (если выбран поиск в глубину). Последнее, в свою очередь, ведет к тому, что невозможно построить ДКА для такого выражения. Вынужденно работать с НКА на этапе компиляции и пытаться строить ДКА методом ленивого вычисления подмножеств -- не есть хорошо. Поэтому такие компании, как Google и Яндекс недавно выпустили свои версии поисковых движков на основе регулярных выражений (https://github.com/dprokoptsev/pire и http://code.google.com/p/re2/).

При построении поисковых автоматов главная проблема состоит в выделении групп (того, что в круглых скобках), при таком выделении возникают неоднозначности, которые можно разрешить, например, установив по умолчанию жадный поиск. Кроме того, могут быть проблемы с построением из ПОИСКОВОГО НКА с обратными ссылками соответствующего ДКА. Состояний в некоторых случаях может набраться сотни тысяч, автомат раздувается. Хотя это проблема не метода, а ресурсов.

Принципиальное отличие регулярок от PEG -- это возможность построения оптимального линейного поискового движка. Грамматики PEG, насколько я понимаю, иногда даже в рамки КС-языков не укладываются, поэтмоу сравнивать их с регулярками все равно, что сравнивать теплое с мягким. Различие состоит не в синтаксисе, а в способе разбора. Если PEG не строит поисковый автомат с минимальным числом состояний, то он заведомо менее эффективен, чем РВ т.к. поисковый автомат -- это т.н. "стандартная модель", все мысли о поиске или распознавании все равно приходят к эффективной модели конечного автомата.
Re[15]: почему вы используете регулярные выражения?
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 12.01.11 09:18
Оценка:
Здравствуйте, mrTwister, Вы писали:

T>Здравствуйте, gandjustas, Вы писали:


G>>Это ты не понимаешь ни теории, ни разбираешься в практике.

T>Да, давайте меня побольше пообсуждаем!

G>>1)Языки (регулярные, КС и другие из иерархии Хомского) вообще способы разбора никак не описывают.

T>Есть теорема, формально доказывающая, что любой регулярный язык разбирается конечным автоматом без магазинной памяти. Наличие магазинной памяти необходимо для разбора КС языков представителем которых и являются примеры с катастрофическим бэктрекингом.
Тем не менее вами языка не описывают способ разбора.

G>>3)Даже регулярные "регулярные выражения" в некоторых случаях работают с бектрекингом, например при использовании групп и замене.

T>В этом случае имеет место КС язык.
Нет, язык остается регулярным, а вот построение автомата для него, выполняющего тот самый разбор — крайне сложная операция. Не говорю что невозможная, но примеров я не видел.
Ты выкинул тот самый п2, в котором я говорил про то алгоритм будет зависеть от того зачем делается разбор.

G>>мощности этих РВ не хватает для распространенных задач, при этом они не всегда работают за линейное время (см выше).

T>
T>

All languages generated by a regular grammar can be recognized in linear time by a finite state machine.

T>http://en.wikipedia.org/wiki/Formal_grammar
см выше.
Re[15]: почему вы используете регулярные выражения?
От: jazzer Россия Skype: enerjazzer
Дата: 12.01.11 09:22
Оценка: -1 :)
Здравствуйте, lurrker, Вы писали:

L>Здравствуйте, jazzer, Вы писали:


J>>Если смысл не в том, чтоб просто пофлеймить, конечно.


L>Смысл очевидный — это демонстрация проблемы в движке. Простая, для ясности.

L>Где, в каком выражении и при каких условиях на это можно наступить — это уже дело десятое. Принципиально важно то, что такая проблема есть.

Если она не возникает в реальных задачах — это совершенно неважно.
Это все равно что отговаривать от использования быстрой сортировки на том основании, что бывают патологические случаи, в которых она тормозит.
Ну да, бывают патологические регэкспы — ну так не пиши их, делов то.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[16]: почему вы используете регулярные выражения?
От: mrTwister Россия  
Дата: 12.01.11 09:29
Оценка: -1
Здравствуйте, gandjustas, Вы писали:

G>>>1)Языки (регулярные, КС и другие из иерархии Хомского) вообще способы разбора никак не описывают.

T>>Есть теорема, формально доказывающая, что любой регулярный язык разбирается конечным автоматом без магазинной памяти. Наличие магазинной памяти необходимо для разбора КС языков представителем которых и являются примеры с катастрофическим бэктрекингом.
G>Тем не менее вами языка не описывают способ разбора.
И что с того? В контексте разговора важно то, что если грамматика регулярная, то для её разбора гарантированно подойдет КА, работающий за линейное время.

G>>>3)Даже регулярные "регулярные выражения" в некоторых случаях работают с бектрекингом, например при использовании групп и замене.

T>>В этом случае имеет место КС язык.
G>Нет, язык остается регулярным, а вот построение автомата для него, выполняющего тот самый разбор — крайне сложная операция. Не говорю что невозможная, но примеров я не видел.
Операция простая и формализованная. Другое дело, что DFA движки менее удобны в реальной жизни, из-за того, что они не поддерживают бэктрекинг (проблемы из-за которого в реальной жизни встречаются редко)

G>Ты выкинул тот самый п2, в котором я говорил про то алгоритм будет зависеть от того зачем делается разбор.

Хорошо, довай восстановим справедливость:

2)Все нотации грамматик — порождающие, то есть описывают как получить некоторую строку языка. Нас же интересует разбор (парсинг), тут возникают свои трудности.

Если грамматика регулярная, то трудности не возникают.

G>>>мощности этих РВ не хватает для распространенных задач, при этом они не всегда работают за линейное время (см выше).

T>>
T>>

All languages generated by a regular grammar can be recognized in linear time by a finite state machine.

T>>http://en.wikipedia.org/wiki/Formal_grammar
G>см выше.
Куда именно?
лэт ми спик фром май харт
Re[17]: почему вы используете регулярные выражения?
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 12.01.11 10:16
Оценка:
Здравствуйте, mrTwister, Вы писали:

T>Здравствуйте, gandjustas, Вы писали:


G>>>>1)Языки (регулярные, КС и другие из иерархии Хомского) вообще способы разбора никак не описывают.

T>>>Есть теорема, формально доказывающая, что любой регулярный язык разбирается конечным автоматом без магазинной памяти. Наличие магазинной памяти необходимо для разбора КС языков представителем которых и являются примеры с катастрофическим бэктрекингом.
G>>Тем не менее вами языка не описывают способ разбора.
T>И что с того? В контексте разговора важно то, что если грамматика регулярная, то для её разбора гарантированно подойдет КА, работающий за линейное время.
Еще раз: смотря какой разбор.

G>>>>3)Даже регулярные "регулярные выражения" в некоторых случаях работают с бектрекингом, например при использовании групп и замене.

T>>>В этом случае имеет место КС язык.
G>>Нет, язык остается регулярным, а вот построение автомата для него, выполняющего тот самый разбор — крайне сложная операция. Не говорю что невозможная, но примеров я не видел.
T>Операция простая и формализованная. Другое дело, что DFA движки менее удобны в реальной жизни, из-за того, что они не поддерживают бэктрекинг (проблемы из-за которого в реальной жизни встречаются редко)
Это как теория, которая от практики не отличается только в теории.

G>>Ты выкинул тот самый п2, в котором я говорил про то алгоритм будет зависеть от того зачем делается разбор.

T>Хорошо, довай восстановим справедливость:
T>

2)Все нотации грамматик — порождающие, то есть описывают как получить некоторую строку языка. Нас же интересует разбор (парсинг), тут возникают свои трудности.

T>Если грамматика регулярная, то трудности не возникают.
От повторения мантры матчинг групп без бектрекинга не появится.

G>>>>мощности этих РВ не хватает для распространенных задач, при этом они не всегда работают за линейное время (см выше).

T>>>
T>>>

All languages generated by a regular grammar can be recognized in linear time by a finite state machine.

T>>>http://en.wikipedia.org/wiki/Formal_grammar
G>>см выше.
T>Куда именно?
Там где описывается слово "разбор".

Для РВ обычно под разбором понимается проверка принадлежности строки некоторому языку, для КС грамматик под разбором понимают построение "дерева разбора". Вот построить "дерево разбора" для РВ с ДКА не получается (не знаю насколько это возможно теоретически), а именно "дерево разбора" дает возможность получать структурированные данные из строк или проводить замены.
Re[18]: почему вы используете регулярные выражения?
От: Ziaw Россия  
Дата: 12.01.11 10:43
Оценка:
Здравствуйте, olegkr, Вы писали:

Z>>Обычно генератор подразумевает свой язык. Как инструмент они ничем не отличаются от nemerle.

O>Только в случае немерле будет два языка

Я не пытался, но в теории можно обойтись без nemerle языка, используя только nemerle компилятор. Макрос для PEG атрибутный, должен работать и в cs файлах. Если он сейчас не работает, несложно сделать чтобы работал. К сожалению навигации по правилам в IDE мы лишимся.
Re[19]: почему вы используете регулярные выражения?
От: hardcase Пират http://nemerle.org
Дата: 12.01.11 10:50
Оценка: +1
Здравствуйте, Ziaw, Вы писали:

Z>Макрос для PEG атрибутный, должен работать и в cs файлах. Если он сейчас не работает, несложно сделать чтобы работал.


Работать не будет (по крайней мере без существенной доработки), так как там есть технические ограничения — завязка на лексерный макрос grammar: макра PegParser самостоятельно занимается разбором правил.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[16]: почему вы используете регулярные выражения?
От: lurrker  
Дата: 12.01.11 11:03
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Если она не возникает в реальных задачах — это совершенно неважно.


Возникает, пример уже приводился.

J>Ну да, бывают патологические регэкспы — ну так не пиши их, делов то.


Ну да, действительно. Спасибо, К.О.
Re[17]: почему вы используете регулярные выражения?
От: lurrker  
Дата: 12.01.11 11:06
Оценка:
Здравствуйте, mrTwister, Вы писали:

T>И что с того? В контексте разговора важно то, что если грамматика регулярная, то для её разбора гарантированно подойдет КА, работающий за линейное время.


Какой существующий РВ движок гарантированно работает за линейное время?
Re[16]: почему вы используете регулярные выражения?
От: lurrker  
Дата: 12.01.11 11:07
Оценка:
Здравствуйте, mefrill, Вы писали:

M>Если PEG не строит поисковый автомат с минимальным числом состояний, то он заведомо менее эффективен, чем РВ т.к. поисковый автомат -- это т.н. "стандартная модель", все мысли о поиске или распознавании все равно приходят к эффективной модели конечного автомата.


Это мы говорим о каком-то реальном движке, или о сферическом регэксе в вакууме?
Re[17]: почему вы используете регулярные выражения?
От: jazzer Россия Skype: enerjazzer
Дата: 12.01.11 11:07
Оценка:
Здравствуйте, lurrker, Вы писали:

J>>Если она не возникает в реальных задачах — это совершенно неважно.

L>Возникает, пример уже приводился.
Где пример реальной задачи? Там был какой-то патологический "unrealistic example".

J>>Ну да, бывают патологические регэкспы — ну так не пиши их, делов то.

L>Ну да, действительно. Спасибо, К.О.
А ты как думал?
— Сортировка — отстой!
— Почему?
— Сортировка пузырьком тормозит!
— Ну так не юзай ее.
— Ну да, действительно. Спасибо, К.О.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[20]: почему вы используете регулярные выражения?
От: Ziaw Россия  
Дата: 12.01.11 11:13
Оценка:
Здравствуйте, hardcase, Вы писали:

Z>>Макрос для PEG атрибутный, должен работать и в cs файлах. Если он сейчас не работает, несложно сделать чтобы работал.


H>Работать не будет (по крайней мере без существенной доработки), так как там есть технические ограничения — завязка на лексерный макрос grammar: макра PegParser самостоятельно занимается разбором правил.


Ну не такая уж она и существенная, надо лишь сделать аналогичный макрос принимающий грамматику в виде строки, превращающий ее в аст и вызывающий старый макрос. Вообще это надо бы сделать, хотя бы для использования пегпарсера в виде библиотеки и компиляции грамматик в рантайме. Может займусь через некоторое время.
Re[17]: почему вы используете регулярные выражения?
От: mefrill Россия  
Дата: 12.01.11 11:21
Оценка:
Здравствуйте, lurrker, Вы писали:

M>>Если PEG не строит поисковый автомат с минимальным числом состояний, то он заведомо менее эффективен, чем РВ т.к. поисковый автомат -- это т.н. "стандартная модель", все мысли о поиске или распознавании все равно приходят к эффективной модели конечного автомата.


L>Это мы говорим о каком-то реальном движке, или о сферическом регэксе в вакууме?


Не знаю, что там под конем подразумевается, я говорю о поисковой модели. Ее стандартное выражение -- поисковый автомат. Если необходимы реализации, то я их привел в своем предыдущем сообщении. Если движок PEG строит для своих определений поисковый автомат, где это возможно, то вообще не о чем говорить, различие только в синтаксисе, да и то, его в этом случае реально нет, т.к. для определения используется расширенная БНФ с регулярными выражениями в правой части правил. Если нечего сказать, лучше вообще ничего не пиши, а то вакуум в голове получается, там регэксп и не валялся.
Re[16]: почему вы используете регулярные выражения?
От: WolfHound  
Дата: 12.01.11 14:13
Оценка:
Здравствуйте, mefrill, Вы писали:

M>Нет такой проблемы, а есть теорема о том, что каждый НКА может быть преобразован в ДКА, допускающий тот же язык. хъ

Пойми что разговор идет о реальных движках регексов, а не о теории в вакууме.
А семантика реальных движков такова что там черт ногу сломит.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[18]: почему вы используете регулярные выражения?
От: WolfHound  
Дата: 12.01.11 14:14
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Где пример реальной задачи? Там был какой-то патологический "unrealistic example".

Я уже писал про то что на RSDN одно вренмя была DoS уязвимость из-за регексов...
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[12]: почему вы используете регулярные выражения?
От: WolfHound  
Дата: 12.01.11 14:41
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Да, вызывает, ибо этот упрощенный пример не имеет никакого смысла. Я хочу видеть реальное выражение, потому что x+x+, очевидно, эквивалентно просто x+. И дополнительный плюиск вокруг тоже смысла не имеет.

Вот ты и ошибся.
    printFsm(FSMBuilder.RepeatMin(1, FSMBuilder.Symbol('x')));
    printFsm(FSMBuilder.Seq([FSMBuilder.RepeatMin(1, FSMBuilder.Symbol('x')), FSMBuilder.RepeatMin(1, FSMBuilder.Symbol('x'))]));

printFsm строит минимальный детерминированный конечный автомат и печатает результат:
============================================================================
0  start
-> 1 ['x']

1  ok
-> 1 ['x']

============================================================================
============================================================================
0
-> 1 ['x']

1  ok
-> 1 ['x']

2  start
-> 0 ['x']

============================================================================

Больше не строй из себя компилятор.

ЗЫ Я использую этот код в Nemerle.Peg для генерации конечных автоматов где возможно.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[18]: почему вы используете регулярные выражения?
От: lurrker  
Дата: 12.01.11 15:05
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Где пример реальной задачи? Там был какой-то патологический "unrealistic example".


За реальным примером спроси у WolfHound, в гугле их тоже вагон.
Я тебе показал, что регэксы не дают никаких, даже самых слабых гарантий по времени выполнения. Этого достаточно.

J>А ты как думал?

J>- Сортировка — отстой!
J>- Почему?
J>- Сортировка пузырьком тормозит!
J>- Ну так не юзай ее.
J>- Ну да, действительно. Спасибо, К.О.

Значит, не используем уступчивые квантификаторы, бакрефы, чего там еще?
Re[18]: почему вы используете регулярные выражения?
От: lurrker  
Дата: 12.01.11 15:09
Оценка:
Здравствуйте, mefrill, Вы писали:

M>то вообще не о чем говорить, различие только в синтаксисе


нет
КА покрывает только очень маленькую часть функционала как PEG, так и того что сейчас называют "регэксами"
Re[17]: почему вы используете регулярные выражения?
От: mefrill Россия  
Дата: 12.01.11 15:13
Оценка:
Здравствуйте, WolfHound, Вы писали:

M>>Нет такой проблемы, а есть теорема о том, что каждый НКА может быть преобразован в ДКА, допускающий тот же язык. хъ

WH>Пойми что разговор идет о реальных движках регексов, а не о теории в вакууме.
WH>А семантика реальных движков такова что там черт ногу сломит.

Ну я же привел два самых что ни на есть реальных движка в предудущем сообщении. Это вообще последний писк моды, только недавно Google и Яндекс сделали именно для поиска. Что еще реальнее и причем здесь вакуум?
Re[19]: почему вы используете регулярные выражения?
От: jazzer Россия Skype: enerjazzer
Дата: 12.01.11 15:19
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, jazzer, Вы писали:


J>>Где пример реальной задачи? Там был какой-то патологический "unrealistic example".

WH>Я уже писал про то что на RSDN одно вренмя была DoS уязвимость из-за регексов...
И? Пофиксили? Как? Исправили регэксп?
Кинь линк на багу, что ли...
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[13]: почему вы используете регулярные выражения?
От: jazzer Россия Skype: enerjazzer
Дата: 12.01.11 15:24
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, jazzer, Вы писали:


J>>Да, вызывает, ибо этот упрощенный пример не имеет никакого смысла. Я хочу видеть реальное выражение, потому что x+x+, очевидно, эквивалентно просто x+. И дополнительный плюиск вокруг тоже смысла не имеет.

WH>Вот ты и ошибся.
Сорри, не понял из этой горы текста, где я ошибся.
Пример как не имел смысла, так и не имеет, хоть на бейсике его запиши.

WH>ЗЫ Я использую этот код в Nemerle.Peg для генерации конечных автоматов где возможно.

Рад за тебя. Только, опять же, я не понял, какое это отношение имеет к осмысленности этого регэкспа.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[3]: почему вы используете регулярные выражения?
От: Socrat Россия  
Дата: 14.01.11 12:03
Оценка:
Здравствуйте, WolfHound, Вы писали:

S>>А есть готовые библиотеки для C/C++?

WH>http://www.boost.org/doc/libs/1_45_0/libs/spirit/doc/html/index.html

А скачивать отсюда: http://boost-spirit.com/home/download/ ?
Re[14]: почему вы используете регулярные выражения?
От: Sinclair Россия https://github.com/evilguest/
Дата: 17.01.11 05:31
Оценка: +1
Здравствуйте, jazzer, Вы писали:
J>Сорри, не понял из этой горы текста, где я ошибся.
А чего тут не понять? x+ заматчит строчку "x", а (x+x+) — не заматчит. Дьявол в деталях.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[15]: почему вы используете регулярные выражения?
От: jazzer Россия Skype: enerjazzer
Дата: 17.01.11 09:57
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Здравствуйте, jazzer, Вы писали:

J>>Сорри, не понял из этой горы текста, где я ошибся.
S>А чего тут не понять? x+ заматчит строчку "x", а (x+x+) — не заматчит. Дьявол в деталях.
xx+
x{2,}

ы?
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[19]: почему вы используете регулярные выражения?
От: jazzer Россия Skype: enerjazzer
Дата: 17.01.11 13:29
Оценка: -3 :))
Здравствуйте, lurrker, Вы писали:

L>Здравствуйте, jazzer, Вы писали:


J>>Где пример реальной задачи? Там был какой-то патологический "unrealistic example".


L>За реальным примером спроси у WolfHound, в гугле их тоже вагон.

У WolfHound была ошибка в регэкспе? И это что-то доказывает? Ну так ошибки даже в Хаскеле бывают

L>Я тебе показал, что регэксы не дают никаких, даже самых слабых гарантий по времени выполнения. Этого достаточно.

На патологических регэкспах — да, показал, молодец, возьми с полки пирожок
Только к реальной жизни это не имеет отношения.

L>Значит, не используем уступчивые квантификаторы, бакрефы, чего там еще?

Что угодно.
Ты же автор регэкспа.
Если тебе в твоей задаче в регэкспе не нужен бэктрекинг и устопчивые квантификаторы, то почему бы их и не отключить, чтоб получить лучшую производительность? Почему нужно обязательно переключиться на другой движок с урезанным функционалом?
Отключить имеющийся функционал — не проблема обычно, проблема — включить то, чего нет, как, например, бэкреференсы в пеге.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[4]: почему вы используете регулярные выражения?
От: jazzer Россия Skype: enerjazzer
Дата: 17.01.11 13:33
Оценка:
Здравствуйте, Socrat, Вы писали:

S>Здравствуйте, WolfHound, Вы писали:


S>>>А есть готовые библиотеки для C/C++?

WH>>http://www.boost.org/doc/libs/1_45_0/libs/spirit/doc/html/index.html

S>А скачивать отсюда: http://boost-spirit.com/home/download/ ?


Если нужен только спирит и точно не надо ничего больше из буста — то да.

А так — качай лучше буст целиком:
http://www.boost.org/users/download/

Под винду даже инсталлятор есть, ничего не придется самому собирать, если не нужно никакой экзотической сборки:
http://www.boostpro.com/download/
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[20]: почему вы используете регулярные выражения?
От: WolfHound  
Дата: 17.01.11 14:07
Оценка:
Здравствуйте, jazzer, Вы писали:

J>У WolfHound была ошибка в регэкспе? И это что-то доказывает? Ну так ошибки даже в Хаскеле бывают

Там просто регекс получался ОЧЕНЬ большим.

J>Отключить имеющийся функционал — не проблема обычно, проблема — включить то, чего нет, как, например, бэкреференсы в пеге.

Я могу добавить их в свой движок минут за 30 просто они нахрен не нужны.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[16]: почему вы используете регулярные выражения?
От: WolfHound  
Дата: 17.01.11 14:07
Оценка:
Здравствуйте, jazzer, Вы писали:

J>ы?

Ты не ыкай. Это просто пример того что из людей получаются хреновые компиляторы.
И на более сложном выражении все будет гораздо печальнее.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[17]: почему вы используете регулярные выражения?
От: jazzer Россия Skype: enerjazzer
Дата: 17.01.11 14:16
Оценка: -1
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, jazzer, Вы писали:


J>>ы?

WH>Ты не ыкай.
Вот еще. Хочу — юкаю, хочу — нет.

WH>Это просто пример того что из людей получаются хреновые компиляторы.

Идиотский пример, потому что нет постановки задачи.
Обычно задачи на регэкспы ставят не в виде "я тут хню написал, она всю память сожрала, помогить оптимизировать", а "вот есть такие строчки, хочу ее матчить, напишите регэксп".

WH>И на более сложном выражении все будет гораздо печальнее.

Не будет, если задача будет по-человечески сорфмулирована.
Потому что идиотских регэкспов типа .*.*.*.* и х+х+х+ никто вменяемый в реальной жизни не напишет.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[21]: почему вы используете регулярные выражения?
От: jazzer Россия Skype: enerjazzer
Дата: 17.01.11 14:21
Оценка: -1 :)
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, jazzer, Вы писали:


J>>У WolfHound была ошибка в регэкспе? И это что-то доказывает? Ну так ошибки даже в Хаскеле бывают

WH>Там просто регекс получался ОЧЕНЬ большим.


J>>Отключить имеющийся функционал — не проблема обычно, проблема — включить то, чего нет, как, например, бэкреференсы в пеге.

WH> Я могу добавить их в свой движок минут за 30
Ну тогда твой движок перестанет быть пегом и станет регэкспом, не?
Вон, даже гугл отказался в RE2 от попыток сделать быстрые регэкспы с бэкреференсами — они их там просто запретили.

WH>просто они нахрен не нужны.

http://www.rsdn.ru/forum/philosophy/4103343.1.aspx
Автор: jazzer
Дата: 04.01.11
, в конце
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[22]: почему вы используете регулярные выражения?
От: WolfHound  
Дата: 17.01.11 15:19
Оценка:
Здравствуйте, jazzer, Вы писали:

WH>> Я могу добавить их в свой движок минут за 30

J>Ну тогда твой движок перестанет быть пегом и станет регэкспом, не?
Нет.

J>Вон, даже гугл отказался

Аппеляция к авторитету == слив.

J>в RE2 от попыток сделать быстрые регэкспы с бэкреференсами — они их там просто запретили.

Так семантика регексов не позволяет делать быстрые бекреференсы, а с пегом проблем нет.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[18]: почему вы используете регулярные выражения?
От: WolfHound  
Дата: 17.01.11 15:19
Оценка:
Здравствуйте, jazzer, Вы писали:

WH>>Это просто пример того что из людей получаются хреновые компиляторы.

J>Идиотский пример, потому что нет постановки задачи.
Тем не менее ты запутался в 4х символах...

J>Обычно задачи на регэкспы ставят не в виде "я тут хню написал, она всю память сожрала, помогить оптимизировать", а "вот есть такие строчки, хочу ее матчить, напишите регэксп".

А тебе не кажется странным само наличее таких проблем?
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[11]: почему вы используете регулярные выражения?
От: Sinclair Россия https://github.com/evilguest/
Дата: 17.01.11 16:27
Оценка: 20 (3) +4
Здравствуйте, WolfHound, Вы писали:

WH>Ну то есть ты признаешь что занимаешься monkey driven development'ом.

Cпокойнее с выводами.
Есть масса мест и применений, где RegEx вводятся пользователем.
Вот простейший пример: в некоторых странах законодательно запрещено использовать определённые последовательности цифр для пользовательских телефонных номеров, даже если речь идёт о внутреннем номере.
Поскольку стран много, и общего стандарта на это нет, а поддерживать как-то надо, мы вводим в наш продукт некий набор настроек. Цель настроек — запретить, к примеру, номера вида 2110, 3116, 9115 и так далее.
Важно: эти настройки задаёт не программист. В лучшем случае это инженер службы профессиональных услуг. В худшем — какой-нибудь Сандип Аранжвархарман с сертификатом MCSE.
И настроек должно быть не очень много. В мире, где царят RegEx-пы, мы тупо вводим настройку "Validation Pattern", в документации даём ссылку на официальную доку и пару примеров вида "\d^1^1". Что нам делать с PEG-парсером?

Чтобы PEG заменил регекспы, нужно, чтобы он стал
а) очень-очень распространён. Чтобы можно было за $28 купить или за $7.99 скачать книгу O'Reilly про него, где всё обсосано до мелочей. Чтобы библиотеки с его поддержкой (совместимые по способу использования!!!) были широко доступны на всех основных языках разработки.
б) применим для мелких масштабов. Чтобы можно было применять его для проверки, поиска и замены коротких цепочек.
в) применим для непрограммистов. Чтобы "грамматику" или что там у него вместо строки регекспа можно было скормить в мою программу через несложный UI (или конфиг-файл), не привлекая IDE c code completion и билд-машину.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[12]: почему вы используете регулярные выражения?
От: WolfHound  
Дата: 17.01.11 16:32
Оценка:
Здравствуйте, Sinclair, Вы писали:

WH>>Ну то есть ты признаешь что занимаешься monkey driven development'ом.

S>Cпокойнее с выводами.
А ты не отрывайся от контекста.
Разговор шол про то что программисты столь тупы что не смогут разобраться с немерлом.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[11]: почему вы используете регулярные выражения?
От: Sinclair Россия https://github.com/evilguest/
Дата: 17.01.11 16:33
Оценка: +2
Здравствуйте, WolfHound, Вы писали:
WH>http://www.google.ru/#hl=ru&amp;q=regexp+html+parse
WH>Почти полтора миллиона ссылок.
Спокойнее с выводами.
Очень часто такая штука используется вовсе не в виде хардкода в своей программе, а в виде конфигурируемой части приложения. Ну там, какой-нибудь ContentRewriteModule, который знать не знает ничего про HTML (и не должен), а просто занимается переписыванием ссылок, не взирая на смысл контента. Да, применение RegEx для этого — чревато головными болями и трудностями в отладке и поддержке. Но зато оно работает с любым приложением. И оно позволяет мне переконфигурить модуль не имея в наличии системы сборки.
Теоретически, современные веб-приложения компилируются just in time, и можно применять любую тяжёлую артиллерию. Возможно, для подобного применения PEG будет рулить со страшной силой. Но пока что примеров нету, зато Rewrite модулей, основанных на регекспах — пруд пруди.

То же самое, только в ещё большей степени, касается URL Rewrite.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[13]: почему вы используете регулярные выражения?
От: Sinclair Россия https://github.com/evilguest/
Дата: 17.01.11 16:38
Оценка:
Здравствуйте, WolfHound, Вы писали:
WH>А ты не отрывайся от контекста.
WH>Разговор шол про то что программисты столь тупы что не смогут разобраться с немерлом.
Нет, разговор шёл про то, что требование знать +1 язык автоматически увеличивает стоимость кадров.
Если уж, конечно, хочется вернуться в контекст.
Лично я сейчас людей не менеджу, но у меня стойкое отвращение к идее наращивать количество языков. У нас и так основной код написан сразу на трёх языках. С удовольствием бы выкинул два из них. Любые два.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[14]: почему вы используете регулярные выражения?
От: WolfHound  
Дата: 17.01.11 16:54
Оценка: +1 :)
Здравствуйте, Sinclair, Вы писали:

S>Нет, разговор шёл про то, что требование знать +1 язык автоматически увеличивает стоимость кадров.

Ну так и надо выкинать все кроме немерла.
Писать на нем всегда проще чем на C#.
Под .НЕТ нужны только два языка. Немерле и C++/CLI (для жесткого интеропа с легаси кодом).

S>Лично я сейчас людей не менеджу, но у меня стойкое отвращение к идее наращивать количество языков. У нас и так основной код написан сразу на трёх языках. С удовольствием бы выкинул два из них. Любые два.

А почему так случилось?

Кстати, а как ты относишься к ДСЛ?
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[15]: почему вы используете регулярные выражения?
От: mrTwister Россия  
Дата: 17.01.11 21:52
Оценка: -1
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, Sinclair, Вы писали:


S>>Нет, разговор шёл про то, что требование знать +1 язык автоматически увеличивает стоимость кадров.

WH>Ну так и надо выкинать все кроме немерла.
WH>Писать на нем всегда проще чем на C#.
WH>Под .НЕТ нужны только два языка. Немерле и C++/CLI (для жесткого интеропа с легаси кодом).

Нет бога, кроме Аллаха и Мухаммед, пророк его.
лэт ми спик фром май харт
Re[19]: почему вы используете регулярные выражения?
От: jazzer Россия Skype: enerjazzer
Дата: 17.01.11 22:34
Оценка: -1
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, jazzer, Вы писали:


WH>>>Это просто пример того что из людей получаются хреновые компиляторы.

J>>Идиотский пример, потому что нет постановки задачи.
WH>Тем не менее ты запутался в 4х символах...
Ну и что к реальной жизни это не имеет отношения.

J>>Обычно задачи на регэкспы ставят не в виде "я тут хню написал, она всю память сожрала, помогить оптимизировать", а "вот есть такие строчки, хочу ее матчить, напишите регэксп".

WH>А тебе не кажется странным само наличее таких проблем?
нет.
Это проблема из серии "На С# можно написать тормозную сортировку пузырьком".
Любая фича подразумевает misuse, а иногда и abuse.
Посмотри на извращенческие примеры nikov-a относительно темных мест стандарта и грамматики шарпа — это имеет какое-то отношение к реальному программированию на шарпе?
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[23]: почему вы используете регулярные выражения?
От: jazzer Россия Skype: enerjazzer
Дата: 17.01.11 22:41
Оценка: -1 :)
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, jazzer, Вы писали:


WH>>> Я могу добавить их в свой движок минут за 30

J>>Ну тогда твой движок перестанет быть пегом и станет регэкспом, не?
WH>Нет.
ну что ж, тогда код в студию

J>>Вон, даже гугл отказался

WH>Аппеляция к авторитету == слив.
код в студию

J>>в RE2 от попыток сделать быстрые регэкспы с бэкреференсами — они их там просто запретили.

WH>Так семантика регексов не позволяет делать быстрые бекреференсы, а с пегом проблем нет.
в студию!
посмотрим, как быстро он сможет парсить бэкреференсы с квантификаторами.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[24]: почему вы используете регулярные выражения?
От: WolfHound  
Дата: 17.01.11 23:22
Оценка:
Здравствуйте, jazzer, Вы писали:

J>в студию!

J>посмотрим, как быстро он сможет парсить бэкреференсы с квантификаторами.
Разберись с тем что такое ПЕГ и как там работает бэктрекинг и тебе все станет ясно.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[15]: почему вы используете регулярные выражения?
От: Sinclair Россия https://github.com/evilguest/
Дата: 18.01.11 05:04
Оценка: +2
Здравствуйте, WolfHound, Вы писали:

WH>Ну так и надо выкинать все кроме немерла.

Нда. Массовые расстрелы — основа демократии.
WH>Писать на нем всегда проще чем на C#.
WH>Под .НЕТ нужны только два языка. Немерле и C++/CLI (для жесткого интеропа с легаси кодом).
Максимализм на марше.

S>>Лично я сейчас людей не менеджу, но у меня стойкое отвращение к идее наращивать количество языков. У нас и так основной код написан сразу на трёх языках. С удовольствием бы выкинул два из них. Любые два.

WH>А почему так случилось?

По историческим причинам. C++ — потому что десять лет назад среди некоторых товарищей бытовало мнение, что тру перформанса из управляемой среды не выжать. Java — потому что единственная кроссплатформенная управляемая среда на данный момент. .Net (C#) — потому, что HMC написан в значительной мере на нём, и вообще, под винду (при наличии выбора) лучше писать на дотнете.

WH>Кстати, а как ты относишься к ДСЛ?

Сложно.
Основная проблема — документированность. Generic Languages обычно хорошо документированы. Для up-to-date документирования библиотек на основных языках решения есть, есть стандарты этой документации. То есть понятны задачи и способы их решения.
Для DSL документация — это какая-то страничка в корпоративной вики, написанная на албанском английском четыре года назад. В итоге стоимость вхождения в DSL получается высокой.

Она в некоторой мере компенсируется тем, что удачный DSL получается достаточно компактным, по сравнению с кодом на Generic Language, что иногда позволяет вьехать в него даже быстрее, чем в какую-то развесистую библиотеку.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[25]: почему вы используете регулярные выражения?
От: jazzer Россия Skype: enerjazzer
Дата: 18.01.11 06:52
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, jazzer, Вы писали:


J>>в студию!

J>>посмотрим, как быстро он сможет парсить бэкреференсы с квантификаторами.
WH>Разберись с тем что такое ПЕГ и как там работает бэктрекинг и тебе все станет ясно.
Переходим на личности?
Ты тогда тоже разберись, что такое регэкспы и как там работает ".*", и тебе тоже все станет ясно.
В ПЕГе в принципе нет понятия "последовательность любых символов с откатом" (т.е. оно есть, но не имеет смысла, так как такое правило просто съест всю строчку до конца), поэтому мне придется написать грамматику для этой последовательности, чтоб она не съела больше, чем нужно — очевидный оверкилл для большинства случаев, когда тебе нужно что-нть по-быстрому найти.

вот тебе простейший пример: "std::vector<(.+), std::allocator<\1>>".
Напиши такой в ПЕГе, сравним сложность.

Вот пример работы этого регэкспа в перле:
  Скрытый текст
foreach ( "std::vector<char, std::allocator<char>>"
        , "std::vector<std::vector<int, std::allocator<int>>, "
           ."std::allocator<std::vector<int, std::allocator<int>>>>"
        , "std::vector<std::vector<std::vector<double, std::allocator<double>>, "
           ."std::allocator<std::vector<double, std::allocator<double>>>>, "
           ."std::allocator<std::vector<std::vector<double, std::allocator<double>>, "
           ."std::allocator<std::vector<double, std::allocator<double>>>>>>"
) {
  print;
  print m/^std::vector<(.+), std::allocator<\1>>/
          ? "\nMATCHED, element is: $1\n\n"
          : "\nNOT MATCHED\n\n";
}

вывод:
  Скрытый текст
std::vector<char, std::allocator<char>>
MATCHED, element is: char

std::vector<std::vector<int, std::allocator<int>>, std::allocator<std::vector<int, std::allocator<int>>>>
MATCHED, element is: std::vector<int, std::allocator<int>>

std::vector<std::vector<std::vector<double, std::allocator<double>>, std::allocator<std::vector<double, std::allocator<double>>>>, std::allocator<std::vector<std::vector<double, std::allocator<double>>, std::allocator<std::vector<double, std::allocator<double>>>>>>
MATCHED, element is: std::vector<std::vector<double, std::allocator<double>>, std::allocator<std::vector<double, std::allocator<double>>>>
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[16]: почему вы используете регулярные выражения?
От: WolfHound  
Дата: 18.01.11 09:12
Оценка: 1 (1) +1
Здравствуйте, Sinclair, Вы писали:

S>Нда. Массовые расстрелы — основа демократии.

S>Максимализм на марше.
Заметь это твоя идея.
Я лишь назвал язык который по моему мнению надо оставить.

S>По историческим причинам. C++ — потому что десять лет назад среди некоторых товарищей бытовало мнение, что тру перформанса из управляемой среды не выжать.

Я бы не сказал что они не правы если говорить про .НЕТ и жабу.
Вопрос насколько этот самый тру перформанс нужен.

S>Java — потому что единственная кроссплатформенная управляемая среда на данный момент. .Net (C#) — потому, что HMC написан в значительной мере на нём, и вообще, под винду (при наличии выбора) лучше писать на дотнете.

А что такое HMC?

S>Для DSL документация — это какая-то страничка в корпоративной вики, написанная на албанском английском четыре года назад. В итоге стоимость вхождения в DSL получается высокой.

Те проблема только в доках?

S>Она в некоторой мере компенсируется тем, что удачный DSL получается достаточно компактным, по сравнению с кодом на Generic Language, что иногда позволяет вьехать в него даже быстрее, чем в какую-то развесистую библиотеку.

Она компенсируется не в "некоторой" мере, а при сколь нибудь длительном испольщовании ДСЛ зарулит генерик язык в такие минусы что даже говорить не о чем.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[7]: почему вы используете регулярные выражения?
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 18.01.11 09:42
Оценка: +1
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, netch80, Вы писали:


N>>По сути я уже сказал — если применять инструмент не по назначению, можно много интересного получить. Но бесполезного.

WH>Что значит не по назначению?
WH>А что за назначения у регексов как не текст разбирать?

Текст — может быть, но не грамматику. Это не их предназначение, это натяжка, иногда удобная и даже работающая.
The God is real, unless declared integer.
Re[17]: почему вы используете регулярные выражения?
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 18.01.11 09:45
Оценка: +1
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, Sinclair, Вы писали:


S>>Нда. Массовые расстрелы — основа демократии.

S>>Максимализм на марше.
WH>Заметь это твоя идея.
WH>Я лишь назвал язык который по моему мнению надо оставить.

Дай Nemerle хотя бы под JVM, и мы начнём его рассматривать. А лучше — под LLVM или native. А на сейчас — его не существует для тех, кто хочет выйти за пределы десктопа.
The God is real, unless declared integer.
Re[8]: почему вы используете регулярные выражения?
От: WolfHound  
Дата: 18.01.11 10:34
Оценка:
Здравствуйте, netch80, Вы писали:

N>Текст — может быть, но не грамматику. Это не их предназначение, это натяжка, иногда удобная и даже работающая.

Какую грамматику? Ты не забыл о чем разговор?
Чтобы выцепить ключевые слова никакой грамматики не надо. Достаточно регулярных выражений. Причем в каноническом понимании этого слова. Тех самых которые разбираются при помощи ДКА.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[18]: почему вы используете регулярные выражения?
От: WolfHound  
Дата: 18.01.11 10:41
Оценка:
Здравствуйте, netch80, Вы писали:

N>Дай Nemerle хотя бы под JVM, и мы начнём его рассматривать. А лучше — под LLVM или native. А на сейчас — его не существует для тех, кто хочет выйти за пределы десктопа.

Во первых не стоит списывать со счетов виндовые серверы. Они очень не плохо работают.
Во вторых моно никто не отменял.
Ну и у Н2 со временем будут сменные бекенды.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[17]: почему вы используете регулярные выражения?
От: Sinclair Россия https://github.com/evilguest/
Дата: 18.01.11 14:06
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Заметь это твоя идея.

WH>Я лишь назвал язык который по моему мнению надо оставить.
Нет. Я сказал, что хотелось бы оставить один. Ты говоришь — надо оставить.

При этом из трёх языков выбор однозначно в пользу четвёртого

WH>Я бы не сказал что они не правы если говорить про .НЕТ и жабу.

WH>Вопрос насколько этот самый тру перформанс нужен.
Именно. В приложениях нашего типа важнее тру скалабилити и тру стабилити. Перформанс достигается за счёт того, чтобы пересылать меньше данных между хостами и за счёт написания более удачных SQL запросов. Перформанс операций типа i++ не играет вообще никакой роли.

WH>А что такое HMC?

Hosted Messaging and Collaboration
WH>Те проблема только в доках?
Ага.

S>>Она в некоторой мере компенсируется тем, что удачный DSL получается достаточно компактным, по сравнению с кодом на Generic Language, что иногда позволяет вьехать в него даже быстрее, чем в какую-то развесистую библиотеку.

WH>Она компенсируется не в "некоторой" мере, а при сколь нибудь длительном испольщовании ДСЛ зарулит генерик язык в такие минусы что даже говорить не о чем.
На практике я пока этого не наблюдал. Применение DSL — видел, большой выхлоп — нет. Продолжаю надеяться и ждать.
Много факторов дополнительных есть — в том числе и наличие инструментария по построению DSL.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[18]: почему вы используете регулярные выражения?
От: WolfHound  
Дата: 18.01.11 15:10
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Нет. Я сказал, что хотелось бы оставить один. Ты говоришь — надо оставить.

S>При этом из трёх языков выбор однозначно в пользу четвёртого
Вот только словоблудее разводить не надо.

WH>>Те проблема только в доках?

S>Ага.
Ну так чем доки на ДСЛ оличаются от док на библиотеку?
Для внутренних библиотек доки как правило находятся в томже состоянии что ты написал про ДСЛ.

S>На практике я пока этого не наблюдал. Применение DSL — видел, большой выхлоп — нет. Продолжаю надеяться и ждать.

А вот я наблюдал.
Например парсер C#4 сделанный за две недели по вечерам.
Без ДСЛ небыло бы ни парсера ни той весьма не маленькой скорости разбора что он дает.

Еще сам делал язык для общения демонов. В результате прикладники (которых много) меняли поведение моего демонического кластера как им хотелось не трогая меня.
Были рады все.

S>Много факторов дополнительных есть — в том числе и наличие инструментария по построению DSL.

Немерле весьма не плох. Второй вообще конфеткой будет.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[19]: почему вы используете регулярные выражения?
От: Sinclair Россия https://github.com/evilguest/
Дата: 18.01.11 17:03
Оценка: :)
Здравствуйте, WolfHound, Вы писали:
WH>Ну так чем доки на ДСЛ оличаются от док на библиотеку?
Тем что для библиотеки есть возможность написать Doc Comments, и дока сгенерится. Для очень большой доли сценариев этого достаточно. Устраняется избыточный творческий фактор.
Для DSL придётся изобретать формат и структуру документации самостоятельно, что и является шоу-стоппером.

WH>Еще сам делал язык для общения демонов. В результате прикладники (которых много) меняли поведение моего демонического кластера как им хотелось не трогая меня.

Вот это — убедительный пример. Хотелось бы подробностей.

S>>Много факторов дополнительных есть — в том числе и наличие инструментария по построению DSL.

WH>Немерле весьма не плох. Второй вообще конфеткой будет.
Было бы здорово.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[20]: почему вы используете регулярные выражения?
От: WolfHound  
Дата: 18.01.11 18:17
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Для DSL придётся изобретать формат и структуру документации самостоятельно, что и является шоу-стоппером.

На грамматику можно повесить теже самые Doc Comments.
С семантикой сложнее. Но для сложной либы тоже одними Doc Comments не отделаешься.

S>Вот это — убедительный пример. Хотелось бы подробностей.

Это был стековй (хотя наверное надо было делать регистровый ибо локальное хранилище считай регстры всеравно было), load/store (созранение/загрузка одни команды обработка другие), XML-based (ибо он изначально создавался под генерацию кода демонами) язычек в котором описывалось какие данные из распределенного хранилища поднять, что и как с ними сделать и куда их сохранить.
Все это с поддержкой транзакций, фаиловера и тому подобным.
Также данные могли приходить вместе со скриптом. Тогда они помещались в "локальное хранилище".

Изначально начальство хотело певесить прикладную логику на меня. Но когда я понял что буду узким местом в трех проектах (и на горизонте еще маячили...) я сделал интерпритируемый ДСЛ.
Интерпритируемость ни на что не влияла ибо каждая из команд могла выполняться до нескольких секунд.
Соответственно ко мне приходили всего несколько раз когда нужно было добавить еще команд, а не каждый день когда у них там что-то менялось.
Им тоже было хорошо ибо ко мне и без них очередь была не слабая, а так они могли сами пару строк в своем коде поправить. Да и поэксперементировать на тестовом кластере можно было без проблем.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[19]: почему вы используете регулярные выражения?
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 18.01.11 20:24
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, netch80, Вы писали:


N>>Дай Nemerle хотя бы под JVM, и мы начнём его рассматривать. А лучше — под LLVM или native. А на сейчас — его не существует для тех, кто хочет выйти за пределы десктопа.

WH>Во первых не стоит списывать со счетов виндовые серверы. Они очень не плохо работают.

Для моих задач это даже не под микроскопом, этого просто нет.

WH>Во вторых моно никто не отменял.


Моно — УГ.

WH>Ну и у Н2 со временем будут сменные бекенды.


"Не кажи гоп..."
Когда они будут и начнут работать, тогда и начнём смотреть. Не раньше.
The God is real, unless declared integer.
Re[21]: почему вы используете регулярные выражения?
От: Sinclair Россия https://github.com/evilguest/
Дата: 19.01.11 03:02
Оценка:
Здравствуйте, WolfHound, Вы писали:
WH>На грамматику можно повесить теже самые Doc Comments.
Это место мне непонятно. Можно пример?
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[22]: почему вы используете регулярные выражения?
От: WolfHound  
Дата: 19.01.11 14:48
Оценка:
Здравствуйте, Sinclair, Вы писали:

WH>>На грамматику можно повесить теже самые Doc Comments.

S>Это место мне непонятно. Можно пример?
Берем например парсер C#
http://code.google.com/p/nemerle/source/browse/nemerle/trunk/snippets/csharp-parser/CSharpParser/Parser.n
И пишем Doc Comments на каждое правило.
Типа так:
            /// <summary>
            /// Any character
            /// </summary>
      any                     = ['\u0000'..'\uFFFF'];
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[16]: почему вы используете регулярные выражения?
От: VladD2 Российская Империя www.nemerle.org
Дата: 19.01.11 20:29
Оценка: 9 (4) +2 :)
Здравствуйте, mefrill, Вы писали:

M>Нет такой проблемы, а есть теорема о том, что каждый НКА может быть преобразован в ДКА, допускающий тот же язык. ДКА разбирает любую строку за время O(n), где n -- длина этой строки. В этом и состоит сермяжный смысл задания шаблонов с помощью регулярных выражений. Есть теорема Клини, которая гласит: классы автматных и регулярных языков совпадают. Это, в частности, означает, что для каждого регуляного выражения можно построить ДКА, допускающий в точности тот же язык, что опсиан регулярным выражением. Проблема с перловыми регулярками в том, что они расширили синтаксис языка регулярных выражений для ссылки на группы, выделенные в начале. Это ведет к неоднозначностям и необходимости откатов (если выбран поиск в глубину). Последнее, в свою очередь, ведет к тому, что невозможно построить ДКА для такого выражения. Вынужденно работать с НКА на этапе компиляции и пытаться строить ДКА методом ленивого вычисления подмножеств -- не есть хорошо. Поэтому такие компании, как Google и Яндекс недавно выпустили свои версии поисковых движков на основе регулярных выражений (https://github.com/dprokoptsev/pire и http://code.google.com/p/re2/).


Вот так пользуясь вполне вменяемыми научными теориями и реальными ссылками можно сделать в корне не верные выводы.

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


Факт в том, что регулярки на основе ДКА очень ограничены в применении (неудобны). А те что имеют много фич как один используют худшие варианты бэктрэкинда, а значит НКА.

M>Кроме того, могут быть проблемы с построением из ПОИСКОВОГО НКА с обратными ссылками соответствующего ДКА. Состояний в некоторых случаях может набраться сотни тысяч, автомат раздувается. Хотя это проблема не метода, а ресурсов.


Это проблема тех кто пытается использовать такие решения.

M>Принципиальное отличие регулярок от PEG -- это возможность построения оптимального линейного поискового движка.


Это бред. Как было замечено выше. 90% регулярок не используют ДКА по куче соображений. Те что используют дико ограничены в возможностях и далеко не такие шустрые как ты тут пыташеся описать.

Дело в том, что важны не только теории, но и проблемы реализации этих теорий на базе конкретного железа, конкретных ЯП и конкретных компиляторов.

M>Грамматики PEG, насколько я понимаю, иногда даже в рамки КС-языков не укладываются, поэтмоу сравнивать их с регулярками все равно, что сравнивать теплое с мягким.


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

Собственно WolfHound это и проделал (с нашей помощью). В итоге мы получили решение которое не уступает в скорости ни лучшим ДКА-ным движкам регексов, ни лучшим генераторам парсеров. А имеющиеся на дотнете реализации регулярок он рвет настолько жестого, что их даже стыдно с ним сравнивать.

И это как бы не теоретические рассуждения в которых может быть море ошибок просто из-за того, что не учитываются мелкие детали. Это факт который можно скачать и попробвать в действии.

А теперь о главном

Сейчас WolfHound тратит время на совершенно бессмысленные споры с тобой и окружающими. А тем временем развитие мега-крутого движка парсинга на основе PEG-а (сделанного WolfHound-ом) стоит на месте!

Он уже где-то пол года обещает сделать наш движок расширяемым динамически. Ты хорошо рассылшал? Ага. Движок который рвет все статические движки еще к тому же может (и будет) расширяться динамически!

Так вот давайте как все вместе перестанем спорить и попросим нашего уважаемого WolfHound перестать заниматься херней (спорить с теоретиками) и таки сделает то что нам нужно по зарез!
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[22]: почему вы используете регулярные выражения?
От: VladD2 Российская Империя www.nemerle.org
Дата: 19.01.11 20:35
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Ну тогда твой движок перестанет быть пегом и станет регэкспом, не?


Нет. Бэки не нужны просто потому, что есть именованные правила и предикаты. Это в сто раз круче.

J>Вон, даже гугл отказался в RE2 от попыток сделать быстрые регэкспы с бэкреференсами — они их там просто запретили.


Они ограничивают функционал, чтобы влезть в рамки ДКА. Вот только наша реализация ПЕГ-а скорее всего порвет эти RE2 без этих ограничений. Ну, если и не порвет, то будет давать очень близкие результаты.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[24]: почему вы используете регулярные выражения?
От: VladD2 Российская Империя www.nemerle.org
Дата: 19.01.11 20:37
Оценка:
Здравствуйте, jazzer, Вы писали:

J>посмотрим, как быстро он сможет парсить бэкреференсы с квантификаторами.


А с какой целью они тебе нужны? Покажи правило которое без них ты не можешь разобрать.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[26]: почему вы используете регулярные выражения?
От: VladD2 Российская Империя www.nemerle.org
Дата: 19.01.11 20:42
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Ты тогда тоже разберись, что такое регэкспы и как там работает ".*", и тебе тоже все станет ясно.

J>В ПЕГе в принципе нет понятия "последовательность любых символов с откатом" (т.е. оно есть, но не имеет смысла, так как такое правило просто съест всю строчку до конца), поэтому мне придется написать грамматику для этой последовательности, чтоб она не съела больше, чем нужно — очевидный оверкилл для большинства случаев, когда тебе нужно что-нть по-быстрому найти.

Это по по незнанию лепишь. На самом деле есть и понятие, и применять его очень даже можно. Вот как, например, выглядит правило разбора сишного комментария:
delimitedComment          = "/*" (!"*/" any)* "*/";

any — это и есть твоя точка. Просто то что делается на "умности" "*" в регексах в ПЕГе делается на предиткатах.
И что характерно, на практике это намного удобнее. Ведь ".*" в регексах найдет последнее хождение того что идет за ним, а это как раз обычно никому не нужно.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[21]: почему вы используете регулярные выражения?
От: VladD2 Российская Империя www.nemerle.org
Дата: 19.01.11 20:57
Оценка:
Здравствуйте, Klatu, Вы писали:

K>Здравствуйте, hardcase, Вы писали:


H>>Пакрат обычно не реализуется вообще — он дико медленный


K>Интересно, почему так получается?


На саомо деле это не совсем так. Во-первых есть куча поделок использующих чистых Пакрат. Но они тормозные. Скорость линейно низкая .

Кроме того есть реализация Rats! которая исходит из тотальной мемоизации и вводит кучу оптимизаций уменьщающих негативное влияние этой самой мемоизации на "константу" времени. В итоге они сделали вполне себе применимый на практике генератор парсеров который практически гарантирует линейное время.

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

Именно так и было сделано в ПегГраммаре о котором говорит веольфхаунд. Он начал с чистого Пакрата, но в итоге получился совсем другой алгоритм.

Секрет в том, что 99% грамматик компьютерных языков это "почти LL(1) граммитики". Но вот это почти делает создание парсеров для них на чем-то вроде LL(k) или LARL(1) мучительным до безобразия.

Большая часть реальных парсеров по прежнему пишется вручную методом рекурсивного списка. Это позволяет сделать в основном простой парсер и разрулить сложные места врукопашную.

Так вот ПегГраммар делает тоже самое. Он оптимизирует эти самые 99% так как только может. Для разбора регулярной части используется ДКА (причем не табличный, а генерированный). Для нивилирования откатов используется частичная мемоизация. Ну, и сам он написан так чтобы не тратить такты зря. Первое что было предложено — это использовать в качестве позиции и информации об успехе парсинга одну переменную типа int. Почему-то большинство тех кто реализует ПЕГ до этого не додумываются. Далее была сделана отимизация правил (переписывание) и инлайнинг. Потом ДКА и мемоизация. В купе это дало очень приличную скорость. Многие в ручную написанным парсером такую обеспечить не могут.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[21]: почему вы используете регулярные выражения?
От: VladD2 Российская Империя www.nemerle.org
Дата: 19.01.11 21:02
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>Почему? Идея пакрата, как я понимаю, это "мемоизируем все". Т.е. по идее это не должно бы приводить к "дико медленный". К тому же автор декларировал линейное время парсинга, откуда бы взяться тормозам?


Линейное и быстрое не синонимы . Линейное время он гарантирует. Но формула у его линейности такая:
O(C)
C = N * P * P_size

Где "C" — это константа потребления памяти.
N — это количество символов в разбираемой строке.
P — количество правил в грамматике.
P_size — средний размер структур данных занимаемых под представление состояния мемоизации.
В итоге C для сложных грамматик и больших файлов получается весьма большим. И то что скорость линейная — это не радует, так как на каждый шаг требуется слишком много времени.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[23]: почему вы используете регулярные выражения?
От: VladD2 Российская Империя www.nemerle.org
Дата: 19.01.11 21:08
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>А если мемоизировать не все, то будет быстрее линейнего что ли?


Для большей части входных строк — да.

ВВ>Мне интересно:

ВВ>- Пакрат реально дает O(n) или это только в теории, а на практике это не O(n)? Если да, то почему так происходит.
ВВ>- Если излишняя мемоизация вредна, но по каким критерием определяется, что мемоизировать, а что нет?

Ответ таков. Ты не понимаешь что такое линейное время.

Представь себе, что мы имеем линейный алгоримт. Это быстро или медленно?
Правильный ответ — ни то и ни другое.

Скажем если мы имеем линеный алгоритм парсинга который на распознование каждого символа тратит 0.01 секунды, то на разбор уже килобайта информации у него уйдет секунда! А на мегабайт 10.

В то же время не линеный алгоритм может показывать экспоненциальный рост времени разбора, то только в очень экзатических случаях. Зато в 99% реальных случаев он может показывать очень высокую скорость, так как в среднем на один символ будет тратить не 0.01 секунды, а 0.0000001.

Так вот линейный алгоримт это когда у него на каждый символ всегда 0.01 или 0.00001. А не линейный, это когда иногда 0.00001, а иногда 0.01.

Так что линейность хороша только в теории. На практике важна не линейность, а практическая применимость. Вот Пакрат линейный, но практически не применимый. А наш алгоритм не линейный, но очень быстрый на практике.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[18]: почему вы используете регулярные выражения?
От: VladD2 Российская Империя www.nemerle.org
Дата: 19.01.11 21:10
Оценка:
Здравствуйте, DarkGray, Вы писали:

DG>из-за того, что промежуточные результаты парсинга запоминаются, а из свойств packrat-а следует, что применение конкретного правила к конкретной позиции — всегда выдает один и тот же результат (в независимости от предыдущих вызовов),

DG>то выполнение не может быть хуже, чем: длина текста * кол-во правил

Может. На практике — может. Рост таблицы мемоизации делает ее менее эффективной. Плюс память может начать не влезать в оперативку и пойти в своп. А это сам понимаешь приведет резкому замедлению работы парсера при увеличении размера входной строки.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[20]: почему вы используете регулярные выражения?
От: VladD2 Российская Империя www.nemerle.org
Дата: 19.01.11 21:14
Оценка:
Здравствуйте, jazzer, Вы писали:

WH>>>>Это просто пример того что из людей получаются хреновые компиляторы.

J>>>Идиотский пример, потому что нет постановки задачи.
WH>>Тем не менее ты запутался в 4х символах...
J>Ну и что к реальной жизни это не имеет отношения.

Реальная жизнь таковая, что лично я не раз запутывался в регексах размером с пол предложения что я сейчас написал.
Может я конечно дебил. Тогда это все объясняет.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[14]: почему вы используете регулярные выражения?
От: VladD2 Российская Империя www.nemerle.org
Дата: 19.01.11 21:36
Оценка:
Здравствуйте, olegkr, Вы писали:

WH>>А ты пробовал?

O>Зачем мне это нужно? У меня есть выбор
O>1) Написать пару строк на дотнете, заюзав стандартный фреймворк
O>2) Поставить немерле, добавить новый проект в солюшн, изучить синтаксис, потрахаться, поругаться с менеджером, провести неделю в митингах с подчиненными индусами

O>Кто в здравом уме выберет пункт 2?


Тот кто решает действительно сложные задачи и хочет решать их проще (умнее).
Но те кто выбирает индусов явно не из этого круга. Им Немерл все равно что самолет обезьяне.

WH>>Это генератор C# из ПЕГа?

O>Это обычный регексп, которого хватает на все сто. Объясни мне причины по которым я должен перейти не пег? Скорость парсинга и рекурсия меня не интересуют.

Причин нет. Каковы задачи таковы и инструменты. Если задачи примитивные, значит и тупых инструментов (да и тупых исполнителей) хватит.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[17]: почему вы используете регулярные выражения?
От: VladD2 Российская Империя www.nemerle.org
Дата: 19.01.11 21:47
Оценка:
Здравствуйте, Ziaw, Вы писали:

Z>Обычно генератор подразумевает свой язык. Как инструмент они ничем не отличаются от nemerle. Хоть ANTLR, хоть Coco/R, у тебя в проекте появится код на их языке. И тебе придется что-то устанавливать, чтобы получить IDE для разработки. В чем отличия-то?


А это феномен, кстати! Люди не боятся кривых сложных языков которые не конкурируют с их любимым языком общего назначения. Но как огня боятся языка который может заменить им их любимый язык.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[21]: почему вы используете регулярные выражения?
От: VladD2 Российская Империя www.nemerle.org
Дата: 19.01.11 21:48
Оценка:
Здравствуйте, Ziaw, Вы писали:

Z>Ну не такая уж она и существенная, надо лишь сделать аналогичный макрос принимающий грамматику в виде строки, превращающий ее в аст и вызывающий старый макрос. Вообще это надо бы сделать, хотя бы для использования пегпарсера в виде библиотеки и компиляции грамматик в рантайме. Может займусь через некоторое время.


Тогда уж можно просто внешинй ДСЛ залудить. Но все равно бояться будут.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[15]: почему вы используете регулярные выражения?
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 19.01.11 21:50
Оценка: :)
Здравствуйте, VladD2, Вы писали:

VD>Тот кто решает действительно сложные задачи и хочет решать их проще.

Что ты считаешь проще?
На текущем уровне работа с nemerle ведет к большим трудозатратам, чем на C#\VB для типовых задач.
Это как всегда связано документацией и инструментами.
Re[12]: почему вы используете регулярные выражения?
От: VladD2 Российская Империя www.nemerle.org
Дата: 19.01.11 21:53
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Чтобы PEG заменил регекспы, нужно, чтобы он стал

S>а) очень-очень распространён. Чтобы можно было за $28 купить или за $7.99 скачать книгу O'Reilly про него, где всё обсосано до мелочей. Чтобы библиотеки с его поддержкой (совместимые по способу использования!!!) были широко доступны на всех основных языках разработки.
S>б) применим для мелких масштабов. Чтобы можно было применять его для проверки, поиска и замены коротких цепочек.
S>в) применим для непрограммистов. Чтобы "грамматику" или что там у него вместо строки регекспа можно было скормить в мою программу через несложный UI (или конфиг-файл), не привлекая IDE c code completion и билд-машину.

+1 По этому следующие 10 лет мы (пользователи немрла) будем пользоваться плодами прогресса, а вы каменным молотком. Ну, если конечно не хотите присоединиться к нам.

Мы вот сейчас начали проект Nemerle 2. В нем макросы будут с использованием PEG-а сделаны.

Не хочешь присоединиться?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[18]: почему вы используете регулярные выражения?
От: VladD2 Российская Империя www.nemerle.org
Дата: 19.01.11 22:06
Оценка: +1
Здравствуйте, netch80, Вы писали:

N>Дай Nemerle хотя бы под JVM, и мы начнём его рассматривать. А лучше — под LLVM или native. А на сейчас — его не существует для тех, кто хочет выйти за пределы десктопа.


Уверен, что появись указанные бэкэнды у тебя найдутся новые отговорки.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[20]: почему вы используете регулярные выражения?
От: VladD2 Российская Империя www.nemerle.org
Дата: 19.01.11 22:11
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>>>Много факторов дополнительных есть — в том числе и наличие инструментария по построению DSL.

WH>>Немерле весьма не плох. Второй вообще конфеткой будет.
S>Было бы здорово.

Дык оно уже есть. Надо только отвлечься от форумов немного и попробовать то о чем ведешь разговор. Я вот попробовал и остался доволен. И я вроде как не один.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[14]: почему вы используете регулярные выражения?
От: VladD2 Российская Империя www.nemerle.org
Дата: 19.01.11 22:16
Оценка:
Здравствуйте, DarkGray, Вы писали:

WH>>А у меня это один язык.


DG>очень спорное утверждение.


Один, один. Просто он расширяемый. В этом языке и if — это тоже макрос.

ДСЛ становится частью языка. В этом то и кайф.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[10]: почему вы используете регулярные выражения?
От: VladD2 Российская Империя www.nemerle.org
Дата: 19.01.11 22:18
Оценка:
Здравствуйте, olegkr, Вы писали:

WH>>Вот только нормальный человек создат проект на немерле и получит интелесенс и море других плюшек.

O>Таких "нормальных" людей можно пересчитать по пальцам

Нормальных людей (без кавычек) крайне мало. Миром правит посредственность, лень и глупость.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[23]: почему вы используете регулярные выражения?
От: Sinclair Россия https://github.com/evilguest/
Дата: 20.01.11 05:24
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Берем например парсер C#

WH>http://code.google.com/p/nemerle/source/browse/nemerle/trunk/snippets/csharp-parser/CSharpParser/Parser.n
WH>И пишем Doc Comments на каждое правило.
WH>Типа так:
WH>
WH>            /// <summary>
WH>            /// Any character
WH>            /// </summary>
WH>      any                     = ['\u0000'..'\uFFFF'];

WH>

Ок, и что мы получаем на выходе?
Ну, чтобы сравнить с докой по Generic Language.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[25]: почему вы используете регулярные выражения?
От: jazzer Россия Skype: enerjazzer
Дата: 20.01.11 05:42
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, jazzer, Вы писали:


J>>посмотрим, как быстро он сможет парсить бэкреференсы с квантификаторами.


VD>А с какой целью они тебе нужны? Покажи правило которое без них ты не можешь разобрать.


ты издеваешься, что ли? Мало того, что я постил это уже раз десять в этом и близких по смыслу топиках, так тут же, прямо рядом с этим сообщением, в ответе WH, лежит пример такого регэкспа.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[21]: почему вы используете регулярные выражения?
От: jazzer Россия Skype: enerjazzer
Дата: 20.01.11 06:18
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, jazzer, Вы писали:


WH>>>>>Это просто пример того что из людей получаются хреновые компиляторы.

J>>>>Идиотский пример, потому что нет постановки задачи.
WH>>>Тем не менее ты запутался в 4х символах...
J>>Ну и что к реальной жизни это не имеет отношения.

VD>Реальная жизнь таковая, что лично я не раз запутывался в регексах размером с пол предложения что я сейчас написал.

VD>Может я конечно дебил. Тогда это все объясняет.
Я думаю, есть гораздо более простое объяснение — ты живешь в винде.
Те, кто работают в юниксе, никаких проблем с регэкспами не испытывают, потому что это повседневный инструмент, которым пользуешься по 10 раз на дню, не задумываясь.
А в винде даже чтоб с банальных CSV-файлом поработать, придется его в Excel грузить (и молиться, чтоб влез).
А для чуть более хитрых форматов (обычные лог-файлы, например — у них грамматика очень условная) — специальные смотрелки писать/покупать.
В юниксе же работа со всеми такими текстовыми файлами идет в командной строке и любая интересующая тебя информация достается набором простейших регэкспов, в результате необходимая информация достается на несколько минут, практически независимо от синтаксиса лог-файла (просто потому, что никто лог-файлы не делает рекурсивными и прочая). В подавляющем большинстве случаев ПЕГ будет для таких задач оверкиллом. Мне даже не приходит в голову задача парсинга лог-файлов, для которой ПЕГ предоставил бы лучшее решение.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[27]: почему вы используете регулярные выражения?
От: jazzer Россия Skype: enerjazzer
Дата: 20.01.11 06:48
Оценка: -2
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, jazzer, Вы писали:


J>>Ты тогда тоже разберись, что такое регэкспы и как там работает ".*", и тебе тоже все станет ясно.

J>>В ПЕГе в принципе нет понятия "последовательность любых символов с откатом" (т.е. оно есть, но не имеет смысла, так как такое правило просто съест всю строчку до конца), поэтому мне придется написать грамматику для этой последовательности, чтоб она не съела больше, чем нужно — очевидный оверкилл для большинства случаев, когда тебе нужно что-нть по-быстрому найти.

VD>Это по по незнанию лепишь. На самом деле есть и понятие, и применять его очень даже можно.

Ну да, конечно, по незнанию. То, что это знают все, кто юзает Спирит, в котором всё это именно так и было реализовано бог знает сколько лет до того, как ты узнал слово ПЕГ, ничего не значит, конечно же.

VD>Вот как, например, выглядит правило разбора сишного комментария:

VD>
VD>delimitedComment          = "/*" (!"*/" any)* "*/";

Офигеть достоинство — дважды писать "*/". С каких это пор, интересно, копи-пейст стал крут
Сравни с регэкспом
/\* .*? \*/

Даже на такой простой задаче ПЕГ сливает в простоте использования. (Вернее сказать не "даже", а "особенно". ПЕГ хорош для парсинга сложных рекурсивных грамматик типа С++, а для простого поиска это очевидный оверкилл.)

VD>any — это и есть твоя точка. Просто то что делается на "умности" "*" в регексах в ПЕГе делается на предиткатах.

Предикат — это совсем не то, что ".*". Предикаты и в регэкспах есть (твой пример с комментарием можно написать в регэкспе вот так:
/\* ((?! \*/ ) . )* \*/

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

Но ты можешь попробовать меня переубедить: напиши ПЕГ-правило с предикатом для std::vector (в ответе WH). Т.е. я допускаю, что можно написать какой-нть невменяемый трехэтажный предикат, который сможет найти вектор векторов векторов, не остановившись на ближайшем std::allocator, но и это мне сомнительно.

VD>И что характерно, на практике это намного удобнее. Ведь ".*" в регексах найдет последнее хождение того что идет за ним, а это как раз обычно никому не нужно.

На практике намного удобнее иметь выбор. Когда мне это не нужно, я юзаю нежадные кванторы. Причем цена переключения с жадной версии на нежадную — один символ после квантора. ПЕГ предлагает что-нть подобное?
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[19]: почему вы используете регулярные выражения?
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 20.01.11 10:29
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, netch80, Вы писали:


N>>Дай Nemerle хотя бы под JVM, и мы начнём его рассматривать. А лучше — под LLVM или native. А на сейчас — его не существует для тех, кто хочет выйти за пределы десктопа.


VD>Уверен, что появись указанные бэкэнды у тебя найдутся новые отговорки.


С чего бы вдруг? По крайней мере по твоим рекламным агиткам это нормальный инструмент в стиле Хаскеля с Эрлангом, или даже лучше. Или ты хочешь сказать, что сильно приврал и на самом деле его использовать нельзя?
The God is real, unless declared integer.
Re[20]: почему вы используете регулярные выражения?
От: VladD2 Российская Империя www.nemerle.org
Дата: 20.01.11 13:43
Оценка:
Здравствуйте, netch80, Вы писали:

VD>>Уверен, что появись указанные бэкэнды у тебя найдутся новые отговорки.


N>С чего бы вдруг?


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

N>По крайней мере по твоим рекламным агиткам это нормальный инструмент в стиле Хаскеля с Эрлангом, или даже лучше. Или ты хочешь сказать, что сильно приврал и на самом деле его использовать нельзя?


Я что хотел то сказал.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[28]: почему вы используете регулярные выражения?
От: VladD2 Российская Империя www.nemerle.org
Дата: 20.01.11 13:53
Оценка: :)
Здравствуйте, jazzer, Вы писали:

VD>>Это по по незнанию лепишь. На самом деле есть и понятие, и применять его очень даже можно.

J>Ну да, конечно, по незнанию. То, что это знают все, кто юзает Спирит, в котором всё это именно так и было реализовано бог знает сколько лет до того, как ты узнал слово ПЕГ, ничего не значит, конечно же.

VD>>Вот как, например, выглядит правило разбора сишного комментария:

VD>>
VD>>delimitedComment          = "/*" (!"*/" any)* "*/";
J>

J>Офигеть достоинство — дважды писать "*/". С каких это пор, интересно, копи-пейст стал крут
J>Сравни с регэкспом
J>
J>/\* .*? \*/
J>


Ты заявлял, что аналога .* нет. Ну, так что по этому вопросу ты отказываешься от своих слов?

J>Даже на такой простой задаче ПЕГ сливает в простоте использования. (Вернее сказать не "даже", а "особенно". ПЕГ хорош для парсинга сложных рекурсивных грамматик типа С++, а для простого поиска это очевидный оверкилл.)


ПЕГ:
1. Обеспечивает разбор указанной грамматики за линейное время. РЕГ-ексы с не жадным оператором "*" используют бэктрэниг, что приводит к экспоненте.
2. Позволяет использовать предикаты любой сложности, что позволят разбирать текст намного проще чем с использованием регксов.
3. В разы проще в отладке.


VD>>any — это и есть твоя точка. Просто то что делается на "умности" "*" в регексах в ПЕГе делается на предиткатах.

J>Предикат — это совсем не то, что ".*". Предикаты и в регэкспах есть (твой пример с комментарием можно написать в регэкспе вот так:
J>
J>/\* ((?! \*/ ) . )* \*/
J>

J>непонятно, зачем, правда, когда есть более простой путь, выше).

Ну, вот и сравни читаемость. Плюс не забывай, что для ПЕГ-а есть алгоритм обеспечивающий разбор указанной грамматики за линейное время, а для регексов такого нет.

J>Но ты можешь попробовать меня переубедить: напиши ПЕГ-правило с предикатом для std::vector (в ответе WH). Т.е. я допускаю, что можно написать какой-нть невменяемый трехэтажный предикат, который сможет найти вектор векторов векторов, не остановившись на ближайшем std::allocator, но и это мне сомнительно.


Я даже не собираюсь мериться с тобой членами. У меня априори длиннее. Если тебе интересны примеры, то просто открой грамматику C#-а. Там есть примеры любой сложности.

VD>>И что характерно, на практике это намного удобнее. Ведь ".*" в регексах найдет последнее хождение того что идет за ним, а это как раз обычно никому не нужно.

J>На практике намного удобнее иметь выбор. Когда мне это не нужно, я юзаю нежадные кванторы. Причем цена переключения с жадной версии на нежадную — один символ после квантора. ПЕГ предлагает что-нть подобное?

Да, выбор хорошая штука. Жаль что ты его не имеешь. В прочем, тебе явно не нужно. Каменный молоток тебя явно устраивает.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[11]: почему вы используете регулярные выражения?
От: olegkr  
Дата: 20.01.11 16:29
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Нормальных людей (без кавычек) крайне мало. Миром правит посредственность, лень и глупость.

Понятно. Еще один "непонятый художник".
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Re[29]: почему вы используете регулярные выражения?
От: jazzer Россия Skype: enerjazzer
Дата: 20.01.11 16:55
Оценка: 1 (1)
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, jazzer, Вы писали:


VD>>>Это по по незнанию лепишь. На самом деле есть и понятие, и применять его очень даже можно.

J>>Ну да, конечно, по незнанию. То, что это знают все, кто юзает Спирит, в котором всё это именно так и было реализовано бог знает сколько лет до того, как ты узнал слово ПЕГ, ничего не значит, конечно же.

VD>>>Вот как, например, выглядит правило разбора сишного комментария:

VD>>>
VD>>>delimitedComment          = "/*" (!"*/" any)* "*/";
J>>

J>>Офигеть достоинство — дважды писать "*/". С каких это пор, интересно, копи-пейст стал крут
J>>Сравни с регэкспом
J>>
J>>/\* .*? \*/
J>>


VD>Ты заявлял, что аналога .* нет. Ну, так что по этому вопросу ты отказываешься от своих слов?

Я не заявлял, что аналога нет. Потому что "аналог" можно очень широко понимать, что ты и делаешь. Я заявлял, что функциональности ".*" в ПЕГе нет. И пока ты мне не продемонстрируешь ПЕГ, парсящий std::vector — твое утверждение о том, что функциональность такая есть, продолжит висеть в воздухе.


J>>Даже на такой простой задаче ПЕГ сливает в простоте использования. (Вернее сказать не "даже", а "особенно". ПЕГ хорош для парсинга сложных рекурсивных грамматик типа С++, а для простого поиска это очевидный оверкилл.)


VD>ПЕГ:

VD>1. Обеспечивает разбор указанной грамматики за линейное время. РЕГ-ексы с не жадным оператором "*" используют бэктрэниг, что приводит к экспоненте.
Наоборот, это жадные приводят к экспоненте, и то в патологических случаях. Ты разберись сначала, что такое жадные и нежадные кванторы, а потом пиши. Плюс в большинстве случаев использования регэкспов скорость вообще не является приоритетом. Особенно если это вменяемые регэкспы, а не какой-нибудь бред в стиле ".*.*.*".
VD>2. Позволяет использовать предикаты любой сложности, что позволят разбирать текст намного проще чем с использованием регксов.
Регэкспы тоже позволяют использовать предикаты любой сложности.
VD>3. В разы проще в отладке.
Измерение разов в студию.

VD>>>any — это и есть твоя точка. Просто то что делается на "умности" "*" в регексах в ПЕГе делается на предиткатах.

J>>Предикат — это совсем не то, что ".*". Предикаты и в регэкспах есть (твой пример с комментарием можно написать в регэкспе вот так:
J>>
J>>/\* ((?! \*/ ) . )* \*/
J>>

J>>непонятно, зачем, правда, когда есть более простой путь, выше).

VD>Ну, вот и сравни читаемость. Плюс не забывай, что для ПЕГ-а есть алгоритм обеспечивающий разбор указанной грамматики за линейное время, а для регексов такого нет.

Влад, ты вообще вдумываешься в то, что тебе пишут, или лишь бы ляпнуть? Ну да это твой стиль, чего я удивляюсь.
На всякий случай, для тех, кто в танке и не может посмотреть десятью строчками выше — для того, чтоб распарсить сишный комментарий, достаточно регэкспа /\*.*?\*/, в котором, в отличие от ПЕГа, не нужно писать */ дважды.

J>>Но ты можешь попробовать меня переубедить: напиши ПЕГ-правило с предикатом для std::vector (в ответе WH). Т.е. я допускаю, что можно написать какой-нть невменяемый трехэтажный предикат, который сможет найти вектор векторов векторов, не остановившись на ближайшем std::allocator, но и это мне сомнительно.


VD>Я даже не собираюсь мериться с тобой членами. У меня априори длиннее. Если тебе интересны примеры, то просто открой грамматику C#-а. Там есть примеры любой сложности.

Ой, ты что, так расстроился за ПЕГ, что воспринял его критику в свой адрес и решил, что кого-то интересует длина твоего члена? Ну прости, пожалуйста, я не думал, что ты такой чувствительный. Конечно же, у тебя длиннее, ты же модератор. И грудь у тебя априори больше, на случай, если ты девочка.
А вопрос тем временем остается открытым — как написать на ПЕГе правило, которое сматчит вектор, не задавая грамматики для элемента вектора.
Но ты не волнуйся, я этот вопрос не тебе первому задаю, и до сих пор никто решения не представил. Подозреваю, что это потому, что его в рамках ПЕГа не существует. Так что можешь спокойно продолжать свои априорные измерения.

VD>>>И что характерно, на практике это намного удобнее. Ведь ".*" в регексах найдет последнее хождение того что идет за ним, а это как раз обычно никому не нужно.

J>>На практике намного удобнее иметь выбор. Когда мне это не нужно, я юзаю нежадные кванторы. Причем цена переключения с жадной версии на нежадную — один символ после квантора. ПЕГ предлагает что-нть подобное?

VD>Да, выбор хорошая штука. Жаль что ты его не имеешь. В прочем, тебе явно не нужно. Каменный молоток тебя явно устраивает.

Влад, ну у меня прям слов нет. Уровень ведения тобой дискуссии просто убивает. Подменить тему обсуждения прямо в следующей же строчке — это эталон наглости. Мне на этот бред даже отвечать неохота. Очередной раз убеждаюсь, что дискутировать с религиозными фанатиками бесполезно — их аргументы либо представляют собой матру, либо вообще будут перпендикулярны обсуждению, либо превратятся в пенисометрию. Так что я продолжу дискуссию с более адекватными собеседниками, а ты можешь вернуться к своей априорной линейке.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[22]: почему вы используете регулярные выражения?
От: Klatu  
Дата: 21.01.11 12:01
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Так вот ПегГраммар делает тоже самое. Он оптимизирует эти самые 99% так как только может. Для разбора регулярной части используется ДКА (причем не табличный, а генерированный). Для нивилирования откатов используется частичная мемоизация. Ну, и сам он написан так чтобы не тратить такты зря. Первое что было предложено — это использовать в качестве позиции и информации об успехе парсинга одну переменную типа int. Почему-то большинство тех кто реализует ПЕГ до этого не додумываются. Далее была сделана отимизация правил (переписывание) и инлайнинг. Потом ДКА и мемоизация. В купе это дало очень приличную скорость. Многие в ручную написанным парсером такую обеспечить не могут.


И всё же интересно. Какая у вас получалась разница между полной мемоизацией и ее отсутствием, приблизительно?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[18]: почему вы используете регулярные выражения?
От: Klatu  
Дата: 21.01.11 12:12
Оценка: +1 -1
Здравствуйте, VladD2, Вы писали:

VD>А это феномен, кстати! Люди не боятся кривых сложных языков которые не конкурируют с их любимым языком общего назначения. Но как огня боятся языка который может заменить им их любимый язык.


Некоторые люди боятся, что время, которое они потратили на изучение своего основного инструмента — потрачено зря. Не понимают, что умение программировать — это куда больше, чем просто владение инструментом.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[23]: почему вы используете регулярные выражения?
От: VladD2 Российская Империя www.nemerle.org
Дата: 21.01.11 13:07
Оценка:
Здравствуйте, Klatu, Вы писали:

K>И всё же интересно. Какая у вас получалась разница между полной мемоизацией и ее отсутствием, приблизительно?


Дикая. Полная мемоизаци да еще и реализованная в лоб (на хэш-таблице) — это однозначный тормоз.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[24]: почему вы используете регулярные выражения?
От: Klatu  
Дата: 21.01.11 13:10
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>В то же время не линеный алгоритм может показывать экспоненциальный рост времени разбора, то только в очень экзатических случаях.


Кстати, а на каких примерах PEG будет давать экспоненциальную сложность? Или хотя бы полиномиальную?
Re[24]: почему вы используете регулярные выражения?
От: Воронков Василий Россия  
Дата: 21.01.11 13:20
Оценка:
Здравствуйте, VladD2, Вы писали:

ВВ>>Мне интересно:

ВВ>>- Пакрат реально дает O(n) или это только в теории, а на практике это не O(n)? Если да, то почему так происходит.
ВВ>>- Если излишняя мемоизация вредна, но по каким критерием определяется, что мемоизировать, а что нет?

VD>Ответ таков. Ты не понимаешь что такое линейное время.


Это не ответ. Я задал вполне конкретные вопросы вроде как. Речь идет не о сферических конях в вакууме, а о пакрате. За основу берется паркатовская модель, мемоизирующая все и имеющая O(n). Сократив мемоизацию, мы теряем O(n), но при этом в реальности парсер начинает работать быстрее. Почему так происходит? Короче — в каких случаях излишняя мемоизация вредна? Как вы определяете, что мемоизировать, а что нет?
Re[12]: почему вы используете регулярные выражения?
От: Mamut Швеция http://dmitriid.com
Дата: 21.01.11 13:36
Оценка:
S>Чтобы PEG заменил регекспы, нужно, чтобы он стал
S>а) очень-очень распространён. Чтобы можно было за $28 купить или за $7.99 скачать книгу O'Reilly про него, где всё обсосано до мелочей. Чтобы библиотеки с его поддержкой (совместимые по способу использования!!!) были широко доступны на всех основных языках разработки.
S>б) применим для мелких масштабов. Чтобы можно было применять его для проверки, поиска и замены коротких цепочек.
S>в) применим для непрограммистов. Чтобы "грамматику" или что там у него вместо строки регекспа можно было скормить в мою программу через несложный UI (или конфиг-файл), не привлекая IDE c code completion и билд-машину.

И еще чтобы синтаксис был вехде единым. PCRE настолько распространены, что никто и не думает, что писать можно и по другому. А с PEGом я уже три разных синтаксиса видел И наверняка еще найду


dmitriid.comGitHubLinkedIn
Re[25]: почему вы используете регулярные выражения?
От: VladD2 Российская Империя www.nemerle.org
Дата: 21.01.11 13:54
Оценка: 7 (2)
Здравствуйте, Klatu, Вы писали:

K>Кстати, а на каких примерах PEG будет давать экспоненциальную сложность? Или хотя бы полиномиальную?


Экспоненту получить вообще сложно. Хреновые показатели будут на грамматиках с большими общими префиксами и на грамматиках чей класс очень сильно и постоянно отличается от LL(1). Короче, на грамматиках для разбра которых нужны частые и глубокие откаты.

Вот только 99% языков как раз имеют почти LL(1)-грамматики. Например, C# имеет грамматику которую можно на 95% переписать в LL(1). Но там есть сложности вроде эвристик связанных с оператором приведения типов (конфликтующим со скобками и вызовом функций), оператор ?: и ? в налабл-типах и некоторое количество дурной фигни. PEG позволяет разрулить эти неоднозначности с помощью предикатов (благо они ничем не ограничены), а вот у автоматных парсеров эти эвристики вызывают ужасные проблемы.
Вот примерный список конфликтов в грамматике шарпа.
http://code.google.com/p/nemerle/source/browse/nemerle/trunk/snippets/csharp-parser/CSharpParser/Parser.n#199
http://code.google.com/p/nemerle/source/browse/nemerle/trunk/snippets/csharp-parser/CSharpParser/Parser.n#208
http://code.google.com/p/nemerle/source/browse/nemerle/trunk/snippets/csharp-parser/CSharpParser/Parser.n#260
http://code.google.com/p/nemerle/source/browse/nemerle/trunk/snippets/csharp-parser/CSharpParser/Parser.n#329
http://code.google.com/p/nemerle/source/browse/nemerle/trunk/snippets/csharp-parser/CSharpParser/Parser.n#333
http://code.google.com/p/nemerle/source/browse/nemerle/trunk/snippets/csharp-parser/CSharpParser/Parser.n#405

Можешь сравнить это с общим количеством правил.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[25]: почему вы используете регулярные выражения?
От: VladD2 Российская Империя www.nemerle.org
Дата: 21.01.11 14:26
Оценка: 3 (1)
Здравствуйте, Воронков Василий, Вы писали:

ВВ>Это не ответ. Я задал вполне конкретные вопросы вроде как. Речь идет не о сферических конях в вакууме, а о пакрате. За основу берется паркатовская модель, мемоизирующая все и имеющая O(n). Сократив мемоизацию, мы теряем O(n), но при этом в реальности парсер начинает работать быстрее. Почему так происходит?


А что ответ разве не очевиден? Мемоизация дает очень большой оверхэд. Выигрыш от нее есть только если она предотвращает относительно глубокие откаты, а проигрыш на каждом символе. В итоге на обычных языках, которые все как они близки к LL(1) толку от мемоизации почти нет, а затраты на нее есть всегда и они очень значительны.

ВВ>Короче — в каких случаях излишняя мемоизация вредна? Как вы определяете, что мемоизировать, а что нет?


Тестами и логическим выводом.

1. Мы не используем таблицы мемоизации, а используем обычные поля класса (по одному на правило). Это не позволяет производить мемоизацию для разных позиций разбора (только для последней позиции в которой производилась попытка разбора правила).
2. Мемоизация делается только для правил для которых есть методы-обработчики.

Кроме того я нигде не говорил, что на практике мемоизация дает серьезный выигрыш в скорости. Добавление частичной мемоизации ускорило парсер C#, но не в разы, а на проценты. Тотальная же мемоизация замедляла его в разы.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[13]: почему вы используете регулярные выражения?
От: Sinclair Россия https://github.com/evilguest/
Дата: 21.01.11 15:21
Оценка:
Здравствуйте, Mamut, Вы писали:


M>И еще чтобы синтаксис был вехде единым. PCRE настолько распространены, что никто и не думает, что писать можно и по другому. А с PEGом я уже три разных синтаксиса видел И наверняка еще найду

Это я и имел в виду под "совместимым способом использования".
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[14]: почему вы используете регулярные выражения?
От: Klatu  
Дата: 21.01.11 15:49
Оценка: +1
Здравствуйте, Sinclair, Вы писали:

M>>И еще чтобы синтаксис был вехде единым. PCRE настолько распространены, что никто и не думает, что писать можно и по другому.


Да ладно? Посмотри например регэксы в поиске VS. Сильно удивишься.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[15]: почему вы используете регулярные выражения?
От: Sinclair Россия https://github.com/evilguest/
Дата: 21.01.11 16:46
Оценка:
Здравствуйте, Klatu, Вы писали:

M>>>И еще чтобы синтаксис был вехде единым. PCRE настолько распространены, что никто и не думает, что писать можно и по другому.


K>Да ладно? Посмотри например регэксы в поиске VS. Сильно удивишься.

Кто-то явно хотел ответить не мне
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[21]: почему вы используете регулярные выражения?
От: mrTwister Россия  
Дата: 21.01.11 21:35
Оценка: -1
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, netch80, Вы писали:


VD>>>Уверен, что появись указанные бэкэнды у тебя найдутся новые отговорки.


N>>С чего бы вдруг?


VD>Из опыта. Танцоры которым что-то мешает обычно после удаления того что мешает все равно находят что-то что оправдывает трудность танцев.


Ага, кому-то вот язык программирования мешает шедевры производить на свет
лэт ми спик фром май харт
Re[29]: почему вы используете регулярные выражения?
От: mrTwister Россия  
Дата: 21.01.11 21:45
Оценка:
Здравствуйте, VladD2, Вы писали:

J>>Предикат — это совсем не то, что ".*". Предикаты и в регэкспах есть (твой пример с комментарием можно написать в регэкспе вот так:

J>>
J>>/\* ((?! \*/ ) . )* \*/
J>>

J>>непонятно, зачем, правда, когда есть более простой путь, выше).

VD>Ну, вот и сравни читаемость. Плюс не забывай, что для ПЕГ-а есть алгоритм обеспечивающий разбор указанной грамматики за линейное время, а для регексов такого нет.

А что, разве указанный jazzer'ом регексп:
/\* ((?! \*/ ) . )* \*/
работает не линейное время?
лэт ми спик фром май харт
Re[26]: почему вы используете регулярные выражения?
От: Mamut Швеция http://dmitriid.com
Дата: 22.01.11 23:45
Оценка:
VD>Экспоненту получить вообще сложно. Хреновые показатели будут на грамматиках с большими общими префиксами и на грамматиках чей класс очень сильно и постоянно отличается от LL(1). Короче, на грамматиках для разбра которых нужны частые и глубокие откаты.

VD>Вот только 99% языков как раз имеют почти LL(1)-грамматики. Например, C# имеет грамматику которую можно на 95% переписать в LL(1). Но там есть сложности вроде эвристик связанных с оператором приведения типов (конфликтующим со скобками и вызовом функций), оператор ?: и ? в налабл-типах и некоторое количество дурной фигни. PEG позволяет разрулить эти неоднозначности с помощью предикатов (благо они ничем не ограничены), а вот у автоматных парсеров эти эвристики вызывают ужасные проблемы.


Читаю я это и задумался. Написал бы кто-нибудь туториал по тому, с чего начинать описывать грамматику уже существующего языка на PEG'е. Потому что вон тот же C#. Огромный синаксис. С чего начать? Как разруливать неизбежные конфликты? Ну и т.п.


dmitriid.comGitHubLinkedIn
Re[27]: почему вы используете регулярные выражения?
От: VladD2 Российская Империя www.nemerle.org
Дата: 24.01.11 01:04
Оценка: 20 (1)
Здравствуйте, Mamut, Вы писали:

M>Читаю я это и задумался. Написал бы кто-нибудь туториал по тому, с чего начинать описывать грамматику уже существующего языка на PEG'е. Потому что вон тот же C#. Огромный синаксис. С чего начать?


С базовых правил (тех что в спецификации называется в разделе "Lexical structure"). Далее по спецификации от пространств имен и до "лисьтев" (выражений и т.п.).

PEG имеет очень много общего с написанием парсеров вручную методом рекурсивного спуска. Так что если этот метод знаком, то освоить написание PEG-грамматик труда не составит.

M>Как разруливать неизбежные конфликты? Ну и т.п.


Отпарсить реальные (корректные) исходники и получить неверный разбор. Далее разобраться в чем проблема и подумать как устранить ее с помощью предикатов. Предикаты вещь настолько мощная, что позволяют разрулить любой конфликт если только он не приводит к появлению неоднозначной грамматики или контекстно-зависимой грамматике (да и некоторые КЗ-вещи тоже позволяет разрулить).
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[28]: почему вы используете регулярные выражения?
От: Mamut Швеция http://dmitriid.com
Дата: 24.01.11 07:31
Оценка:
M>>Читаю я это и задумался. Написал бы кто-нибудь туториал по тому, с чего начинать описывать грамматику уже существующего языка на PEG'е. Потому что вон тот же C#. Огромный синаксис. С чего начать?

VD>С базовых правил (тех что в спецификации называется в разделе "Lexical structure"). Далее по спецификации от пространств имен и до "лисьтев" (выражений и т.п.).


Эх, не всегда есть такой раздел

VD>PEG имеет очень много общего с написанием парсеров вручную методом рекурсивного спуска. Так что если этот метод знаком, то освоить написание PEG-грамматик труда не составит.


Ага, буду ковырять.

M>>Как разруливать неизбежные конфликты? Ну и т.п.


VD>Отпарсить реальные (корректные) исходники и получить неверный разбор. Далее разобраться в чем проблема и подумать как устранить ее с помощью предикатов. Предикаты вещь настолько мощная, что позволяют разрулить любой конфликт если только он не приводит к появлению неоднозначной грамматики или контекстно-зависимой грамматике (да и некоторые КЗ-вещи тоже позволяет разрулить).


Спасибо за толчок в нужном направлении


dmitriid.comGitHubLinkedIn
Re[29]: почему вы используете регулярные выражения?
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 24.01.11 13:57
Оценка: 40 (1)
M>Эх, не всегда есть такой раздел

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

пример, допустим необходимо распарсить C# — большая часть структуры описывается с помощью '{', '}'. попробуем распарсить эту структуру

первое приближение грамматики
file := block-body;
block-body := (другое? block)* другое?;
block := '{' block-body '}';
другое := .+;

все хорошо, но есть конфликт, peg — жадный, поэтому терм 'другое' съест и открывающие скобки, и закрывающие, которые нужны правилу block.
разрешим конфликт — запретив терму 'другое' хавать скобки
file := block-body;
block-body := (другое? block)* другое?;
block := '{' block-body '}';
другое := (!('{' / '}') .)+;

работает, но ломается, если есть непарные скобки в комментарии или литерале?
добавляем их
line-comment := '//' (!line-break .)* line-break;
multi-line-comment :=  '/*' (!'*/' .)* '*/';
literal := ('""' (!'""' .)*  '""') / (""'"" (!""'"" .)*  ""'""); //как пример, в шарпе чуть другие правила записи литерала
line-break := ([\r][\n]) / [\r] / [\n];

модифицируем правило другое и получаем грамматику:
file := block-body;
block-body := (другое? block)* другое?;
block := '{' block-body '}';
другое := (!('{' / '}') line-comment / multi-line-comment / literal / .)+;
line-comment := '//' (!line-break .)* line-break;
multi-line-comment :=  '/*' (!'*/' .)* '*/';
literal := ('""' (!'""' .)*  '""') / (""'"" (!""'"" .)*  ""'""); //как пример, в шарпе чуть другие правила записи литерала
line-break := ([\r][\n]) / [\r] / [\n];

эта грамматика уже устойчивая ко всем видам C#-файлов (если ничего не забыл), и позволяет уточнять грамматику дальше в нужном направлении — в зависимости от задачи.
схема изменения грамматика стандартная: формулируется новое правило, вставляется "вызов" в нужное место, есть есть конфликт — остальным правилам явно запрещается хавать символы, которые нужны новому правилу.
также грамматика периодически рефакторится, чтобы быть менее громоздкой и более быстрой для исполнения
Re[30]: почему вы используете регулярные выражения?
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 24.01.11 14:06
Оценка:
данный пример писал в браузере и не тестил, поэтому там есть ряд неточностей.
Re[31]: почему вы используете регулярные выражения?
От: Mamut Швеция http://dmitriid.com
Дата: 25.01.11 09:07
Оценка: :)
DG>данный пример писал в браузере и не тестил, поэтому там есть ряд неточностей.

Важна сама идея


dmitriid.comGitHubLinkedIn
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.