Я хотел бы создать предметно-ориентированный язык как язык увеличенного C++. Мне будут нужны главным образом два типа конструкций:
Язык будет использоваться в целях научных вычислений и будет в конечном счете переведен в плоскость C++. C++ был выбран, поскольку это, кажется, предлагает хороший компромисс между: простота использования, эффективность и доступность широкого спектра библиотек.
Предыдущая попытка с помощью гибкого провода и бизона перестала работать из-за сложности синтаксиса C++. Существующий синтаксический анализатор может все еще перестать работать на некоторых конструкциях. Таким образом, мы хотим запуститься, но на лучших основаниях.
Вы знаете о подобных проектах? И если бы Вы попытались сделать так, какие инструменты Вы использовали бы? Каковы были бы основные ловушки? У Вас были бы рекомендации с точки зрения синтаксиса?
Вы можете попробовать расширить синтаксический анализатор Elsa C ++ с открытым исходным кодом (теперь он является частью проекта Mozilla Pork):
Способ расширения C++ заключается не в попытке расширить язык, что будет крайне сложно и, вероятно, будет ломаться по мере того, как новые выпуски базового компилятора будут реализовывать новые возможности, а в написании библиотек классов для поддержки вашей проблемной области. Это то, чем занималось программирование на C++ с момента создания языка.
Если вы действительно хотите расширить C ++, вам понадобится полный синтаксический анализатор C ++, а также разрешение имен и типов. Как вы уже выяснили, это довольно сложно. Лучшее решение - получить существующий и изменить его.
Наш DMS Software Reengineering Toolkit представляет собой инфраструктуру для реализации языковых процессоров. Он разработан для поддержки создания инструментов, которые анализируют языки, выполняют преобразования и выводят тот же язык (с расширенным кодом) или другой язык / диалект.
DMS имеет полный C ++ Front End , который анализирует C ++, строит абстрактные синтаксические деревья и таблицы символов (например, все эти вещи, связанные с разрешением имен и типов).
Внешний интерфейс DMS / C ++ поставляется с DMS в исходной форме, поэтому его можно настроить для достижения желаемого эффекта. Вы должны определить свой DSL как расширение внешнего интерфейса C ++, а затем написать преобразования, которые преобразуют ваши специальные конструкции в «ванильные» конструкции C ++, а затем выдать компилируемый результат.
DMS / C ++ использовался для широкого спектра задач преобразования, включая те, которые включали расширение C ++, как вы описали, и в том числе задачи, которые выполняют массовую реорганизацию больших приложений C ++. (См. Публикации на этом сайте).
Чтобы решить первую проблему, возможно, вы можете использовать новые функции C ++ 0x «списки инициализаторов» и «пользовательские списки», избегая необходимости в новый парсер. Они могут помочь и для второй пули.
Есть много (умных) попыток иметь специфические языки в рамках языка C++.
Обычно это называется DSEL для Domain Specific Embedded Language. Например, вы можете посмотреть синтаксис Boost.Spirit
или Boost.rdb
(в хранилище boost).
Это полностью совместимые библиотеки C++, использующие синтаксис C++.
Если вы хотите скрыть некоторую сложность, вы можете добавить несколько макросов.
Я буду рад предоставить несколько примеров, если вы дадите нам что-то для работы :)