问题标签 [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.
java - 哪个面向 Java 的词法分析器用于简单项目(ANTLR、DIY 等)
我正在开发一个小型文本编辑器项目,并希望为几种语言(Java、XML ..仅举几例)添加基本的语法突出显示。作为学习经验,我想添加一个流行或不流行的 Java 词法分析器。
你推荐什么项目。Antlr 可能是最知名的,但它看起来相当复杂和沉重。
这是我知道的选项。
- 蚂蚁
- Ragel(是的,它可以生成用于处理输入的 Java 源代码)
- 自己做(我想我可以编写一个简单的令牌解析器并突出显示源代码)。
java - 想法:在 Java 中嵌入数据/DSLs 作为注释并使用 APT 生成 Java 代码
我有一个想法,我想由你运行它以获得一些反馈。请仔细阅读以下内容,让我知道您的想法,无论是积极的还是消极的。
我一直希望有一种方法可以在 Java 代码中嵌入某些数据,而不必一直遵循 Java 的规则。我最近听到了很多关于领域特定语言 (DSL) 的讨论,如果我们能够每天更多地使用它们会是多么棒。我想我知道如何以一种相当优雅的方式做到这一点。
以下是我所知道的一些事情的例子,这些事情很难用 Java 代码(和其他类似 C 的语言)来表示,我希望它能够解决:
作为字符串数组的短字符串列表
长字符串列表作为字符串数组
字符串表作为多维字符串数组:
键值对列表
HTML 代码单字符串
具有良好文本格式的 HTML 文本块
我对以下描述的解决方案进行了一些调查,我相信可以创建一个可用的库,让您可以优雅地实现这一目标。在 Java 5 和 6 中,有一个叫做注解处理器工具 (APT) 的东西(与 Debian APT 不同)。您创建自己的源代码处理器,在编译代码时将调用该处理器,以便您有机会重写源代码。重写代码后,它像往常一样编译。
要使用 APT,必须执行以下操作: 1. 将此库的 jar 放在 ANT 类路径中。2. 把这个库的jar 放到项目的classpath 上。3.调用apt任务而不是javac并添加preprocessdir参数指定生成的文件必须放在哪里。
DSL 代码可以放在将放置代码结果的变量之后的注释中。当处理器运行时,它可以在代码中查找下一条注释,提取代码,通过处理器运行,生成代码并进行编译。
这是列表,这次是它的样子:
作为字符串数组的短字符串列表
长字符串列表作为字符串数组
字符串表作为多维字符串数组或 JTable:
键值对列表
HTML 代码单字符串
具有良好文本格式的 HTML 文本块
我可以为此解决方案想到的一些要求/功能:
您必须声明该变量以保存脚本将在 Java 源代码中生成的数据。这允许其余的源代码知道结果数据,即使编译器不知道它来自哪里。
- 不得违反 Java 语言,以便 IDE 和 javac 不显示错误。
- 使用您拥有的所有现有 Java 代码。无需替换任何现有代码。只需将这些片段添加到您喜欢的任何地方。
- 必须易于使用其他类型进行扩展。
- 以后必须能够对允许源代码突出显示和自动完成的 IDE 进行扩展。
- 翻译发生在编译时,因此必须生成有效的 Java 代码。
- 将列表、多行文本块(如 CSS、SQL)转换为 String 和 String[]
- 转换和编码 XML、HTML
- 重写代码时保留相同的行号。不要添加任何行,以免调试和读取错误成为痛苦。
- 在运行时运行以任何 BSF 语言编写的代码。允许它向脚本传递任何参数并将任何 Java 类或原语返回给 Java。
- 在编译时运行以任何 BSF 语言编写的代码以生成 Java 源代码。类似于在 Linux 上使用 M4 的方式。
- 稍后:允许您将多次调用的字符串结果链接在一起,以构建一个长字符串。有些可能是编译时的,有些可能是运行时的。
再一次,我真的很感激能得到一些反馈。这是一个愚蠢的想法吗?那里已经有类似的东西了吗?你会打扰使用这样的东西还是我应该把它留给自己?
c# - 使用 DSL 生成 C# 代码
目前我正在使用的项目没有完全固定的模型(由于外部影响),因此我希望在编写它们时有一些灵活性。目前,它们在应用程序的三个不同层(db、web api 和客户端)中复制,并且每个层都有相似的逻辑(即验证)。
我想知道是否有一种方法可以让我编写模型文件(比如在 ruby 中),然后让它将该模型转换为必要的 c# 文件。目前,我似乎只是在编写许多可能在任何阶段发生变化的样板代码,而这种生成的方法将使我能够专注于更重要的事情。
有没有人推荐这样的东西,我可以用的 dsl/语言,有没有人有这样的经验?
serialization - 支持序列化协程的语言
我认为当前语言中不存在这种支持。我认为我想做的事情可以通过“工作流引擎”来解决。但是我对工作流程的问题通常是:
- 声明式/冗长,我发现命令式风格更简洁
- 重量级,我会有很多简单但多样的小状态机
我已经研究了 C# 中的序列化迭代器,但这并没有让我得到我想要的确切位置。我目前正在考虑在Boo中组合一个 DSL,但不确定我是否能够在 Boo 中获得类似协程的行为,并且也能够对其进行序列化。
例子
这是我想做的有限的虚构示例。主要问题是,在例程中的任何时候,您都可能需要获取用户输入。输入之间的时间可能很长,因此需要将服务状态序列化到磁盘。
更新
我在 CPython 中有一个工作的“引擎”。它搭载了 python 中的迭代器/产量支持。所以代码看起来像这样:
哪里rollDice
可以打断。通过一些用户操作。然而, CPython不会序列化迭代器。
由于游戏的整个状态可以定义为一系列命令,因此我将游戏状态序列化到协程开始的位置,然后是剩余的命令列表。所以保存/恢复看起来像这样:
目前的调查
我仍然觉得这不令人满意。因为我最终不得不在几乎每种方法上都使用“yield”。我宁愿不必专门装饰一个方法。它在序列化方面也很失败。
目前我正在研究走函数式路线,因为函数式语言似乎对元编程/DSL 创建有更好的支持。目前在看
- F# 计算表达式
- 哈斯克尔
我希望通过足够强大的元编程设施,我可以自动化状态存储机制。另外,如果我走 F# 路线,我很确定我可以依靠我用来序列化迭代器的“技术”/(hack) 。
c# - DSL 与方法调用:优缺点
我必须使用一个相当特殊的数据源(实际上是会计应用程序的接口)。虽然它非常强大,但我必须跳过很多圈才能从中获取我想要的数据。例如,如果我想获取一个表的内容并指定它应该返回哪些列,我必须遍历 .Columns 集合并将 .SetVisible() 调用到我想要的那些。
目前我们有一个方法可以包装这个并允许我们以更简单的方式指定事物,但是该函数的参数列表正在快速增长,并且大多数时候我们只需要在调用它时指定其中的几个. 简而言之 - 这是一个不灵活的解决方案。
我想到的第一个解决方案是这样的:
Criteria、Filters 和 ReportParams 是特定于应用程序的一些东西,我不会在这里讨论它们。但总体思路是这样的。它实际上类似于调用方法,除了您可以选择要指定的参数(通过调用特定方法)并获得更多 IntelliSense 帮助。您还可以使用方法调用的顺序。
请注意,SetFilter()
有一个要解析的表达式。这是 DataSource 造成困难的另一件事 - 它可以很好地处理表达式,但是您必须将它们作为特殊对象树传递,这又是相当冗长的编写。在上一个问题中,我寻求有关解析此类表达式的帮助。当前的 wrapper-method 有一个自制的表达式解析器,它可以解析简单的表达式,但我想使对它们的支持更完整。
在那个问题中,提出了Irony项目。看完之后,我认为它确实适合这种需求。但过了一会儿,我突然意识到,它比那更强大。为什么不让我自己的查询语言完全适合这个任务呢?上面的内容看起来像:
但是……这不是矫枉过正吗?两种方法的优缺点是什么?我看到的是:
专业 DSL:
- 查询更简洁;
专业方法:
- 更多智能感知支持;
- 方法名称/参数名称(和注释)减少了对文档的需求(必须彻底记录 DSL);
- 可能会更快创建?我从来没有创建过自己的 DSL,所以我不知道有多少工作量。讽刺似乎从我肩上卸下了很多担子,但还剩下多少呢?
补充:为了澄清,这两种方法都只能由编码人员使用。外部人员和业务分析师不会使用它。
c# - YAML 作为 .NET (C#) 中的数据 DSL
有人在 .NET 中使用 YAML 作为数据 DSL 吗?我想使用 YAML,因为它比 XML 更轻量级。我打算将此 DSL 用作我现有应用程序之一的“高级用户”配置工具。
我的担忧:
- 使用 .NET 社区库之一对 YAML 的支持如何?
- YAML 有持久力吗?4年后还会有吗?或者我们会谈论其他格式吗?我知道 JSON 和 XML 将会出现一段时间,但我的用户不想编写或维护 JSON 或 XML 文档。
visual-studio - 卸载/安装新软件包版本后未更新 Visual Studio 隔离外壳工具箱
我正在开发一个包含许多工具栏项的 DSL 包。如果我在 DSL 资源管理器中添加新的工具栏项,则将新包安装到 Visual Studio 隔离外壳中,则不会出现新项。我首先在虚拟机上通过安装包的第一个版本、卸载它然后安装更新版本来测试它。即使正在安装新版本的 DSL 包程序集,系统似乎也在以某种方式缓存旧的工具栏设置等。
任何想法为什么旧工具栏项目出现而新工具栏项目不出现?
c++ - 编写一个简单的解析器
我需要为一种领域特定语言编写一个简单的解析器。
它需要具有适当的运算符评估顺序的基本算术和调用可以重载的底层环境函数的语法。
编写这样一个解析器的最简单方法是什么?有什么东西我可以开箱即用地适应或使用吗?我正在用 C++ 编写。
php - PHP 文本解析和/或制作自己的语言?
一直在谷歌搜索而没有找到太多东西,所以有没有人知道一个类或库可以帮助你解析任何类型的语言,比如域特定语言(我正在创建一个,所以我在语法和格式方面很灵活可以)进入PHP代码或一些有用的结构或类层次结构或......?在这一点上任何事情都会发生。:)
我想尝试将文本文件解析为标记,构建一个小的语法和语法库来表达诸如Business Natural Languages之类的东西。
terminology - 什么是领域特定语言?有人用吗?以什么方式?
我想我正在寻找某种介绍,看看是否有人使用过它。使用它有什么特别的好处吗?
维基百科:
领域特定语言 (DSL)是专用于特定问题域、特定问题表示技术和/或特定解决方案技术的编程语言或规范语言。
任何人都可以给出任何具体的例子来说明你是如何实现它的,或者它在给定的场景中是如何有用的?