Есть ли какие-нибудь книги / статьи по DSL Design? (не реализация DSL)

Мне нужно создать DSL для непрограммистов (клиентов нашей компании), который должен предоставлять некоторые языковые функции более высокого уровня (циклы, условные выражения, переменные ... - так что это не просто "простой" DSL) .

Работа с DSL должна быть простой; люди должны иметь возможность экспериментировать с этим и изучать это, играя. Мы хотим добиться чего-то похожего на макросы в Microsoft Excel - многие пользователи Excel могут создавать простые формулы, суммы или вычисления и никогда не работали с «настоящим» (универсальным) языком программирования.

Очевидно, что не каждый пользователь Excel понимает более сложные встроенные методы (например, When ()), но они могут использовать простые методы, такие как SUM () или AVG (). Я хочу добиться аналогичного эффекта с DSL - пользователи должны иметь возможность интуитивно работать с ним и определять простые правила или выполнять простые вычисления. В то же время DSL должен предлагать функции более высокого уровня для более технически подкованных - например, циклы, операторы if, возможно, методы или лямбда-выражения.

И это подводит меня к моему (-ым) вопросу (-ам): Какие языковые конструкции интуитивно понятны, просты в изучении и понимании?

В текущей экспериментальной версии DSL мы опробовали метод цепочки методов, например : list.where (item -> item.value> 5) .select (item -> item.name + "" + item.value) ). Подумайте о , где и select as foreach конструкции, где item - это переменная, которая представляет текущий элемент в цикле.

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

Будет ли пользователям проще / удобнее читать без фигурных скобок? (как в LINQ: из элемента в списке, где item.value> 5 выберите item.name + "" + item.value ). Однако в этом случае нет «границ» - в предыдущем примере пользователь знает, что оператор заканчивается последней закрывающей фигурной скобкой - в этом случае, если он вводит дополнительный код после части select оператор, он не знает, принадлежит ли он этому оператору или нет (кроме того факта, что синтаксический анализатор тоже не знает, и должно быть какое-то закрытие).

Надеюсь, с этими двумя примерами мой вопрос будет немного яснее - я ищу руководств по дизайну, передовые методы, реальный опыт , возможно, исследовательские материалы на каком языке конструкции благоприятны для других - или некоторая оценка плюсов и минусов определенных языковых конструкций.

Я не ищу информации о том, как создать DSL, какие генераторы парсеров я мог бы использовать и т. Д., И я также не могу использовать существующий язык общего назначения (Ruby, Python, ...) вместо этого из-за способа использования DSL. (DSL при синтаксическом анализе работает напрямую с нашей объектной моделью - я не буду здесь вдаваться в подробности, поскольку этот вопрос и так уже достаточно длинный).

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

13
задан enzi 10 November 2011 в 21:25
поделиться