The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

Новая версия Bison 2.7, системы для написания синтаксических анализаторов

13.12.2012 09:44

Выпущена новая версия пакета для написания синтаксических (yacc) анализаторов - Bison 2.7. На основании заданных правил грамматики в специальной нотации, Bison позволяет сгенерировать готовый парсер на языке Си. В новой версии:

  • Расширены средства диагностики;
  • Изменён формат сообщений об ошибках;
  • Добавлена экспериментальная поддержка обработки исключений;
  • Улучшено графическое представление состояния, выводимого с использованием DOT и XSLT;
  • Добавлена новая %define-переменная api.location.type;
  • С опции "%language" снят гриф экспериментальной возможности.


  1. Главная ссылка к новости (http://permalink.gmane.org/gma...)
Лицензия: CC-BY
Тип: Программы
Ключевые слова: bison, parser, yacc
При перепечатке указание ссылки на opennet.ru обязательно
Обсуждение (22) Ajax | 1 уровень | Линейный | +/- | Раскрыть всё | RSS
  • 1.1, Аноним (-), 10:04, 13/12/2012 [ответить] [﹢﹢﹢] [ · · · ]  
  • –2 +/
    > Добавлена экспериментальная поддержка обработки исключений

    Да неужели! Дожили. В XXI веке-то, наифундаментальнейшая утилита научилась генерить код с поддержкой исключений. Когда я в своё время разбирался с flex/bison и увидел код который они генерят... с глобальными переменными, malloc без проверки ошибок и т.д., не говоря уже о exception-safety, сказать что я был в шоке - ничего не сказать. На них просто нельзя написать парсер, который на ошибку внутри парсинга будет делать что-то иное, нежели завершение всего процесса, потому уж утечки памяти там будут гарантированно. И ЕМНИП нельзя написать парсер, завернуть его в класс, и использовать несколько экземпляров. Из-за глобальных переменных. П**ц их 80-х, по-другому и не скажешь.

    К слову, вменяемой альтернативы я так и не нашёл и всегда писал парсеры руками. А нужно всего-лишь интегрированное (lexer+parser) решение, генерящее вменяемый код. В идеале, с поддержкой нескольких языков. Ближе всего к этому ragel, но парсера там, к сожалению, нет. Либо как лексер, либо для регулярок.

     
     
  • 2.2, Andrey Mitrofanov (?), 10:26, 13/12/2012 [^] [^^] [^^^] [ответить]  
  • +3 +/
    > вменяемой альтернативы я так и не нашёл и всегда писал парсеры руками.
    > А нужно всего-лишь

    Авторы бизона тоже не нашли! Может вам объединить усилия?

     
  • 2.3, Aesthetus Animus (ok), 10:33, 13/12/2012 [^] [^^] [^^^] [ответить]  
  • +/
    > А нужно всего-лишь интегрированное (lexer+parser) решение, генерящее вменяемый код. В идеале, с поддержкой нескольких языков

    Попробуйте antlr.

     
     
  • 3.5, Аноним (-), 10:51, 13/12/2012 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Совершенно не хочется зависеть только ради генератора парсеров от жавы (как и mono, это к совету nemerle.peg). Возможно после этой версии всё-таки можно будет юзать bison, но вообще когда я искал нормальный парсер, наткнулся на страницу где их было чуть ли не полсотни - ничего вменяемого я там тогда не нашёл, но меня не оставляет чувство что я мог в этом разнообразии что-то пропустить. Кажись, lemon выглядел вменяемо, но он емнип не был интегрированным.
     
     
  • 4.7, Аноним (-), 11:17, 13/12/2012 [^] [^^] [^^^] [ответить]  
  • +/
    >Совершенно не хочется зависеть только ради генератора парсеров от жавы

    Аноним, ты не понимаешь ее силы, переходи на темную сторону.

     
     
  • 5.9, Аноним (-), 11:19, 13/12/2012 [^] [^^] [^^^] [ответить]  
  • +/
    > Аноним, ты не понимаешь ее силы, переходи на темную сторону.

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

     
  • 5.11, Аноним (-), 12:44, 13/12/2012 [^] [^^] [^^^] [ответить]  
  • +/
    Да, когда в каждом апдейте чинят по хренадцать уязвимостей - это сила...
     
     
  • 6.18, Аноним (-), 19:54, 13/12/2012 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Это проблемы пользователей и бородатых админов обновлятся, а не разработчиков.
     
  • 2.6, BSA (?), 11:12, 13/12/2012 [^] [^^] [^^^] [ответить]  
  • +/
    Попробуй boost::spirit
     
     
  • 3.8, Аноним (-), 11:18, 13/12/2012 [^] [^^] [^^^] [ответить]  
  • +/
    Пробовал, это леденящий душу п**ц. Ещё раз: нужна поддержка нескольких языков и отсутствие привязки к кускам гoвна (java, mono, boost).
     
     
  • 4.15, dq0s4y71 (??), 13:35, 13/12/2012 [^] [^^] [^^^] [ответить]  
  • +/
    > нужна поддержка нескольких языков

    Это как?

     
  • 3.12, Аноним (-), 12:45, 13/12/2012 [^] [^^] [^^^] [ответить]  
  • +/
    > Попробуй boost::spirit

    Boost - монстрятина.

     
     
  • 4.16, Crazy Alex (ok), 15:31, 13/12/2012 [^] [^^] [^^^] [ответить]  
  • +/
    Буст - штука хорошая, но Spirit - странный монстр, конечно
     
  • 2.10, dq0s4y71 (??), 12:20, 13/12/2012 [^] [^^] [^^^] [ответить]  
  • +9 +/
    > Да неужели! Дожили. В 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 из манов.

    > К слову, вменяемой альтернативы я так и не нашёл и всегда писал парсеры руками.

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

     
     
  • 3.17, Аноним (-), 18:28, 13/12/2012 [^] [^^] [^^^] [ответить]  
  • +/
    > Может вы не в курсе, но bison генерит исходник на С, а не на С++, если вы видите между ними разницу...

    А вы посмотрите для разнообразия в share/bison/lalr1.cc. Алсо, может вы не в курсе, но нормальный C можно обернуть в C++. Ключевое слово - нормальный.
    И может вы слепой, но в новости речь идёт об исключениях, что уже далеко не C.

    > Сгенерите реентерабильный (pure) парсер

    Не надо всех по себе равнять, я не дебил. Разумеется именно pure парсер я и генерил.

    В остальном я с вами спорить не могу, потому что щупал это гoвно на палочке слишком давно. Но факт - одно исключение и все ваши маллоки, хоть и проверками, хоть без - останутся без free.

    > Чего только люди не делают, лишь бы не разбираться с хрестоматийными программами...

    Высшая форма ламерства - оценивать программы по "хрестоматийности". GNU насквозь хрестоматиен, взять хотя бы autocrap. И более понятный синоним хрестоматийности тут - заскорузлое кривое устаревшее гoвнецо. Потому и дохнет, кстати.

     
     
  • 4.19, dq0s4y71 (??), 15:08, 14/12/2012 [^] [^^] [^^^] [ответить]  
  • –1 +/
    > А вы посмотрите для разнообразия в share/bison/lalr1.cc.

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

    > Алсо, может вы не в курсе, но нормальный C можно обернуть в C++.

    Можно и гланды через задний проход удалять. Но не нужно.

    > Ключевое слово - нормальный.

    Вы, похоже, сказали новое слово в компьютерной науке. "Нормальный С - это такой С, который можно обернуть в C++" :D

    > В остальном я с вами спорить не могу, потому что щупал это гoвно на палочке слишком давно.

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

    > Но факт - одно исключение и все ваши маллоки, хоть и проверками, хоть без - останутся без free.

    Может "факт" наконец-то подтвердите каким-нибудь пруфом?

    > И более понятный синоним хрестоматийности тут - заскорузлое кривое устаревшее гoвнецо.

    Я с вас смеюсь. "Устаревшее" - это колесо, которым люди пользуются 5 тысяч лет. Вы суть колеса понять так и не смогли, поэтому изобрели своё собственное, квадратное :)

     
     
  • 5.20, Аноним (-), 20:41, 14/12/2012 [^] [^^] [^^^] [ответить]  
  • +/
    Большая часть поста - баттхерт от того что вас ткнули носом в вашу некомпетентность, не вижу смысла это комментировать.

    > Может "факт" наконец-то подтвердите каким-нибудь пруфом?

    Факт вообще-то изначально подтвержден новостью.

    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 колесо не только тысячелетней давности, а еще и квадратное.

     
     
  • 6.21, dq0s4y71 (??), 21:09, 15/12/2012 [^] [^^] [^^^] [ответить]  
  • –1 +/
    > Большая часть поста - баттхерт от того что вас ткнули носом в
    > вашу некомпетентность, не вижу смысла это комментировать.

    Бгг. Оналитег, неумеющий читать маны, обвиняет меня в некомпетентности.

    >> Может "факт" наконец-то подтвердите каким-нибудь пруфом?
    > Факт вообще-то изначально подтвержден новостью.
    > 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 колесо не только тысячелетней давности, а
    > еще и квадратное.

    Вы - неосилятор, продолжаете в этом упорствовать. Всего наилучшего.

     
  • 4.22, arisu (ok), 20:47, 20/12/2012 [^] [^^] [^^^] [ответить]  
  • +/
    > но нормальный C можно обернуть в C++. Ключевое слово —
    > нормальный.

    [code]
    char *c = malloc(64);
    [/code]
    это, чтобы ты знал, *нормальный* си. а то, что цпп тут кричит о типах — это специфика цпп, который не полностью с си совместим. и костыль вида (char *)malloc(64) — это и есть костыль, который для си — не нужен, а для цпп — ломает и без того дурацкую проверку типов.

    расскажи мне ещё про «нормальный C», пожалуйста.

     
  • 4.23, arisu (ok), 20:49, 20/12/2012 [^] [^^] [^^^] [ответить]  
  • +/
    > Но факт - одно исключение и
    > все ваши маллоки, хоть и проверками, хоть без - останутся без
    > free.

    что совершеннейшим образом не важно, потому что для парзера всё равно удобней применять zone allocator. и выкидывать потом всю зону целиком.

     

  • 1.4, Аноним (-), 10:39, 13/12/2012 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    nemerle peg?
     
     
  • 2.24, arisu (ok), 20:50, 20/12/2012 [^] [^^] [^^^] [ответить]  
  • +/
    > nemerle peg?

    мона? нет, благодарствуем, уносите.

     

     Добавить комментарий
    Имя:
    E-Mail:
    Текст:



    Спонсоры:
    Слёрм
    Inferno Solutions
    Hosting by Ihor
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2019 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру