C++, каково преимущество закона и бизона к самодельному токенизатору / синтаксический анализатор

Я хотел бы сделать некоторый парсинг и маркирование в C++ для изучения целей. Теперь я часто времена сталкивался с bison/yacc и законом при чтении об этом предмете онлайн. Там было бы любое преимущество мэра использования людей старше, например, токенизатора/синтаксического анализатора записанное использование STL или повышение:: regex или возможно даже просто C?

7
задан moka 13 July 2010 в 14:48
поделиться

4 ответа

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

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

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

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

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

13
ответ дан 6 December 2019 в 10:47
поделиться

Кто-то уже написал и ОТЛАДАЛ их для вас?

4
ответ дан 6 December 2019 в 10:47
поделиться

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

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

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

1
ответ дан 6 December 2019 в 10:47
поделиться

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

0
ответ дан 6 December 2019 в 10:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: