问题标签 [dsl]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
2310 浏览

c# - DSL:从 DSL 规则到 C# 表达式

问题可能是复合的,让我扩展它:

  • 是否存在设计器(存根/框架/元设计器)来创建基于 .NET 对象公共 bool 属性的基于 AND/OR 的规则?保存为任何 DSL/Boo/... 输出。
  • 是否可以将DSL 输出编译为 C#表达式?

我们的主要问题是文档和代码之间的差距。我们的产品基于数百个用户定义的规则,我们希望加快变更请求。

如果我们能够为用户提供一个简单的设计器并获取输出,那么在将其翻译/编译成 C#/IL 代码之后,我们就有了一个快速的更改请求周期。

我知道我们的问题很具体,但欢迎任何“墙砖”!

示例

AC# 类,主题:

在设计师中,我们应该能够创造

  • 任何类型的图形设计师(即下拉选择公共属性)

DSL 中的输出:

C# 中的输出:

更新#1

我会很高兴支持使用静态类型的 .NET 类的 DSL 语言。我的意思是如果用户可以检查代码(示例中的“输出 DSL”),我们不需要设计器。

更新#2

根据tipp,我盯着表情树。几天后,我遇到了 DLinq——我从来都不是 DLinq 的忠实粉丝,但在这种情况下,我非常适合问题域。

  • 易于将(A > 2 AND B < 4) OR C = 5解析为表达式树
  • 轻松创建这样的表达式
  • 非常容易序列化/反序列化
  • 基于 FlowLayoutPanel 的 GUI 可以很好地作为“表达式生成器”
0 投票
2 回答
243 浏览

visual-studio - 文本模板调用其他模板并保留现有代码

我刚刚开始使用 Visual Studio 从 DSL 生成代码,并且正在寻求有关如何让一个模板调用多个子模板的帮助。

我还想知道是否有任何合并功能可以在您对模型进行更改时轻松重新生成代码而不会丢失任何已添加的代码。

0 投票
6 回答
921 浏览

parsing - 可组合语法

有很多编程语言支持包含迷你语言。PHP 嵌入在 HTML 中。XML 可以嵌入到 JavaScript 中。Linq 可以嵌入到 C# 中。正则表达式可以嵌入到 Perl 中。

想一想,大多数编程语言都可以建模为不同的迷你语言。例如,Java 可以分解为至少四种不同的迷你语言:

  • 类型声明语言(包指令、导入指令、类声明)
  • 成员声明语言(访问修饰符、方法声明、成员变量)
  • 语句语言(控制流、顺序执行)
  • 一种表达式语言(文字、赋值、比较、算术)

能够将这四种概念语言实现为四种不同的语法肯定会减少我通常在复杂的解析器和编译器实现中看到的许多意大利面。

我之前已经为各种不同类型的语言实现了解析器(使用 ANTLR、JavaCC 和自定义递归下降解析器),当语言变得非常庞大和复杂时,您通常会得到一种 huuuuuuge 语法,并且解析器实现得到真的很丑真的很快。

理想情况下,当为其中一种语言编写解析器时,最好将其实现为可组合解析器的集合,在它们之间来回传递控制。

棘手的是,包含语言(例如,Perl)通常会为包含的语言(例如,正则表达式)定义自己的终点哨兵。这是一个很好的例子:

在这段代码中,主要的 perl 代码定义了一个非标准的终点“|” 对于正则表达式。实现与 perl 解析器完全不同的正则表达式解析器将非常困难,因为正则表达式解析器不知道如何在不咨询父解析器的情况下找到表达式终点。

或者,假设我有一种语言允许包含 Linq 表达式,但不是以分号结尾(如 C# 那样),我想强制 Linq 表达式出现在方括号内:

如果我在父语言语法中定义了 Linq 语法,我可以轻松地为“LinqExpression”编写一个明确的产生式,使用语法前瞻来查找括号包围。但是我的父语法必须吸收整个 Linq 规范。这是一个拖累。另一方面,一个单独的子 Linq 解析器将很难确定在哪里停止,因为它需要为外来标记类型实现前瞻。

这几乎可以排除使用单独的词法分析/解析阶段,因为 Linq 解析器将定义一组与父解析器完全不同的标记化规则。如果您一次扫描一个标记,您怎么知道何时将控制权交还给母语的词法分析器?

你们有什么感想?当今可用于实现不同的、解耦的和可组合的语言语法以将迷你语言包含在更大的父语言中的最佳技术是什么?

0 投票
2 回答
669 浏览

dsl - 哪一个更适合 UI 或 DSL?

我们有一个系统,它的行为由许多 XML 文件定义。(大约 50 个不同的 XML 文件,每个文件控制子系统的行为。)

由于遗留原因,XML 文件采用自定义格式,便于系统中的各种组件使用。

自定义格式对人类来说不是很直观和可读。(这对我们来说也是一个重要的考虑因素)。

那么我们如何解决这个可读性问题呢?

我觉得在这些 XML 文件之上编写的直观 UI 应该可以完成这项工作。

然而,我的同事认为用 DSL 替换 XML 文件是一个更好的主意,因为它们既直观又机器可读。

这是个好主意还是矫枉过正?我觉得与说 UI 相比,正确地实现 DSL 是非常困难的。但我可能是错的。

任何帮助将不胜感激。谢谢。

0 投票
2 回答
313 浏览

ruby - 我需要手动构建 Ruby DSL 的哪些部分?

如果我想在 Ruby 1.9 或 JRuby 中构建 DSL,我是否需要手动完成以下任何阶段:

  • 乐行
  • 解释
  • 解析
  • 即时编译

显然,作为一名程序员,我不喜欢尽可能多地编写实际代码,所以我希望这些步骤都不需要手工劳动:)

0 投票
3 回答
532 浏览

dsl - 用于互联网广告的小型定制 DSL 的示例是什么?

我只是在学习 DSL,我试图将它们放在我能理解的上下文中。

例如,假设我们正在谈论互联网广告 - 因为这是我想工作的领域 - 你可能构建的小型自定义 DSL 的例子是什么?

此外,您需要哪些高级技术步骤来实现这一点?

0 投票
1 回答
310 浏览

java - 数据库行中的公式 - Java

要么这个要求很奇怪,要么我应该让自己太困惑我有一个包含 30 列的规则表。提要文件中的每一行都会根据提要类型与部分或所有条件进行比较。域是银行业务,应用程序用于贷款报告(例如,报告有担保贷款和无担保贷款的总额)

这是我的问题:

我有大约 5 个这样的场景(应该是可定制的)用户(例如,如果抵押品是现金/股票,那么只考虑现金抵押品/股票抵押品)。

可能会出现更多这种情况。我不确定我应该如何解决这个问题。我的计划是在规则表中创建一个列,并在其中包含一些预先格式化的简单英语条件(记录并教授用户),使用正则表达式解析它们,然后将其转换为数字。我对 DSL 没有知识/经验,这是最好的??!!我能想到的。任何帮助对我来说都是重要的知识来源。谢谢。阿伦

0 投票
6 回答
7451 浏览

project-management - 我什么时候应该使用特定领域的语言?

我想要一些关于何时应该使用Domain Specific Language的实用指导。我找到了有关优缺点的资源,但什么样的项目值得使用?

创建和维护 DSL 似乎需要大量时间投资,那么在哪些应用程序空间中,我的时间投资可以获得生产力回报?

编辑:似乎 DSL 最常见的用途是用于持久化数据状态的文件格式,那么将 DSL 用于程序逻辑和结构(可能是代码生成)呢?这什么时候可行?

编辑#2我主要询问何时创建一个特定的 DSL 是值得的。当然,我们应该尽可能地使用现有的 DSL 以节省时间。

0 投票
1 回答
292 浏览

visual-studio - 将菜单项添加到 VS2008 DSL 中的上下文菜单

我目前正在尝试为我工作的公司创建一个双向 DSL,并希望在图表中添加一个上下文菜单,以便为用户提供一种请求代码导入的机制。我知道在 VS2005 中使用 Commands.ctc 文件来实现这一点,而 2008 似乎正在使用 Commands.ctc。然而,试图找出它是如何工作的并不是很容易。

0 投票
16 回答
3539 浏览

dsl - 成功的领域特定语言 ? 你用哪一个?

我对领域特定语言的设计和实现感兴趣。我知道的大部分 DSL 都来自学术界。

你能给我一些关于工业中实际使用的 DSL 的建议吗?并且你每天都在使用……真的很方便……

(我也对声明性语言感兴趣,但不是真正基于 xml 的语言......)......

我想建立一个(非详尽的)行业部署语言列表......我知道这是巨大的......

有时,我使用通用语言来实现可以使用 DSL 轻松完成的事情。

编辑 我主要对面向应用程序的 DSL 感兴趣,而不是小型嵌入式语言。例如,SQL 匹配我正在寻找的内容,但嵌入在 java 中的 SQL 对我不感兴趣。我正在寻找的另一种语言示例是 X#