C ++ в чем преимущество lex и bison перед самодельным токенизатором / парсером - PullRequest
7 голосов
/ 13 июля 2010

Я хотел бы сделать несколько разборов и токенизации в c ++ для целей обучения.Теперь я часто сталкивался с бизонами / yacc и lex, когда читал эту тему в Интернете.Будет ли какая-то польза от мэров, если использовать их, например, для токенизатора / парсера, написанного с использованием STL или boost :: regex, или, может быть, даже просто C?

Ответы [ 4 ]

13 голосов
/ 13 июля 2010

Я недавно взялся за написание простого лексера и парсера.

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

Привлекательность создания инструментов для лексеров и синтаксических анализаторов заключается в том, что вы можете написать спецификацию на чистом, удобном для чтения языке, который приближается к кратчайшему возможному воспроизведению вашей спецификации. Рукописный парсер обычно как минимум вдвое больше. Кроме того, автоматический синтаксический анализатор (/ lexer) поставляется с большим количеством диагностического кода и логики, чтобы помочь вам отладить объект.

Спецификацию синтаксического анализатора / лексера в BNF-подобном языке также намного легче изменить, если ваш язык или требования изменятся. Если вы имеете дело с рукописным синтаксическим анализатором / лексером, вам может потребоваться углубиться в ваш код и внести значительные изменения.

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

4 голосов
/ 13 июля 2010

Кто-то еще написал и отладил их для вас?

1 голос
/ 13 июля 2010

Это проще, и они более общие. Bison / Lex может тонкенизировать и анализировать произвольную грамматику и представлять ее в более удобном формате. Они также могут быть быстрее, в зависимости от того, насколько хорошо вы написали свое регулярное выражение.

Я бы не хотел писать свой собственный синтаксический анализатор на C, поскольку у языка нет особой интуиции в отношении строк. Если вы пишете свой собственный, я бы порекомендовал Perl для простоты регулярных выражений (или, возможно, Python).

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

0 голосов
/ 13 июля 2010

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

...