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

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

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

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

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

Вы знаете о подобных проектах? И если бы Вы попытались сделать так, какие инструменты Вы использовали бы? Каковы были бы основные ловушки? У Вас были бы рекомендации с точки зрения синтаксиса?

6
задан PierreBdR 6 May 2010 в 09:07
поделиться

5 ответов

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

https://wiki.mozilla.org/Pork

2
ответ дан 17 December 2019 в 07:01
поделиться

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

0
ответ дан 17 December 2019 в 07:01
поделиться

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

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

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

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

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

0
ответ дан 17 December 2019 в 07:01
поделиться

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

-1
ответ дан 17 December 2019 в 07:01
поделиться

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

Обычно это называется DSEL для Domain Specific Embedded Language. Например, вы можете посмотреть синтаксис Boost.Spirit или Boost.rdb (в хранилище boost).

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

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

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

3
ответ дан 17 December 2019 в 07:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: