Парсеры деревьев для компиляторов, написанных на C ++ - PullRequest
2 голосов
/ 04 июня 2009

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

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

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

Ответы [ 8 ]

4 голосов
/ 04 июня 2009

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

3 голосов
/ 04 июня 2009

Ознакомьтесь с библиотекой spirit boost , особенно с главой о деревьях разбора и AST .

3 голосов
/ 04 июня 2009

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

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

2 голосов
/ 11 июня 2009

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

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

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

1 голос
/ 11 июня 2009

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

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

1 голос
/ 04 июня 2009

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

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

И самое приятное: это бесплатно. :) (как говорится, это помогает купить книгу )

1 голос
/ 04 июня 2009

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

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

0 голосов
/ 04 июня 2009

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

...