C ++ создать синтаксический анализатор [закрыт]

StackOverflow https://stackoverflow.com/questions/1843502

  •  12-09-2019
  •  | 
  •  

Вопрос

Каков наилучший способ создать синтаксический анализатор на C ++ из файла с грамматикой?

Это было полезно?

Решение

  • Я бы предложил использовать boost.spirit

Вы также можете взглянуть на эти ссылки:

Другие советы

Это сильно зависит от грамматики.Мне больше нравятся анализаторы рекурсивного спуска, которые обычно пишутся вручную (хотя их можно сгенерировать на основе описания грамматики).

Если вы собираетесь использовать генератор синтаксического анализатора, есть два хороших варианта:Бьякк и Антлр.Если вам нужно что-то (достаточно) совместимое с yacc, Byacc (безусловно) ваш лучший выбор.Если вы начинаете с самого начала, не имея ни существующего кода, ни опыта, позволяющего использовать что-то совместимое с yacc, то Antlr почти наверняка будет вашим лучшим выбором.

Раз уж об этом уже упоминалось, я также расскажу немного о Bison.Я бы избегал Бизона, как чумы.Совет Брукса «Запланируйте выбросить один» применим и здесь.Роберт Корбетт (автор Byacc) написал Bison как свою первую попытку создания синтаксического анализатора.К сожалению, он отдал его GNU, а не выбросил.В классическом случае, когда маркетинг превосходит техническое совершенство, Bison широко используется (и даже рекомендуется теми, кто не знает ничего лучше), в то время как Byacc остается относительно малоизвестным.

Редактировать:Ненавижу это делать, но, поскольку об этом тоже упоминалось, я также прокомментирую Boost.spirit.Хотя это, возможно, самый крутой пример метапрограммирования шаблонов, у него есть пара проблем, из-за которых я не рекомендую пытаться использовать его серьезно.

  1. Время компиляции с его помощью может быть мучительным — обычно оно составляет 10 минут, а более крупная/более сложная грамматика может занять еще больше времени (при условии, что это не приведет к сбою компилятора).
  2. Если вы вообще допустите какую-либо ошибку, она может и часто будет выдавать безумно длинные сообщения об ошибках, которые практически невозможно расшифровать.В любом случае сообщения об ошибках в коде с большим количеством шаблонов общеизвестно плохи, и Spirit нагружает систему больше, чем что-либо еще.

Поверьте мне:тот факт, что вы вообще можете написать что-то вроде Spirit, находится на грани между впечатляющим и удивительным - но я все равно использовал бы его только в том случае, если бы был уверен, что грамматика, с которой я имел дело, была (и всегда оставалась) довольно маленький и простой.

Есть гибкий и бизон.Двоюродные братья Lex&Yacc, которые принимают во внимание существование C++.

Вы смотрели на Лекс и Yacc ?Цитирую раздел 5 связанного документа:

Мой предпочтительный способ создать анализатор C ++ - заставить Lex сгенерировать простой файл C и позволить YACC сгенерировать код C ++ .Когда вы затем свяжете свое приложение, вы можете столкнуться с некоторыми проблемами, потому что код C ++ по умолчанию не сможет найти C функции, если вы не сказали ему, что эти функции являются внешними "C".

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

Калькулятор взял, например, 1+2*3 и построил синтаксическое дерево.Однако в документации не описывалось, как построить дерево, и мне потребовалось некоторое время, чтобы разобраться.

Если бы я собирался снова, я бы посмотрел на «antlr», поскольку он выглядел хорошо и имел хорошую поддержку.

Мартин.

Лучший способ создать парсер — использовать lex и yacc.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top