Парсеры деревьев для компиляторов, написанных на C++

Я хотел бы найти генератор синтаксического анализатора дерева, чтобы помочь мне преобразовать AST для компилятора, написанного на C++.

После небольшого исследования я узнал об ANTLR (который может быть нацелен на работу с C, но не с C++). Я также нашел веб-сайт, который предостерегает от использования ANTLR с C++: http://www.bearcave.com/software/antlr/antlr_treeparse.html. Статье также десять лет, так что, возможно, ее жалобы устарели.

В любом случае, я хотел бы знать, есть ли какие-либо альтернативы, или я застрял с использованием ANTLR или написанием своего собственного?

8 ответов

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

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

Синтаксический анализ дерева позволяет вам выполнять преобразования на деревьях AST - что, как я уверен, вы знаете, весьма полезно. Единственный синтаксический анализатор дерева c / C++, о котором я слышал, это iBurg. Я не использовал его, и я думаю, что анализатор дерева в основном используется в академических кругах. Для большинства приложений, которые я видел, у них есть AST, они выполняют всю свою работу непосредственно на дереве. Это означает, что они также должны сделать свои собственные правила соответствия.

Проверьте библиотеку повышения духа, особенно главу о деревьях разбора и AST.

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

Преобразование дерева намного легче с сопоставлением с образцом.

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

Я только что нашел эту статью под названием "Языковой перевод с использованием PCCTS и C++ (Справочное руководство)": http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.2.9850

(Он ссылается как на ANTLR, так и на Sorcerer, который назывался синтаксическим анализатором дерева ANTLR до того, как он стал ANTLR). Это может быть именно то, что мне нужно.

Если у вас уже есть компилятор и вы хотите использовать библиотеку для просмотра / преобразования вашего AST, я не уверен, сможет ли Antlr справиться с этим или был спроектирован для этого.

При обычном использовании Antlr настройка AST выполняется с помощью Antlr путем определения лексера и парсера. Затем можно определить обходчиков деревьев и преобразований на этом AST.

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

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

И самое лучшее: это бесплатно.:) (это сказало, это помогает купить книгу)

Вы можете использовать ANTLR для генерации кода на C, который затем вызывается из C++. Я думаю, что проблемы могут возникнуть, если вы используете его для генерации самого кода C++. Даже там, где я действительно не знаю каких-либо конкретных проблем, мы используем ANTLR для генерации кода C++ без каких-либо проблем.

Другие вопросы по тегам