Выпущена (http://permalink.gmane.org/gmane.org.fsf.announce/1874) новая версия пакета для написания синтаксических (yacc (http://ru.wikipedia.org/wiki/Yacc)) анализаторов - Bison 2.7 (http://www.gnu.org/software/bison/bison.html). На основании заданных правил грамматики в специальной нотации, Bison позволяет сгенерировать готовый парсер на языке Си.
В новой версии:
- Расширены средства диагностики;
- Изменён формат сообщений об ошибках;
- Добавлена экспериментальная поддержка обработки исключений;
- Улучшено графическое представление состояния, выводимого с использованием DOT и XSLT;
- Добавлена новая %define-переменная api.location.type;
- С опции "%language" снят гриф экспериментальной возможности.URL: http://permalink.gmane.org/gmane.org.fsf.announce/1874
Новость: http://www.opennet.me/opennews/art.shtml?num=35585
> Добавлена экспериментальная поддержка обработки исключенийДа неужели! Дожили. В XXI веке-то, наифундаментальнейшая утилита научилась генерить код с поддержкой исключений. Когда я в своё время разбирался с flex/bison и увидел код который они генерят... с глобальными переменными, malloc без проверки ошибок и т.д., не говоря уже о exception-safety, сказать что я был в шоке - ничего не сказать. На них просто нельзя написать парсер, который на ошибку внутри парсинга будет делать что-то иное, нежели завершение всего процесса, потому уж утечки памяти там будут гарантированно. И ЕМНИП нельзя написать парсер, завернуть его в класс, и использовать несколько экземпляров. Из-за глобальных переменных. П**ц их 80-х, по-другому и не скажешь.
К слову, вменяемой альтернативы я так и не нашёл и всегда писал парсеры руками. А нужно всего-лишь интегрированное (lexer+parser) решение, генерящее вменяемый код. В идеале, с поддержкой нескольких языков. Ближе всего к этому ragel, но парсера там, к сожалению, нет. Либо как лексер, либо для регулярок.
> вменяемой альтернативы я так и не нашёл и всегда писал парсеры руками.
> А нужно всего-лишьАвторы бизона тоже не нашли! Может вам объединить усилия?
> А нужно всего-лишь интегрированное (lexer+parser) решение, генерящее вменяемый код. В идеале, с поддержкой нескольких языковПопробуйте antlr.
Совершенно не хочется зависеть только ради генератора парсеров от жавы (как и mono, это к совету nemerle.peg). Возможно после этой версии всё-таки можно будет юзать bison, но вообще когда я искал нормальный парсер, наткнулся на страницу где их было чуть ли не полсотни - ничего вменяемого я там тогда не нашёл, но меня не оставляет чувство что я мог в этом разнообразии что-то пропустить. Кажись, lemon выглядел вменяемо, но он емнип не был интегрированным.
>Совершенно не хочется зависеть только ради генератора парсеров от жавыАноним, ты не понимаешь ее силы, переходи на темную сторону.
> Аноним, ты не понимаешь ее силы, переходи на темную сторону.Спасибо, я привык использовать железо под нужды решаемой задачи, а не языка.
Да, когда в каждом апдейте чинят по хренадцать уязвимостей - это сила...
Это проблемы пользователей и бородатых админов обновлятся, а не разработчиков.
Попробуй boost::spirit
Пробовал, это леденящий душу п**ц. Ещё раз: нужна поддержка нескольких языков и отсутствие привязки к кускам гoвна (java, mono, boost).
> нужна поддержка нескольких языковЭто как?
> Попробуй boost::spiritBoost - монстрятина.
Буст - штука хорошая, но Spirit - странный монстр, конечно
> Да неужели! Дожили. В XXI веке-то, наифундаментальнейшая утилита научилась генерить код с поддержкой исключений.Может вы не в курсе, но bison генерит исходник на С, а не на С++, если вы видите между ними разницу...
> Когда я в своё время разбирался с flex/bison и увидел код который они генерят... с глобальными переменными
Сгенерите реентерабильный (pure) парсер и глобальные переменные исчезнут, раз уж вы их так не любите. А вообще, они там по делу. Во-первых, они необходимы для взаимодействия с flex. Во-вторых, вы через них можете получить кое-какую информацию после вызова yyparse(), например, общее количество ошибок разбора и др. Ну и в третьих, для нереентнрабильных парсеров их глобальность никакого значения не имеет - они используются только во время вызова функции yyparse() и никогда более.
> malloc без проверки ошибок
Это в какой версии? Вот я сейчас смотрю парсер от 1.25, malloc() используется 1 раз:
msg = (char *) malloc(size + 15);
if (msg != 0)
{Теперь смотрю 2.4.2, там по умолчанию malloc() вообще не используется.
> На них просто нельзя написать парсер, который на ошибку внутри парсинга будет делать что-то иное, нежели завершение всего процесса
Чушь собачья. Прочитайте раздел Error Recovery в мануале и откройте для себя ключевое слово error.
> потому уж утечки памяти там будут гарантированно.
Там все стэки разбора - локальные для yyparse(), а для контроля их переполнения можно определить пользовательскую функцию yyoverflow(). Так что утечки по вине bison принципиально исключены.
> И ЕМНИП нельзя написать парсер, завернуть его в класс, и использовать несколько экземпляров.
Курите Pure Parser и C++ Parser Interface из манов.
> К слову, вменяемой альтернативы я так и не нашёл и всегда писал парсеры руками.
Сочувствую :) Чего только люди не делают, лишь бы не разбираться с хрестоматийными программами...
> Может вы не в курсе, но bison генерит исходник на С, а не на С++, если вы видите между ними разницу...А вы посмотрите для разнообразия в share/bison/lalr1.cc. Алсо, может вы не в курсе, но нормальный C можно обернуть в C++. Ключевое слово - нормальный.
И может вы слепой, но в новости речь идёт об исключениях, что уже далеко не C.> Сгенерите реентерабильный (pure) парсер
Не надо всех по себе равнять, я не дебил. Разумеется именно pure парсер я и генерил.
В остальном я с вами спорить не могу, потому что щупал это гoвно на палочке слишком давно. Но факт - одно исключение и все ваши маллоки, хоть и проверками, хоть без - останутся без free.
> Чего только люди не делают, лишь бы не разбираться с хрестоматийными программами...
Высшая форма ламерства - оценивать программы по "хрестоматийности". GNU насквозь хрестоматиен, взять хотя бы autocrap. И более понятный синоним хрестоматийности тут - заскорузлое кривое устаревшее гoвнецо. Потому и дохнет, кстати.
> А вы посмотрите для разнообразия в share/bison/lalr1.cc.Да, можно заставить Бизон генерить только таблицы, а парсер вообще написать самому. Хоть с исключениями, хоть с чатурангой и одалисками. Но вы даже этим не воспользовались, а предпочли изобретать свой собственный велосипед. Вот это и есть высшая форма ламерства.
> Алсо, может вы не в курсе, но нормальный C можно обернуть в C++.
Можно и гланды через задний проход удалять. Но не нужно.
> Ключевое слово - нормальный.
Вы, похоже, сказали новое слово в компьютерной науке. "Нормальный С - это такой С, который можно обернуть в C++" :D
> В остальном я с вами спорить не могу, потому что щупал это гoвно на палочке слишком давно.
Вы со мной спорить не можете не потому, что это было давно, а потому что вы так и не дочитали мануал.
> Но факт - одно исключение и все ваши маллоки, хоть и проверками, хоть без - останутся без free.
Может "факт" наконец-то подтвердите каким-нибудь пруфом?
> И более понятный синоним хрестоматийности тут - заскорузлое кривое устаревшее гoвнецо.
Я с вас смеюсь. "Устаревшее" - это колесо, которым люди пользуются 5 тысяч лет. Вы суть колеса понять так и не смогли, поэтому изобрели своё собственное, квадратное :)
Большая часть поста - баттхерт от того что вас ткнули носом в вашу некомпетентность, не вижу смысла это комментировать.> Может "факт" наконец-то подтвердите каким-нибудь пруфом?
Факт вообще-то изначально подтвержден новостью.
The parse function now catches exceptions, uses the %destructors to release memory (the lookahead symbol and the symbols pushed on the stack) before re-throwing the exception.
> "Устаревшее" - это колесо, которым люди пользуются 5 тысяч лет. Вы суть колеса понять так и не смогли, поэтому изобрели своё собственное, квадратное :)
Вообще-то вместо того чтобы пользоваться каменным колесом пятитысячелетней давности, люди перешли на более адекватные колеса. Сначала деревянные, потом металлические, с покрышкой. А в случае bison колесо не только тысячелетней давности, а еще и квадратное.
> Большая часть поста - баттхерт от того что вас ткнули носом в
> вашу некомпетентность, не вижу смысла это комментировать.Бгг. Оналитег, неумеющий читать маны, обвиняет меня в некомпетентности.
>> Может "факт" наконец-то подтвердите каким-нибудь пруфом?
> Факт вообще-то изначально подтвержден новостью.
> The parse function now catches exceptions, uses the чstructors to release memory
> (the lookahead symbol and the symbols pushed on the stack) before
> re-throwing the exception.И как из этого следует, что раньше малокки оставались без free? Примеры кода, пожалуйста.
>> "Устаревшее" - это колесо, которым люди пользуются 5 тысяч лет. Вы суть колеса понять так и не смогли, поэтому изобрели своё собственное, квадратное :)
> Вообще-то вместо того чтобы пользоваться каменным колесом пятитысячелетней давности,
> люди перешли на более адекватные колеса. Сначала деревянные, потом металлические, с
> покрышкой. А в случае bison колесо не только тысячелетней давности, а
> еще и квадратное.Вы - неосилятор, продолжаете в этом упорствовать. Всего наилучшего.
> но нормальный C можно обернуть в C++. Ключевое слово —
> нормальный.
char *c = malloc(64);
это, чтобы ты знал, *нормальный* си. а то, что цпп тут кричит о типах — это специфика цпп, который не полностью с си совместим. и костыль вида (char *)malloc(64) — это и есть костыль, который для си — не нужен, а для цпп — ломает и без того дурацкую проверку типов.расскажи мне ещё про «нормальный C», пожалуйста.
> Но факт - одно исключение и
> все ваши маллоки, хоть и проверками, хоть без - останутся без
> free.что совершеннейшим образом не важно, потому что для парзера всё равно удобней применять zone allocator. и выкидывать потом всю зону целиком.
nemerle peg?
> nemerle peg?мона? нет, благодарствуем, уносите.