Yacc все еще используется в промышленности? - PullRequest
19 голосов
/ 02 декабря 2008

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

Мой вопрос, достаточно ли новых проектов, в которых все еще используется yacc, чтобы гарантировать время, которое мне понадобится для изучения?

Изменить: Учитывая, что ответ в основном в пользу изучения Yacc, есть ли подобный язык, который вы бы порекомендовали по сравнению с yacc?

Ответы [ 8 ]

30 голосов
/ 02 декабря 2008

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

В течение многих лет де-факто инструментом для генерации кода для разбора грамматики был yacc или его двоюродный брат GNU bison.

В последнее время я слышал, что в блоке есть пара новых детей, но принцип тот же: вы пишете декларативную грамматику в формате, более или менее в форме Бэкуса-Наура ( BNF *) 1006 *) и yacc / bison / what генерирует для вас код, который было бы крайне утомительно писать вручную.

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

edit: Учитывая ваш дополнительный вопрос о других инструментах, Yacc / Bison, конечно, лучше всего подходят для проектов на C / C ++, поскольку они генерируют C-код. Есть похожие инструменты для других языков. Не все грамматики эквивалентны, и некоторые генераторы синтаксических анализаторов могут использовать только грамматики определенной сложности. Поэтому вам может понадобиться инструмент, который сможет разобрать вашу грамматику. См http://en.wikipedia.org/wiki/Comparison_of_parser_generators

6 голосов
/ 02 декабря 2008

Я не знаю о новых проектах, использующих его, но я участвую в семи различных работах по техническому обслуживанию, которые используют lex и yacc для обработки файлов конфигурации.

Для меня нет XML, нет-сэр: -).

Решения, использующие lex / yacc, являются шагом вперед по сравнению со старыми конфигурационными файлами из key=val строк, поскольку они допускают более совершенные иерархические структуры, такие как:

server = "mercury" {
    ip = "172.3.5.13"
    gateway = "172.3.5.1"
}
server = "venus" {
    ip = "172.3.5.21"
    gateway = "172.3.5.1"
}

И, да, я знаю, что вы можете сделать это с XML, но это в основном устаревшие приложения, написанные на C, и, если честно, я бы, вероятно, использовал lex / yacc и для новых (не Java) заданий.

Это потому, что я предпочитаю поставлять программное обеспечение вовремя и по бюджету, а не предлагать новейшие технологии с быстрой отдачей - мои клиенты не будут платить за мое образование, они в первую очередь хотят результатов, а я уже эксперт в lex / yacc и иметь весь код шаблона, чтобы сделать это быстро.

3 голосов
/ 02 декабря 2008

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

Если вы совершенно не знакомы с темой генераторов синтаксических анализаторов, я бы посоветовал вам узнать об одном, любом. Многие понятия переносимы между ними. Кроме того, это полезный инструмент, чтобы иметь в виду: как только вы его узнаете, вы поймете, как часто они могут быть лучше, чем парсеры, написанные с использованием регулярных выражений. Если вы уже знакомы с темой парсеров, я бы об этом не беспокоился. Вы узнаете yacc, если и когда вам нужно, чтобы что-то сделать.

3 голосов
/ 02 декабря 2008

Общее правило: код длится долго, поэтому технологии, используемые в этом коде, тоже долго работают. Для замены упомянутой вами кодовой базы потребуется огромное количество времени (на ее создание ушло 15 лет ...), что, в свою очередь, означает, что она будет существовать через 5, 10 или более лет. (Есть даже шанс, что кто-то, кто читает этот ответ, в конечном итоге будет работать над ним!)

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

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

2 голосов
/ 02 декабря 2008

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

Еще одним плюсом ANTLR является ANTLRWorks: среда разработки графического интерфейса ANTLR , которая очень помогает при разработке и отладке ваших грамматик. Я еще не видел другую систему синтаксического анализа, которая поддерживается такой IDE.

2 голосов
/ 02 декабря 2008

Я не знаю конкретно о yacc / bison, но я использовал antlr, cup, jlex и javacc. Я думал, что они будут иметь только академическое значение, но, как оказалось, нам нужен специфичный для предметной области язык, и это дало нам гораздо более приятное решение, чем некоторые «более простые» (основанные на регулярных выражениях) парсеры. Однако обслуживание может быть проблемой во многих средах - поскольку большинство программистов в наши дни не имеют опыта работы с инструментами синтаксического анализа.

2 голосов
/ 02 декабря 2008

Я работаю над проектами, которые используют Yacc. Не новый код - но если бы они были новыми, они все равно использовали бы Yacc или близкого родственника (Bison, Byacc, ...).

Да, я считаю, что стоит учиться, если вы работаете в C.

Также рассмотрите возможность изучения ANTLR или других более современных генераторов синтаксического анализатора. Но знание Yacc поможет вам в этом - вы научитесь и другим подобным инструментам, поскольку многие базовые теории похожи.

1 голос
/ 09 февраля 2010

Мы пишем новый код yacc в моей компании для доставки продукции. Да, этот материал все еще используется.

...