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

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

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

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

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

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

Ответы [ 5 ]

3 голосов
/ 06 мая 2010

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

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

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

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

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

2 голосов
/ 06 мая 2010

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

https://wiki.mozilla.org/Pork

0 голосов
/ 06 мая 2010

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

0 голосов
/ 06 мая 2010

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

0 голосов
/ 06 мая 2010

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

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

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

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

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

...