Re[5]: Выбор
От: alex_public  
Дата: 01.12.16 08:04
Оценка:
Здравствуйте, vdimas, Вы писали:

_>>>>Если есть желание продемонстрировать честный аналог Spirit'a в стиле C, то надо взять исходники Bison + Flex.

V>>>А давно у нас Бизоны и Флексы являются аналогами комбинаторных парсеров?
_>>Можешь предложить более близкий аналог Spirit'a из мира C? )
V>Слава богу, редко кому в голову приходила идея реализовывать комбинаторные парсеры на С. Комбинаторные парсеры — это изобретение далёких от программирования людей, которые пользовали в ежедневной практике функциональные языки. Они не знали теорию грамматик и писали парсеры "в лоб", получая естественные тормоза и жор памяти.
V>Если же брать язык С, то он получил свой расцвет в те времена, когда память была еще ресурсом, а программисты еще были обучены по целевой специальности. ))

Ну т.е. если перевести с твоего языка на русский, то будет: "не могу". )))
Re[9]: Выбор
От: alex_public  
Дата: 01.12.16 08:11
Оценка: -1
Здравствуйте, vdimas, Вы писали:

_>>Перегрузка операторов в C? А ты как всегда шедеврален... )))

V>Релэкс, я знал, что тебе нечего будет возразить, кроме этого.
V>Но я ж специально проверил, что "в стиле C" написано в кавычках.
V>Т.е. не требовалось на С, требовалось в духе, ОК.

О, пошли отмазки. )))

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

V>С точностью до перегрузки операторов, ес-но.
V>Без этой перегрузки было бы что-то вроде:
V>

V>Rule * A = ruleOr(B, ruleOr(ruleCat(A, C), ruleCat(ruleCat(A, B), C);

V>То бишь, задание AST этого БНФ-выражения... Тоже вполне работоспособно, но лучше не стоит так упарываться. ))

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

_>>А в C у нас имеется только последний вариант, так что точного аналога Spirit'a просто не существует. Именно в этом был мой тезис, который очевиден каждому вменяемому читателю. )))

V>Каждому вменяемому читателю видна насосанность из пальца вот этого требования аналога Spirit под С. Мало того, что о такой постановке вопроса речи даже не было (!!!), дык, по современным меркам пытаться гнуть в эту сторону — это заведомо сливать любой спор, бо ограничений на распространённость С++ давно уже нет.

Хех, вообще то именно об этом я тут и писал. Что Spirit является максимально плохим примером для нашей дискуссии (она же вообще то не про парсеры, а про стили) и надо взять любой (ну почти — надо чтобы он всё же был реализуем на C) другой пример современного шаблонного кода на C++ и тогда уже обсуждать. Так что похоже ты тут споришь с какими-то голосами в своей голове. )))
Re[10]: Выбор
От: vdimas Россия  
Дата: 01.12.16 11:13
Оценка:
Здравствуйте, alex_public, Вы писали:

_>>>Перегрузка операторов в C? А ты как всегда шедеврален... )))

V>>Релэкс, я знал, что тебе нечего будет возразить, кроме этого.
V>>Но я ж специально проверил, что "в стиле C" написано в кавычках.
V>>Т.е. не требовалось на С, требовалось в духе, ОК.

_>О, пошли отмазки. )))


Ожидаемо скатился в троллизм.

Твои слова?

Так вот написать его полноценный аналог "в стиле C" просто невозможно

Re[6]: Выбор
От: vdimas Россия  
Дата: 01.12.16 20:45
Оценка: 3 (1)
Здравствуйте, alex_public, Вы писали:

_>Ну т.е. если перевести с твоего языка на русский, то будет: "не могу". )))


В переводе на русский будет — "у alex_public в Киеве дядька".

Напомню твой залёт:

- Если есть желание продемонстрировать честный аналог Spirit'a в стиле C, то надо взять исходники Bison + Flex.

Spirit — это фреймворк для построения комбинаторного парсера. Напротив, семейство yacc (и его многочисленные клоны, включая бизона, бизона++ и прочих буфалло) — это полноценные LALR(1), LR(1), местами LR(k) и даже GLR-парсеры.

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

Если бы в моём проект стоял выбор между использованием Bison + Flex и Spirit, то скорее всего я бы предпочёл последнее, в силу более удобного API

Т.е., даже не глядя на вид грамматики, ты уже сделал выбор по некоему мифическому АПИ.

Откуда ты знаешь, какой АПИ у того же Bison++? Да у него чудесный С++ АПИ.

Мало того, АПИ Spirit просто ужасно, коряво, неюзабельно и сугубо write-only. Оно ужасно именно из-за тех вещей, что EDSL в С++ не всегда выходит гладко, особенно в деле ДЕКЛАРАТИВНОГО описания грамматик для парсинга с попыток связать эту декларацию с колбэками (semantic actions). Не они первые и не они последние, насчет EDSL парсеров в С++. Это болезнь роста как специалиста C++, многие через неё проходят.

Далее вообще смешно:

- Можешь предложить более близкий аналог Spirit'a из мира C? )

Тут сначала упал со стула, затем поднялся и внятно тебе ответил:

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

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

Тем не менее, реализаций парсеров семейства PEG на С существует более одной. Сие означает, что я-то как раз "могу" (могу привести примеры), но считаю их эээ... малость "неприличными" для приличного общества. Потому что упоминание PEG всуе, это как выйти на Красную площадь и ругаться матом. Судя по твоему ответу, ты не в курсе всех этих тонкостей, но опять и снова поторопился выступить в роли тролля. )) ИМХО, тролль должен хорошо разбираться в предмете, иначе это не тролль, а так, неудачная мимикрия из разряда "обалажался — притворись троллем".

Одно меня радует в приведенных ссылках на комбинаторные парсеры на С (который peg/leg), что после многолетней упорной смены версий и роста их аж до 0.1.18 (т.е. даже не альфы), авторы, судя по всему, одумались. Ну, мож, прочитали пару книг, наконец... Чего и всем советую.
Re[11]: Выбор
От: alex_public  
Дата: 02.12.16 16:39
Оценка:
Здравствуйте, vdimas, Вы писали:

_>>>>Перегрузка операторов в C? А ты как всегда шедеврален... )))

V>>>Релэкс, я знал, что тебе нечего будет возразить, кроме этого.
V>>>Но я ж специально проверил, что "в стиле C" написано в кавычках.
V>>>Т.е. не требовалось на С, требовалось в духе, ОК.
_>>О, пошли отмазки. )))
V>Ожидаемо скатился в троллизм.
V>Твои слова?
V>

V>Так вот написать его полноценный аналог "в стиле C" просто невозможно


Ну т.е. перегрузка операторов — это по твоему код "в стиле C", да?
Re[7]: Выбор
От: alex_public  
Дата: 02.12.16 16:59
Оценка: :)
Здравствуйте, vdimas, Вы писали:

_>>Ну т.е. если перевести с твоего языка на русский, то будет: "не могу". )))

V>

V>- Можешь предложить более близкий аналог Spirit'a из мира C? )

V>Тут сначала упал со стула, затем поднялся и внятно тебе ответил:
V>

V>Слава богу, редко кому в голову приходила идея реализовывать комбинаторные парсеры на С. Комбинаторные парсеры — это изобретение далёких от программирования людей, которые пользовали в ежедневной практике функциональные языки. Они не знали теорию грамматик и писали парсеры "в лоб", получая естественные тормоза и жор памяти.

V>Похоже, ты не понял ответа моего и так не слишком завуалированного ответа, поэтому, перевожу на совсем прямую речь:
V>- комбинаторные парсеры предназначены для случайных в отрасли людей;
V>- случайные в отрасли люди редко пишут на С (как минимум редко пишут генераторы парсеров на С, ы-ы-ы).
V>Тем не менее, реализаций парсеров семейства PEG на С существует более одной. Сие означает, что я-то как раз "могу" (могу привести примеры), но считаю их эээ... малость "неприличными" для приличного общества. Потому что упоминание PEG всуе, это как выйти на Красную площадь и ругаться матом. Судя по твоему ответу, ты не в курсе всех этих тонкостей, но опять и снова поторопился выступить в роли тролля. )) ИМХО, тролль должен хорошо разбираться в предмете, иначе это не тролль, а так, неудачная мимикрия из разряда "обалажался — притворись троллем".

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

Показанные тобой примеры парсеров при всей алгоритмической похожести не имеют ничего общего со Spirit'ом с точки зрения архитектуры. Они все представляю собой просто обычный парсер с кастомизируемым форматом. Он однажды собирается в приложение и потом его поведение настраивается внешними рантайм данными (строкой с грамматикой). В противоположность этому Spirit (так же как и Bison+Flex) генерирует под каждую грамматику разный код, который потом активно оптимизируется (включая глубокий инлайн) компилятором. Именно этим и обусловлена высокая эффективность всех парсеров на базе кодогенераторов. А уникальность Spirit'а заключается только в том, что это EDSL генератор, а не внешний.

Да, кстати, могу тебе сделать подсказку для дальнейших попыток найти более адекватный аналог на C (и тем самым показать что твоя придирка не была глупой). По идее единственным способом написать аналог Spirit'а на C будет построение некого страшного монстра на макросах. Сомневаюсь, что кто-то подобное делал, но если нет такого решения, то скорее всего нет и никакого другого.
Re[8]: Выбор
От: vdimas Россия  
Дата: 02.12.16 22:29
Оценка:
Здравствуйте, alex_public, Вы писали:

_>Молодец, домашнее задание по владению гуглом ты выполнил.


Смишно. Гугл как раз даёт ссылки на обсуждения тем с парсерами на RSDN с моим участием в разные годы. ))

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