Частично анализировать C++ для предметно-ориентированного языка

Я хотел бы создать предметно-ориентированный язык как расширенный язык C++. Мне понадобятся в основном два типа конструкций:

  • Конструкции верхнего уровня для специализированных типов или объявлений
  • Конструкции в коде, то есть добавление примитивов для упрощения вызовов функций или идиом.

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

Предыдущая попытка использовать flex и bison не удалась из-за сложности синтаксиса C++. Существующий синтаксический анализатор все еще может дать сбой в некоторых конструкциях. Итак, мы хотим начать все сначала, но на лучших основаниях.

Знаете ли вы о подобных проектах? И если бы вы попытались это сделать, какие инструменты вы бы использовали? Какие могут быть основные подводные камни? У вас есть рекомендации по синтаксису?


person PierreBdR    schedule 06.05.2010    source источник
comment
Вы можете проверить, достаточно ли хороша для вас текущая поддержка C++ Clangs — их API выглядит многообещающим и должен быть расширяемым.   -  person Georg Fritzsche    schedule 06.05.2010


Ответы (5)


Есть много (умных) попыток использовать предметно-ориентированные языки в языке C++.

Обычно он называется DSEL для специального встроенного языка. Например, вы можете найти синтаксис Boost.Spirit или Boost.rdb (в хранилище повышения).

Это полностью совместимые библиотеки C++, использующие синтаксис C++.

Если вы хотите скрыть некоторую сложность, вы можете добавить несколько макросов.

Я был бы рад предоставить несколько примеров, если бы вы дали нам что-то для работы :)

person Matthieu M.    schedule 06.05.2010

Вы можете попробовать расширить парсер Elsa C++ с открытым исходным кодом (теперь он является частью проекта Mozilla Pork):

https://wiki.mozilla.org/Pork

person SK-logic    schedule 06.05.2010

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

person Community    schedule 06.05.2010
comment
Я знаю, и это то, с чего я начал. Но результат все еще выглядит довольно пугающим для программистов, не использующих C++. Вот почему я хочу теперь добавить тонкий слой выше C++, чтобы сделать вещи более читабельными (например, избежать сложных шаблонов, добавить несколько идиоматических конструкций, которые часто встречаются в коде, или заменить некоторые функции, вызываемые ключевыми словами, чтобы обеспечить более приятный вид). синтаксис). - person PierreBdR; 06.05.2010
comment
Это не совсем так. Некоторые из лучших проектов на основе C++ содержат расширенные DSL C++. Вот некоторые из них: препроцессор MOC в Qt, tablegen DSL в LLVM. - person SK-logic; 06.05.2010

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

Наш DMS Software Reengineering Toolkit представляет собой инфраструктуру для реализации языковых процессоров. Он предназначен для поддержки создания инструментов, которые анализируют языки, выполняют преобразования и выдают тот же язык (с расширенным кодом) или другой язык/диалект.

DMS имеет полный интерфейс C++, который анализирует C++, строит абстрактные синтаксические деревья. и таблицы символов (например, все эти имена и разрешения типов).

Внешний интерфейс DMS/C++ поставляется с DMS в исходном виде, поэтому его можно настроить для достижения желаемого эффекта. Вы бы определили свой DSL как расширение внешнего интерфейса C++, а затем написали преобразования, которые преобразуют ваши специальные конструкции в «ванильные» конструкции C++, а затем выдали бы компилируемый результат.

DMS/C++ использовались для самых разных задач преобразования, включая те, которые включали расширение C++, как вы описали, и включая задачи, выполняющие масштабную реорганизацию больших приложений C++. (См. публикации на этом веб-сайте).

person Ira Baxter    schedule 06.05.2010
comment
«Если вы действительно хотите расширить C++, вам понадобится полный синтаксический анализатор C++ плюс разрешение имени и типа» — нет, не обязательно. Достаточно разобрать дополненные конструкции. Конечно, для этого нужно не задыхаться от остального кода, но это не влечет за собой наличие полноценного синтаксического анализатора. - person Konrad Rudolph; 06.05.2010
comment
На самом деле можно найти достаточно тривиальные расширения, поэтому на самом деле вы можете сделать это только с помощью взлома Perl и регулярных выражений. На практике довольно сложно найти интересные расширения для C++ (такие как специализированные типы и объявления OP), которые позволят вам обойтись простым синтаксическим анализом, особенно если написание такого объявления может повлиять на другие части кода. Даже в этом случае синтаксический анализ покажется вам сложной задачей; если вы попытаетесь выполнить синтаксический анализ без имени и разрешения типа, вам придется сохранить все неоднозначные синтаксические анализы. - person Ira Baxter; 06.05.2010
comment
Это выглядит очень хорошо, но, к сожалению, это работает только для Windows, которую я не использую. - person PierreBdR; 06.05.2010
comment
Удачи. Эти звери довольно редки. Вы можете проверить EDG, но синтаксический анализатор реализован вручную, что сделает его расширение намного сложнее, чем просто добавление дополнительных правил грамматики, и вам придется самостоятельно создавать всю эту инфраструктуру поддержки преобразования. Вы, вероятно, обнаружите, что он имеет тот же масштаб, что и механизм синтаксического анализа C++. - person Ira Baxter; 06.05.2010

Чтобы решить вашу первую пулю, возможно, вы можете использовать новые функции С++ 0x «списки инициализаторов» и «определяемые пользователем литералы», избегая необходимости в новом парсере. Они могут помочь и для второй пули.

person Didier Trosset    schedule 06.05.2010